文章目录
一、数据模型
1.1 PacificA 算法
ES 的数据副本模型基于主从模式,参考了 PacificA 算法。
PacificA 是一个通用、抽象的框架,而不是具体的算法,主要由两部分组成:
- 存储管理:负责数据的读取和更新,采用多副本保证数据的可靠性和可用性。
- 配置管理:对配置信息进行管理,通过 Paxos 维护配置信息的一致性。
基本结构包括:
- Replica Group:副本组,包括主和从副本。
- Configuration:配置信息,维护了副本组的信息,包括主副本是谁、副本位于哪个节点等。
- Configuration Version:配置的版本号。
- Serial Number:写操作序列号,每个主副本维护。
- Prepared List:写操作的准备序列。
- Committted List:写操作的提交序列。
副本策略
分片副本使用主从模式,写操作写主副本,主副本故障从从副本中选取新主副本。
数据写入流程:
- 写请求主副本节点,节点创建 UpdateRequest,并分配Serial Number,插入到 Prepared List。
- 主副本将 带着 SN 的UpdateRequest广播给从副本节点,从节点也插入 Prepared List ,然后返回 ACK。
- 主副本收到所有从副本的 ACK 后,将 UpdateRequest 放入 Committted List,表示提交。
- 同样把提交信息通知到从副本节点。
配置管理
存在一个全局配置管理器对所有副本组的配置进行管理,通过一致性算法和版本号解决一致性以及并发问题。
错误检测
主要应用于检测主副本情况,采用租约的机制:
- 如果主副本在租约期限内,未收到从副本节点的租约回复,则认为从副本异常,向全局配置管理器汇报,移除该副本,并且自己不再作为主副本。
- 如果从副本在租约期限内,未收到主副本节点的租约请求,则认为主副本异常,向管理器汇报,移除主副本,并自己提升为主副本。
1.2 ES 数据副本模型
ES 数据副本模型参照 PacificA 算法实现:
- Master 负责维护索引元信息,类似配置管理器的角色。
- 集群状态中的 routing_table 存储了所有索引、索引的shard、主分片、位于哪个节点等信息,类似副本组的功能。
- ES 中有 Sequence Number 和 Checkpoint,类似 PacificA 的 Serial Number 和 Committed Point。
ES 一个索引会拆成多个分片,每个分片又有多个副本,对于文档的添加删除都是同步写的。
1.2.1 写入模型
写入过程会遵循以下基本流程:
- 请求到达协调节点,协调节点对操作进行验证合法性,失败则拒绝操作,然后会请求到对应主分片所在节点,每个shard都会在master结点里维护一个in-sync group。 每次写操作,都是先发给对应in-sync group里的主片(如果指定 routing 会根据该参数选择)。
- 主分片在本地执行操作,对操作合法性进行判断。(因为主分片本地会先执行,可能存在响应写入成功之前读取到更新的数据)。
- 如果执行成功会并行转发操作到所有副分片(主分片会维护需要同步的副分片列表)。
- 主分片等待所有副分片成功执行并返回ACK后,响应协调节点写入成功。
同步写入的过程,可能会出现一些异常情况:
- 主分片自身错误,会报告 Master,Master 提升一个副分片为主分片,并将对应操作交给副分片执行。
- 主分片同步转发操作到副分片,由于网络、硬件等问题,副分片没有返回 ACK,主分片会发送消息到 Master 剔除该副分片,并重新建立一个副分片。
- 同样主分片会根据副分片的响应来判断自己的状态,如果一个主分片存在分区或者其他异常情况,但仍继续处理读写操作,会收到副分片的拒绝响应,这时候会询问 Master 自己的身份来判断是否需要降级。
1.2.2 读取模型
读取过程遵循以下基本流程:
- 协调节点将读请求转发到相关的分片。
- 从分片中选取某个副本,可以是主副本也可以是从副本。
- 获取到数据到协调节点后,合并结果并给客户端响应。
在某个副本出现异常情况无法提供读能力,协调节点可以选择另一个副本读取,或者返回部分结果,可以在 _shards 字段分辨是否有副本读取失败。
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,</