Elasticsearch基本概括
一、基本概述
- 强大的全文检索能力,基于Lucene实现,内部有倒排索引的数据结构。
二、什么是倒排索引
三、ES的集群架构
- 集群节点
-
一个节点就是一个ES服务实例,通过配置服务集群名称cluster.name加入集群。
-
ES节点角色区分:通过配置文件conf/elasticsearch.yml,进行角色区分,例如:
* node.master: true/false
* node.data: true/false
-
单个节点既可以是候选主节点也可以是数据节点,所以节点角色分为四大类:
-
只是候选主节点
-
只是数据节点
-
既是候选主节点,也是数据节点
-
既不是候选主节点,也不是数据节点
-
-
节点分类:
-
候选主节点:可参与选票,选举成为主节点;
-
主节点:负责索引的添加、删除;跟踪集群节点情况,对分片进行分配,收集各节点状态;
-
数据节点:负责数据CRUD和聚合等操作;对机器性能要求较高;
-
协调节点:其本身不是通过设置来分配的,用户的请求可以随机发往任何一个节点,并由该节点负责分发请求、收集结果等操作,而不需要主节点转发。这种节点可称之为协调节点,集群中的任何节点都可以充当协调节点的角色。每个节点之间都会保持联系。
-
- 发现机制
-
ES的特殊发现机制:ZenDiscovery
-
ZenDiscovery作用:节点发现和选举Master节点
* 多播(组播):指一个节点可以向多台机器发送请求,ES中不建议这么使用。
* 单播:当一个加入一个集群时,请求发送到一台机器上,就能获取到整个集群所有节点信息了,然后联系Master节点,加入集群。
- 选主
- 候选主节点,选举投票变成Master节点。
- 脑裂
- 由于其他原因,选举出多个Master节点
四、索引是如何写入的?
- 分片
-
背景:数据量很大的时候;
-
方式:ES通过水平拆分,将一个索引上的数据进行拆分出来,分配到不同的数据块上,拆分出来的数据块叫shard
-
数据拆分方式:不能乱拆分,需要一个路由策略
- 副本
-
概念:对分片的复制
-
组成:主分片和副本分片
-
作用:防止数据丢失
-
流程:对doc的新建、索引和删除操作,都必须在主分片上进行,然后再被复制到副分片上;为了解决并发写操作冲突,使用乐观锁进行控制,每个文档都有_version号,当文档被修改之后_version号进行递增、一旦所有副分片写完,就会报告协调节点,协调节点告诉客户端成功。
- ES写索引原理
-
路由规则,计算主分片
-
请求发送到 node1上,通过路由计算得到 s1主分片(node2上)
-
然后s1写好后,并发到副分片,进行数据写入
-
所有副分片写好后,报告给node2写好了,node2报告给协调节点node1,node1告诉客户端完成
- 存储原理
-
背景:数据写入到主分片和副分片中之后,还是在内存中,为了防止数据丢失,还需要存储到磁盘中去。
-
Lucene工作原理:
* 新添加一个文档时,进行分词预处理,然后将文档索引写入内存中,并将这次操作写入事务日志(transLog)
* 默认Lucene每隔1秒(refresh\_interval配置项)将内存中的数据刷新到文件系统缓存中,称为一个segment(段),segment段中是无法修改的。这时候才能被检索到,在这之前是无法被检索的,因此说 ES 是准实时的;因此 refresh\_interval决定了ES的实时性。
* 随着segment越来越大,默认情况下是Lucene每隔 30min或者数据大于 512M,将缓存中的segment数据持久化到磁盘中,称为一个commit point,此时会删除掉transLog。
* 可以通过设置 refresh\_interval = 30s 来提高性能。
-
索引文件分段存储并且不可修改,那如何进行新增、删除、更新?
-
新增:直接增加一个segment就可以了
-
删除:由于不可修改,所以删除操作,不会把文档从旧的段中移除,而是通过新增一个.del文件,文件中会列出这些被删除的段信息,这个被标记删除的段信息,仍然会被查询到,但是会在返回结果集的时候移除掉。
-
更新:删除和新增的组合。是先通过.del文件将文档删除,然后再新增新的段。
-
-
段合并:将小的segment合并成大的segment。
五、自动嗅探
- 客户端访问节点,获取节点列表信息,然后将请求平均地发送到各个节点上。