Leader选举
Leader的选举一般分为启动时选举跟Leader挂掉后的运行时选举
启动时选举
以5台机器为例,只有超过半数以上,即最少启动3台服务器,集群才能正常工作
- 服务器1启动,发起一次选举
服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING。
- 服务器2启动,再发起一次选举
服务器1和2分别投自己一票,此时服务器1发现服务器2的id比自己大,更改选票投给服务器2。此时服务器1票数0票,服务器2票数2票,不够半数以上(3票),选举无法完成。服务器1,2状态保持LOOKING。
- 服务器3启动,发起一次选举
与上面过程一样,服务器1和2先投自己一票,然后因为服务器3id最大,两者更改选票投给为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数(3票),服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
- 服务器4启动,发起一次选举
此时服务器1、2、3已经不是LOOKING状态,不会更改选票信息,交换选票信息结果。服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,服务器4并更改状态为FOLLOWING。
- 服务器5启动,发起一次选举
同4一样投票给3,此时服务器3一共5票,服务器5为0票。服务器5并更改状态为FOLLOWING;
- 最终
Leader是服务器3,状态为LEADING。其余服务器是Follower,状态为FOLLOWING。
运行时Leader选举
运行时候如果Master节点崩溃了会走恢复模式,新Leader选出前会暂停对外服务,大致可以分为四个阶段 选举、发现、同步、广播
选举步骤
- 每个Server会发出一个投票,第一次都是投自己,其中投票信息 = (myid,ZXID)
- 收集来自各个服务器的投票
- 处理投票并重新投票,处理逻辑:优先比较ZXID,然后比较myid。
- 统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定leader,注意epoch的增加跟同步。
- 改变服务器状态Looking变为Following或Leading。
- 当 Follower 链接上 Leader 之后,Leader 服务器会根据自己服务器上最后被提交的 ZXID 和 Follower 上的 ZXID 进行比对,比对结果要么回滚,要么和 Leader 同步,保证集群中各个节点的事务一致。
- 集群恢复到广播模式,开始接受客户端的写请求。
脑裂
脑裂问题(集群中出现不止一个master)是集群部署必须考虑的一点,比如在Hadoop跟Spark集群中。而ZAB为解决脑裂问题,要求集群内的节点数量为2N+1。当网络分裂后,始终有一个集群的节点数量过半数,而另一个节点数量小于N+1, 因为选举Leader需要过半数的节点同意,所以我们可以得出如下结论:
有了过半机制,对于一个Zookeeper集群,要么没有Leader,要么只有1个Leader,这样就避免了脑裂问题

浙公网安备 33010602011771号