ES数据模型

2,286 阅读4分钟

上篇我们分析了ES集群是如何选主,简单回顾一下就是优化了Bully算法,从而试图避免出现数据不一致,那么今天我们继续分析数据是如何在集群中存储的。
我们知道ES的数据副本是基于主从模式的,即一个数据分片包含了一个主分片和多个副本分片,那么主从模式是怎么工作的呢?继续往下看。

几个术语

在介绍ES的主从模式之前,我们需要先了解几个关键的术语:

  • Replica Group: 一个互为副本的数据集合称为副本组。副本组里面只有一个副本是主数据(Primary),其他事从数据(Secondary)。
  • Configuration : 配置信息描述了一个副本组有哪些副本,Primary是谁,在哪个节点上面等信息。
  • Configuration Version:配置信息版本号,每次发生变更时会递增。
  • Serial Number:代表写操作顺序,每次写操作都会递增,由主副本维护,简称SN。
  • Prepared List:写操作的准备序列,存储来自外部请求的列表,将请求按照SN排序,向列表中加入的写操作的SN必须大于已有的最大SN,每个副本上面都有一个Prepared List
  • Committed List :写操作的提交系列。

数据写入流程

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

  1. 客户端写请求到达协调节点,然后经过初步的校验,然后将请求路由到主分片上面;
  2. 到达主分片后,会再次进行验证,然后在主分片上面执行写请求;
  3. 操作成功后,主分片会把请求并发的同步到所有的in-syn的副本分片上;
  4. 主副本等所有的副本分片写操作成功并回复,然后返回给协调节点;
  5. 协调节点收到回复后再给客户端回复。

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

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

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

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

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

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

主备之间的异常检测

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

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

理论上讲,在没有时钟漂移的情况下,只要grace period >= lease period 就会保证,主节点先感知到租约失效,因此保证了新主节点生成时,旧主节点已经失效,不会出现脑裂现象。

这些在ES中的体现:

主备节点就是ES中的主副分片
配置管理器就是ES中的Master节点
prepare list 对应local checkpoint 
committed list 对应 global checkpoint

ES中每个副本都有一个本地操作序列号和全局操作序列号,主分片负责全局操作序列号的推进,本地维护本地操作序列号

最后

以上就是对ES数据模型的简单分析了,后面会将图文补上。