Elasticsearch选择主从的模式作为其分布式架构的设计方案,该模式在节点数并不多、相对稳定的网络、并不需要经常处理节点的加入或离开的应用场景下是合理的选择。

选举算法

在选举算法中以 Bully算法为主,该选举算法假设集群节点都有一个唯一ID,根据 集群状态+唯一ID做二次排序获取到Master节点。当集群不稳定时,如Master负载过重而假死,集群第二位节点当选Master,这时老的Master恢复了,再次被选为新主,再次假死。ES通过推迟选举的方式,即当从节点发现Master假死,通过检测的方式判断是否真正假死。但此方法容易产生脑裂,通过 法定得票人数过半解决脑裂问题

选举流程

选举流程分为两步:

  1. 每个节点计算已知最小ID ,该节点视为临时Master,并向临时Master投票
  2. 当一个节点收到的投票数大于最小法定人数(n/2+1)时,它将成为正式的Master,并发布集群状态

选举临时Master

首选介绍两个集合分别为:activeMaster和masterCandidates

  • activeMasters:这个集合中存储的是当前活跃的Master,集合的size存在 0或1两种可能性。当集合大小为0时,集群需要通过排序masterVCandidates进行选主;当集合大小为1时,说明当前集群存在Master,选主结束。
  • masterCandidates:集合中存储Master候选节点(node.master=true),通过排序逻辑支持当前节点选主

选主的主流程如下:


Created with Raphaël 2.2.0 开始 执行ping 获取节点列表 构建activeMaster、masterCandidates集合 activeMaster是否为空? 从masterCandidates中选主 operation: 判断候选人是否达到法定人数? 结束 选择activeMaster做为主节点 yes no yes no


选主前需判断候选人数量是否达到法定人数,否则重新ping节点,在进行排序的时候,会选择集群状态版本号高且ID小的节点,选择集群状态版本号高的原因是需要选择元数据最新的节点作为主节点,这样可以避免元数据丢失。

确认Master

Master为当前节点
  1. 等待足够多的具备Master资格的节点join请求投票,当投票达到法定人数则完成选举
  2. 若超时后,join请求没有达到法定人数则重新选举
  3. 成功后,发起节点状态
Master为其他节点
  1. 拒绝其他节点的join请求
  2. 向Master发出请求并等待回复
  3. 检测join请求返回值是否为空或并不是选择节点,则重新选举