首先先记住选举的总原则:当zk集群中任意一台机器得到 选票数超过机器总数的一半以上, 它就是当前集群的leader。
第一种情况:在一个新搭建的集群下进行选举(集群中没有数据)举例:以5台机器为例
前提:集群配置没问题!1,2,3,4,5 顺时启动
- server1 启动,此时它会给自己投票,因为当前票数没有过半,它 的投票结果出于(LOOKING)
- server2 启动,此时先给自己投一票,然后server2和server1进行通信, 相互交换选票,此时发现个自有一票,那么进行myid(配置集群时候的写的编号)的比较, 2 > 1,server2选举胜出,server1会把票投给server2。这个时候还没有选出leader, 票数没有达到半数以上。 选举结果任然出于LOCkING。这时候把选票结果恢复到原始状态。server1和server2都有一票。
- server3 启动,先给自己投票,然后就与server1和server2进行通信,大家交换选票,因为个自都是1票,所以比较myid, 此时server3胜出,server1和server2将自己的选票投给server3,此时server3累计3票,最后判断当前票数知否超过集群的总数的一半。由此就把leader选出了,就是server3。
- server4 启动,由于当前集群已经产生了leader,它就不参与选举,自动成为follower
- server5 启动,由于当前集群已经产生了leader,它就不参与选举,自动成为follower
注意:当启动顺序不确定时,选举结果可能受影响,但是选举额机制原理不变。
要重新选举出leader。
- 以上情况出现,会从现有存活的机器中再选出一个leader,此时集群每台机器zxid就不一样,这种情况的选举就以两个条件去投票,就是 (myid,zxid)。 此时就会选择当前集群中zxid值最大的为leader。 如果极端情况下,zxid的值 一样,此时会比较myid。
- 解释下什么是zxid:每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
结论:某种意义上,zxid值最大的就可以代表当前集群中数据最完整的一台机器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)