上篇我们分析了ES集群是如何选主,简单回顾一下就是优化了Bully算法,从而试图避免出现数据不一致,那么今天我们继续分析数据是如何在集群中存储的。
我们知道ES的数据副本是基于主从模式的,即一个数据分片包含了一个主分片和多个副本分片,那么主从模式是怎么工作的呢?继续往下看。
几个术语
在介绍ES的主从模式之前,我们需要先了解几个关键的术语:
- Replica Group: 一个互为副本的数据集合称为副本组。副本组里面只有一个副本是主数据(Primary),其他事从数据(Secondary)。
- Configuration : 配置信息描述了一个副本组有哪些副本,Primary是谁,在哪个节点上面等信息。
- Configuration Version:配置信息版本号,每次发生变更时会递增。
- Serial Number:代表写操作顺序,每次写操作都会递增,由主副本维护,简称SN。
- Prepared List:写操作的准备序列,存储来自外部请求的列表,将请求按照SN排序,向列表中加入的写操作的SN必须大于已有的最大SN,每个副本上面都有一个Prepared List
- Committed List :写操作的提交系列。
数据写入流程
写入流程概述起来就是所有的请求都会路由到主分片上,然后再进行副本同步,详细的步骤如下:
- 客户端写请求到达协调节点,然后经过初步的校验,然后将请求路由到主分片上面;
- 到达主分片后,会再次进行验证,然后在主分片上面执行写请求;
- 操作成功后,主分片会把请求并发的同步到所有的in-syn的副本分片上;
- 主副本等所有的副本分片写操作成功并回复,然后返回给协调节点;
- 协调节点收到回复后再给客户端回复。
以上就是正常的写入流程,那么思考一下,整个流程中如果发生故障应该怎么处理呢?
- 主分片异常 如果主分片发生异常,那么主分片会把写请求告知到Master节点,Master会把请求重新路由到新的主分片上面。
- 副本分片异常 如果副本分片发生异常,那么主分片首先会向Master进行确认,Master会将这个异常的分片从in-sync-replica中移除,然后告知主分片,后期Master会指导新建新的副本分片,并进行数据同步。
主分片和副本分片的数据同步
这里就简单的介绍一下主备模式的数据副本策略
- 写请求到达主节点后,会生成一个SN(写入序列号,可以理解为事务ID),然后通过SN构造一个UpdateRequest,将这个UpdateRequest存入自己本地的prepare list
- 将UpdateRequest发送到从节点,从节点收到后同样先插入到prepare list,然后回复ACK给主节点;
- 主节点收到所有的从节点回复后,然后将此UpdateRequest发放入committed list,同时committed list后移一位;
- 主节点向所有的从节点发送commit请求,告诉他们当前committed list的位置,然后从节点对此进行同步
经过以上4步,就能基本保证主备数据的一致性
主备之间的异常检测
租约机制: 主副本定期向备副本获取租约
可能出现的异常及解决方式:
- 如果主节点在一定时间(lease period)内未收到来自某个副本节点的租约回复,则告诉配置管理器(Master),将其移除,同时自己也将降级,不在作为主节点;
- 如果副本节点在一定时间(grace period)内没有收到来自主节点的租约请求,则告诉配置管理器,将主节点移除,然后将自己提升为主节点,多个从节点竞争提升则哪个先执行成功,哪个从节点就提升为主节点
理论上讲,在没有时钟漂移的情况下,只要grace period >= lease period 就会保证,主节点先感知到租约失效,因此保证了新主节点生成时,旧主节点已经失效,不会出现脑裂现象。
这些在ES中的体现:
主备节点就是ES中的主副分片
配置管理器就是ES中的Master节点
prepare list 对应local checkpoint
committed list 对应 global checkpoint
ES中每个副本都有一个本地操作序列号和全局操作序列号,主分片负责全局操作序列号的推进,本地维护本地操作序列号
最后
以上就是对ES数据模型的简单分析了,后面会将图文补上。