Master 选举
- 节点发现
- 选举发起
- 选举谁 Bully算法
- 选举成功
- 避免脑裂
- 错误检测
图
https://pic2.zhimg.com/v2-7c4b590346650f5e32088458da5df48d_r.jpg
ES自己实现的一套用于节点发现和选主等功能的模块:Zendiscovery
当一个节点发现包括自己在内的多数派的master-eligible节点认为集群没有master时,就可以发起master选举
该master-eligible节点的当前状态不是master。
该master-eligible节点通过Zendiscovery模块的ping操作询问其已知的集群其他节点,没有任何节点连接到master。
包括本节点在内,当前已有超过minimum_master_nodes个节点没有连接到master。
选择ID比较小的es节点作为master节点应该是因为该节点的数据比较完整,ID小的启动时间比ID大的启动时间早
Bully算法
bully算法是一个分布式系统中动态选择master节点的算法,进程号最大的非失效的节点将被选为master。
ES master选举:
- 每个节点会ping配置文件中discovery.zen.ping.unicast.hosts的IP,找到所有存活的节点并过滤
- 找到非本身(目的是为了避免脑裂)的active master : activeMasters列表
- 找到所有的可成为master的节点集合masterCandidates ,包含自己
- 如果activeMasters 为空,也就是说不存在活着的master节点,同时当前活着的节点满足配置中discovery.zen.minimum_master_nodes的数量,达到的情况下比较优先级,优先级比较的时候首先比较节点拥有的集群状态版本编号,然后再比较id,这一流程的目的是让拥有最新集群状态的节点成为master。如果activeMasters 不为空,则从中选择最小的ID成为Master节点即可。
es节点更新之后会向副本节点同步更新数据(同步写入),直到所有副本都更新了才返回成功。
本地节点是Master的时候,Master节点会开启错误检测(NodeFaultDetection机制),它节点会定期扫描集群所有的成员,将失活的成员移除集群,同时将最新的集群状态发布到集群中,
7.X版本后 Elastic Search master选举采用 Raft算法
ES实现中,候选人不先投自己,而是直接并行发起RequestVote,这相当于候选人有投票给其他候选人的机会。这样的好处是可以在一定程度上避免3个节点同时成为候选人时,都投自己,无法成功选主的情况。
ES不限制每个节点在某个term上只能投一票, 节点可以投多票,这样会产生选出多个主的情况:
对于这种情况,ES的处理是让最后当选的leader成功,作为leader。