一、操作流程

请求—->副本组—->主分片

Elasticsearch 中的每个索引操作首先使用路由解析到一个副本组,通常基于文档ID。一旦确定了副本组,操作将在内部转发到组的当前主分片。主分片负责验证数据格式并将其转发到其他副本。由于副本可以由主分片异步复制,所以不需要主副本复制到所有副本。相反,Elasticsearch 维护一个应该接收操作的副本分片列表。这个列表称为同步副本,由主节点维护。顾名思义,这些是一组保证处理了所有已向用户确认的索引操作和删除操作的分片副本。主分片负责维护,因此必须将所有操作复制到这个集合中的每个副本分片

主分片遵循以下基本流程:

  • 验证传入操作并在结构无效时拒绝它(例如:插入时字段格式与 mapping 不匹配);
  • 在本地执行操作,即索引或删除相关文档。将验证字段的内容,并在需要时拒绝(例如:关键字值太长,无法在Lucene中进行索引);
  • 将操作转发到当前同步复制集中的每个副本分片。如果有多个副本分片,则并行执行;
  • 一旦所有副本分片都成功地执行了操作并响应了主分片,主副本就会向客户端确认请求成功完成;、

二、数据流程

1、写入流程

写入流程概述起来就是所有的请求都会路由到主分片上,然后再进行副本同步,详细的步骤如下:

  1. 客户端写请求到达协调节点,然后经过初步的校验,然后将请求路由到主分片上面;
  2. 到达主分片后,会再次进行验证(例如:插入时字段格式与 mapping 不匹配),然后在主分片上面执行写请求;
  3. 操作成功后,主分片会把请求并发的同步到所有的in-syn的副本分片上;
  4. 主副本等所有的副本分片写操作成功并回复,然后返回给协调节点;
  5. 协调节点收到回复后再给客户端回复。

以上就是正常的写入流程,那么思考一下,整个流程中如果发生故障应该怎么处理呢?

  • 主分片异常 如果主分片发生异常,那么主分片会把写请求告知到Master节点,Master会把请求重新路由到新的主分片上面。
  • 副本分片异常 如果副本分片发生异常,那么主分片首先会向Master进行确认,Master会将这个异常的分片从in-sync-replica中移除,然后告知主分片,后期Master会指导新建新的副本分片,并进行数据同步。

    2、读请求

    Elasticsearch 使用主备模型。主备份模型的一个优点是,主分片和其所有副本分片存有相同的数据。因此,一个同步副本就足以满足读请求。
    Elasticsearch 中的读取可以直接使用 document ID,也可以是非常复杂的搜索,包含复杂的聚合,这个操作会占用大量CPU资源。

当节点接收到读请求时,该节点负责将其转发给包含相关分片的节点、整合所有分片的返回值并响应客户端(类似于一个MapReduce)。我们将该节点称为请求的协调节点。基本流程如下:

  • 将读请求解析到相关分片。注意,由于大多数搜索将被发送到一个或多个索引,因此它们通常需要从多个分片中读取,每个分片表示数据的不同子集;
  • 在分片复制组中选择每个相关分片的活动副本。这可以是主分片,也可以是副本分片。默认情况下,Elasticsearch只是在副本分片之间进行循环;
  • 将分片级别的读请求发送到所选副本;
  • 整合结果并做出响应。注意,在get by ID查找的情况下,只有一个分片是相关的,可以跳过这一步;

三、主分片和副本分片的数据同步

这里就简单的介绍一下主备模式的数据副本策略

  1. 写请求到达主节点后,会生成一个SN(写入序列号,可以理解为事务ID),然后通过SN构造一个UpdateRequest,将这个UpdateRequest存入自己本地的prepare list
  2. 将UpdateRequest发送到从节点,从节点收到后同样先插入到prepare list,然后回复ACK给主节点;
  3. 主节点收到所有的从节点回复后,然后将此UpdateRequest发放入committed list,同时committed list后移一位;
  4. 主节点向所有的从节点发送commit请求,告诉他们当前committed list的位置,然后从节点对此进行同步

经过以上4步,就能基本保证主备数据的一致性

四、主备之间的异常检测

f租约机制: 主副本定期向备副本获取租约
可能出现的异常及解决方式:

  1. 如果主节点在一定时间(lease period)内未收到来自某个副本节点的租约回复,则告诉配置管理器(Master),将其移除,同时自己也将降级,不在作为主节点;
  2. 如果副本节点在一定时间(grace period)内没有收到来自主节点的租约请求,则告诉配置管理器,将主节点移除,然后将自己提升为主节点,多个从节点竞争提升则哪个先执行成功,哪个从节点就提升为主节点

理论上讲,在没有时钟漂移的情况下,只要grace period >= lease period 就会保证,主节点先感知到租约失效,因此保证了新主节点生成时,旧主节点已经失效,不会出现脑裂现象。
这些在ES中的体现:
主备节点就是ES中的主副分片 配置管理器就是ES中的Master节点 prepare list 对应local checkpoint committed list 对应 global checkpoint ES中每个副本都有一个本地操作序列号和全局操作序列号,主分片负责全局操作序列号的推进,本地维护本地操作序列号

五、流程

1、数据读取

Elasticsearch读取数据的过程

1)客户端发送请求到任意一个node,成为coordinate node

2)coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡

3)接收请求的node返回document给coordinate node

4)coordinate node返回document给客户端

2、写入

写入document时,每个document会自动分配一个全局唯一的id即doc id,同时也是根据doc id进行hash路由到对应的primary shard上。也可以手动指定doc id,比如用订单id,用户id。

2.读取document时,你可以通过doc id来查询,然后会根据doc id进行hash,判断出来当时把doc id分配到了哪个shard上面去,从那个shard去查询

3、Elasticsearch搜索数据过程

es最强大的是做全文检索

1)客户端发送请求到一个coordinate node

2)协调节点将搜索请求转发到所有的shard对应的primary shard或replica shard也可以

3)query phase:每个shard将自己的搜索结果(其实就是一些doc id),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果

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