Zookeeper选举算法

Posted 泡^泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper选举算法相关的知识,希望对你有一定的参考价值。

集群选举Leader的两种情况

  • 集群中已经存在Leader。
  • 集群中不存在Leader。

集群中已经存在Leader的情况

此种情况一般都是某台机器启动得较晚,在其启动之前,集群已经在正常工作,对这种情况,该机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器而言,仅仅需要和Leader机器建立起连接,并进行状态同步即可。

集群中不存在Leader的情况

集群中如果不存在Leader,则情况较为复杂。

为了能成功选举出Leader,每一个节点会进行多次投票,每一次投票中包含两个标识。

  1. SID(服务器的唯一标识),这个值我们搭建集群的时候会在配置文件中配置。
  2. ZXID(事务ID),每个对节点的改变都将产生一个唯一的Zxid,如果Zxid1的值小于Zxid2的值,那么Zxid1所对应的事件发生在Zxid2所对应的事件之前。这个值越大往往意味着数据越新。

每个节点发出投票后,也会收到其他节点的投票,每台节点会根据一定规则来处理收到的其他节点的投票,并以此来决定是否需要变更自己的投票。这个规则如下:

  1. 如果收到的zxid大于当前节点自己的zxid,就认可当前收到的投票,并再次将该投票发送出去。
  2. 如果收到的zxid小于当前节点自己的zxid,就坚持自己的投票。
  3. 如果收到的zxid小于等于节点自己的zxid,就比较SID,如果接收到的SID更大,那么就认可当前收到的投票,并再次将该投票发送出去。反之则坚持自己的投票。

举一个例子

假定Zookeeper由5台机器组成,SID分别为如下,并且SID为2的机器是现有的Leader

  • 1
  • 2(Leader)
  • 3
  • 4
  • 5

ZXID分别为

  • 9
  • 9
  • 9
  • 8
  • 8

现在某一时刻,1、2所在机器出现故障,因此集群开始进行Leader选举。

第一次投票:初始投票
由于1,2出现故障,所以只有3、4、5,三个投票,第一次投票,每台机器都会将自己作为投票对象,所以他们的投票的(SID,ZXID)分别为:

  • (3, 9)
  • (4, 8)
  • (5, 8)

第二次投票:变更投票

很明显3号机器的ZXID最大,所以4号和5号遵守投票规则,也透出了(3,9),整个集群的投票规则如下:

  • (3, 9)
  • (3, 9)
  • (3, 9)

经过第二轮投票后,集群中的每台机器都会再次接收到其他机器的投票,然后开始统计投票,如果一台机器收到了超过半数的相同投票,那么这个投票对应的SID机器即为Leader。此时Server3将成为Leader。

总结

由上面规则可知,通常那台服务器上的数据越新(ZXID会越大),其成为Leader的可能性越大,也就越能够保证数据的恢复。如果ZXID相同,则SID越大机会越大。而ZXID是我们无法保证的,但SID是我们自己配了,所以一般建议把最大的SID配置在集群中性能相对较好的服务器上,尽量避免Leader宕机。

以上是关于Zookeeper选举算法的主要内容,如果未能解决你的问题,请参考以下文章

图解zookeeper FastLeader选举算法

2021年大数据ZooKeeper:ZooKeeper选举机制

Zookeeper中的FastLeaderElection选举算法简述

zookeeper源码分析二FASTLEADER选举算法

Zookeeper源码阅读(十八) 选举之快速选举算法FastLeaderElection

Zookeeper实现分布式选举算法