本文主要记录了ES 集群启动过程及简单原理,理解它有助于解决或避免集群维护过程中可能遇到的脑裂、无主、恢复慢、丢数据等问题
ES 集群启动主要分为以下步骤:
集群启动的第一件事就是选举主节点,因为选举后后续的流程需要由主节点触发。
ES 的选主算法是基于Bully 算法的改进,主要思路是对节点ID 排序,取ID 最大的节点作为Master,每个节点都运行这个流程。
除此之外选举Master 还遵循以下三点:
为什么需要参选人数过半且得票数过半?
:因为每个节点运行Bully 算法,结果不一定相同。eg.集群有5 台机器,节点ID 分别是1、2、3、4、5。当产生网略分区或者节点启动速度有差异,节点1 看到的节点有1、2、3、4,选出4;节点2 看到的节点有1,2,3,4,5,选出5。
为什么节点离开时,需要重新判断?
:防止出现脑裂。eg. 集群5 个节点出现网络分区,2 台一组,3 台一组,产生分区前,Master 位于2 台中的一个,此时3 台一组的节点会重新选举Master。
介绍Master 选举算法,可以发现被选出的Master 和集群的元信息新旧程度毫不相关。
因此Master 的第一个任务就是选举元信息:
收集获取最新元信息。Master 会让各个节点把各自存储的元信息发过来,根据版本号获取最新的元信息,然后广播元信息,这样集群的所有节点都有了最新的元信息
选举元信息期间不允许新节点加入
在初始阶段,所有的分片(shard)都处于未分配状态。ES 通过分配过程(allocation)决定那个分片位于那个主节点,重构路由表。
在分配之前,Master 并不知道主分片在哪,所以需要先收集节点分片信息。这个询问量 = 分片数 * 节点数,效率略低,所以我们最好控制一下总分片的数量。
选举算法:
主分片选举完成后,从收集分片信息中选择一个副本作为副分片。
分片分配成功后就进入数据恢复阶段。为什么需要recovery?
由于每次写操作都会记录事务(translog),事务日志中记录了那种操作,以及相关的数据。因此将最后一次提交之后的translog 中进行重放,建立Lucene 索引,如此完成主分片的recovery。
副分片的恢复需要与主分片一致,同时,恢复期间允许新的索引操作。在6.x 版中分为两个阶段:
分片完整性保障
如何做到副分片数据不丢?第二阶段的translog 快照包括第一阶段所有的新增操作。如歌第一阶段发生lucene commit(将文件系统写入缓存的数据刷盘,并清空translog)。
数据一致性保障
通过写版本号来过滤到过期的操作