ZooKeeper集群里有一个Leader和若干个follower。当一台服务器初始化启动或集群中的Leader挂掉时,会发生选举。
相关概念SID:服务器的ID。服务器初始化启动时是根据比较SID来进行选举的。
ZXID:事务ID。用来标识一次服务器状态的变更。在某一时刻,集群中每台服务器的ZXID值不一定相同,这和Zookeeper服务器对客户端的更新请求的处理逻辑有关。ZXID值越大说明数据越新。
Epoch:投票的次数(逻辑时钟),服务器每投完一次票,Epoch这个值就会增加。
假设Zookeeper集群中有5台服务器(图中的myid就是SID):
运行时选举机制服务器1启动,发起一次选举,服务器1会将票投给自己,此时服务器1为1票,不够半数以上(3票),选举无法完成,服务器1保持状态为LOOKING。服务器2启动,发起一次选举,服务器1和2都会将票投给自己,然后交换选票信息,此时服务器1发现服务器2的SID更大,所以更改选票投给服务器2。此时服务器2为2票,不够半数以上,选举无法完成,服务器1和2保持状态为LOOKING。服务器3启动,发起一次选举,在每个服务器都把票投给自己后,服务器1和2将票投给服务器3。此时服务器3为3票,票数超过半数,服务器3当选Leader。服务器1和2更改状态为FOLLOWING,服务器3更改状态为LEADING。服务器4启动,发起一次选举,此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息,服务器3为3票,服务器4为1票,此时服务器4服从多数,更改选票到服务器3,并更改状态为FOLLOWING。服务器5启动,过程同服务器4一样,更改状态为FOLLOWING。
当一台服务器运行期间无法和Leader保持连接时,会发起选举。此时集群中会有两种可能的状态:
- 集群中存在Leader(没挂)
此时,这台服务器试图去选举时,会被其他服务器告知Leader的信息,只能去尝试和Leader服务器建立连接。
- 集群中不存在Leader(挂了)
参考资料Leader挂了后,其他服务器会按照如下规则选举Leader:
(1)Epoch大的当选。
(2)Epoch相同,ZXID大的当选。
(3)ZXID相同,SID大的当选。
- 用大白话给你解释 ZooKeeper 的选举机制【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程



