ElasticSearch

/ NoSql面试 / 没有评论 / 508浏览

ElasticSearch:是一个基于Lucene的搜索服务器,天然支持分布式,近实时查询

Elasticsearch 的 master 选举流程?

Elasticsearch在满足如下时间点的时候会触发选举
集群启动初始化
集群的Master崩溃的时候
任何一个节点发现当前集群中的Master节点没有得到n/2 + 1节点认可的时候,触发选举

Elasticsearch使用Zookeeper或者内置的Zen Discovery机制来实现主节点(master)选举。在Elasticsearch中,一个集群中的节点被分为两类:主节点(master-eligible nodes)和数据节点(data nodes)。主节点负责集群级别的管理任务,例如索引创建、节点加入/退出等,而数据节点则负责存储和处理数据。

精炼

倒排索引:属性值来确定记录的位置,因而称为倒排索引 倒排表 posting list 压缩算法: 数据表示越大,所占的空间也就越大,以 int 为例 **FOR算法(Frame Of Reference):**核心思想是用减法来削减数值大小,从而达到降低空间存储,存储的是后一位减去前一位的差值,所以稀疏的数组,不适合使用FOR算法

** RBM算法(RoaringBitMap)**:当稀疏的数组 每一项的值都除以 16bit的最大值 65535 得到的余和商作为表示此数据的一个形式,将得到的K-V存入一个数组中,并且源数组为有序数组,高低位16位转换后 商和同商的余都是从小到大排列的

问题收集

1.设计理念

答:ElasticSearch 设计的理念就是分布式搜索引擎,底层其实还是基于 lucene 的。核心思想就是在多台机器上启动多个 es 进程实例,组成了一个 es 集群

3.什么是ES?

答:ES是Elasticsearch的缩写,是一款开源的分布式搜索引擎。它可以快速地存储、搜索和分析大量的数据,支持全文检索、结构化查询等多种查询方式。ES的主要特点是速度快、可扩展、高可用和易于使用。

4.ES的主要用途是什么?

答:ES主要用于建立搜索引擎、日志分析、监控等场景。在搜索引擎领域,ES可以快速地检索海量数据,支持复杂的查询语句和聚合操作。在日志分析领域,ES可以实时地收集、分析和可视化大量的日志数据。在监控领域,ES可以实时地监控系统、网络、服务器等各种指标数据。

5.ES的数据存储方式是什么?

答:ES使用的是倒排索引的方式来存储数据。倒排索引是一种将文档中的单词映射到包含这些单词的文档中的数据结构。它可以快速地定位文档中包含某个单词的位置,从而实现快速的全文检索。

6.ES的数据分片是如何实现的?

答:ES的数据分片是通过将数据分成多个分片来实现的。每个分片都是一个独立的索引,包含部分数据。分片可以在多个节点上分布式存储,提高了数据的可用性和可扩展性。当进行查询时,ES会自动将查询请求分发到所有相关的分片上,并将结果进行合并返回。

7.ES的查询语句有哪些?

答:ES的查询语句主要有以下几种:

(1)match查询:用于执行全文搜索。

(2)term查询:用于匹配精确值。

(3)range查询:用于匹配指定范围内的值。

(4)bool查询:用于组合多个查询语句。

(5)match_phrase查询:用于匹配短语。

8.ES的聚合操作有哪些?

答:ES的聚合操作主要有以下几种:

(1)count聚合:用于计算文档数量。

(2)sum聚合:用于计算指定字段的总和。

(3)avg聚合:用于计算指定字段的平均值。

(4)max聚合:用于计算指定字段的最大值。

(5)min聚合:用于计算指定字段的最小值。

9.ES的集群是如何工作的?

答:ES的集群是由多个节点组成的,每个节点都是独立的进程。当启动一个节点时,它会自动加入到集群中,参与数据的存储和查询。ES的集群通过Master节点进行协调和管理,Master节点负责维护集群状态、节点状态和分片状态等信息。

10.ES的数据备份和恢复如何实现?

答:ES的数据备份和恢复可以通过快照和恢复功能来实现。快照是对索引和分片的一份拷贝,可以保存在本地或远程存储库中。当需要恢复数据时,可以从快照中恢复索引和分片。此外,ES还提供了基于日志的复制机制,可以在多个节点之间复制数据,提供数据冗余和高可用性。

11.es的分区与分片?

12.es的分布式架构原理

index->type->mapping->document->field

index: 索引,相当于mysql的表 type:es7.0已经移除 mapping:是表结构 document:是一行文档数据 field:是字段值

es一个index可以拆分成多个shard(分片),每个shard(分片)存储部分数据。拆分的好处就是可以支持横向扩展..提高吞吐量

如何新增shard呢? 新建一个index为4个分片索引,批量导入护具

shard:有多个备份。或者说每个shard都有一个主shard,负责写入数据,再同步到其他的副本shard,这样实现高可用

es集群有多个节点,会自动选举一个节点当master,这个master节点其实就是干一些管理工作的,(维护元数据,复制切换主分片与副分片),如果master宕机会重新选举maser节点 ,如果非master宕机会将该节点上面的主shard转移到其他节点上面

13.es写入数据的工作原理是什么,查询数据的工作原理是什么,倒排索引了解吗?

es写数据过程:客户端会选择一个node发送请求过去,这个node被称为(协调节点)

协调节点对document进行**路由,**将请求转发到对应的node上面(主分片所在节点)

实际的node节点来处理请求。,然后将数据同步到replica node(副本)

协调节点如果发现主节点和所有副本节点都处理完成后,会返回响应结果给客户端。

es读数据过程:客户端发送请求到任意node,成为协调节点

协调节点对doc的id进行hash路由,将请求转发到对应的node节点上面,此时会用随机轮询算法再主分片和副分片中随机选择一个,以达到负载均衡

es的搜索数据过程:es最强大的是做全文检索

客户端发送请求到协调node,

协调节点将请求转发到对应sheard节点上面

query phase:每个shard将自己的搜索结果返回给协调节点,由协调节点对数据进行合并、排序、分页等操作,产出结果

fetch phase:接着由协调节点根据doc id去各个节点拉取实际的docment数据最终返回给客户端

写数据底层原理

当数据发送到主shard的时候,会先写入内存buffer(在buffer里的时候数据是搜索不到的),同时写入translog日志文件。

如果buffer快满了,或者到一定时间。就会将buffer中的数据refresh到新的segment file中。但此时数据不是直接写入segment file磁盘文件。而是进入os cache(操作系统缓存)。这个过程就是refresh

大约每隔1秒,es就是将buffer中的数据写入到一个新的segment file,每1s产生一个新的磁盘文件。如果buffer没有数据就不会产生segment file

在操作系统里面。磁盘文件都有一个东西叫os cache(操作系统缓存)。数据写入磁盘都是写入到os cache里面。

为什么es叫准实时?即1秒刷新一次buffer到磁盘才能被搜索。可以调用api手动执行一次

随着不断的buffer被刷入os cache中,translog不断的增大,当达到一定长度后,会触发一次commit操作。

commit操作第一步就是将现有buffer刷入osCache,清空buffer.

然后将一个commit point 写入磁盘。里面标识这个commit point对应的所有segmint file,同时强行将os cache 进行fsync到磁盘中。最后清空translog日志文件,此时commit操作完成

commit操作叫做flush,默认30分钟执行一次。

为什么存在translog?

无论buffer与os cache都是缓存,一旦宕机就会丢失数据,translog就是防止宕机重启丢失数据(间隔5秒刷新到os cache)

删除/更新数据底层原理

如果是删除操作,commit的时候会生成一个.del文件,里面是某个doc标识为delete状态,那么搜索的时候会根据.del文件就知道这个doc是否被删除。

如果更新操作,将原来的数据标识为delete状态,新写入一条数据

buffer每refresh一次到os cache就会产生一个segment file,每1s都会产生一个.此时会定期执行merge.每次merge的时候,会将多个segment file合并。同时会将标识为deleted的doc给物理删除掉。然后将新的segment file写入磁盘,再写一个新的commit point.

底层:lucene是一个jar包,里面包含了各种建立倒排索引的算法代码

倒排索引

在搜索引擎中,每个文档对应一个文档id,文档内容表示一系列关键词的集合

正常索引,是文档id对应document文档关键字

倒排索引,是dockument对应文档ids集合

es在数据量很大的情况下如何提高查询效率 (为什么第一次慢,后面快)

es搜索引擎严重依赖底层的filesystem cache如果给更多的filesystem cache尽量让内存可以容纳所有的ide segment file索引数据文件。那么搜索的时候基本都是走内存,性能会非常高

最佳情况,fileSystem cache 是数据量的一半,可以1秒以内查询

数据预热

就是写一个程序 每隔一段时间定期访问一下热点数据

冷热分离

将热数据和冷数据分开存到不同的索引中,热数据预热,不会被冷数据冲刷掉

分页性能优化

不允许深分页,越翻越慢。(查询原理和mysql类似)

使用无限翻页替代

使用scroll api (游标)。对所有数据生成快照,然后通过游标移动