Zookeeper选举算法
Posted 泡^泡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper选举算法相关的知识,希望对你有一定的参考价值。
集群选举Leader的两种情况
- 集群中已经存在Leader。
- 集群中不存在Leader。
集群中已经存在Leader的情况
此种情况一般都是某台机器启动得较晚,在其启动之前,集群已经在正常工作,对这种情况,该机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器而言,仅仅需要和Leader机器建立起连接,并进行状态同步即可。
集群中不存在Leader的情况
集群中如果不存在Leader,则情况较为复杂。
为了能成功选举出Leader,每一个节点会进行多次投票,每一次投票中包含两个标识。
- SID(服务器的唯一标识),这个值我们搭建集群的时候会在配置文件中配置。
- ZXID(事务ID),每个对节点的改变都将产生一个唯一的Zxid,如果Zxid1的值小于Zxid2的值,那么Zxid1所对应的事件发生在Zxid2所对应的事件之前。这个值越大往往意味着数据越新。
每个节点发出投票后,也会收到其他节点的投票,每台节点会根据一定规则来处理收到的其他节点的投票,并以此来决定是否需要变更自己的投票。这个规则如下:
- 如果收到的zxid大于当前节点自己的zxid,就认可当前收到的投票,并再次将该投票发送出去。
- 如果收到的zxid小于当前节点自己的zxid,就坚持自己的投票。
- 如果收到的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选举算法的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据ZooKeeper:ZooKeeper选举机制
Zookeeper中的FastLeaderElection选举算法简述