ZooKeeper的Leader选举

Leader选举时至少是2台机器。以三台机器组成的集群为例,在服务器初始化阶段,当有一台服务器(假设这台机器的myid为1,称其为server1)启动的时候,是无法进行leader选举的。当第二台机器也启动后,此时这两台机器可以互相通信,每台机器都试图找到一个leader,于是进入leader选举流程。

1.每个server会发出一个投票
由于是初始情况,server1和server2都会将自己作为leader服务器来进行投票,每次投票包含的最基本的元素包括:所推举的服务器的myid和ZXID,以(myid,ZXID)的形式表示。初始化阶段,Server1和Server2都会投给自己,即server1的投票为(1,0),server2的投票为(2,0),然后各自将这个投票发给集群中其他所有机器。

2.接收来自各个服务器的投票
每个服务器都会接收来自其他服务器的投票。集群中的每个服务器在接收到投票后,首先会判断该投票的有效性,包括检查是否是本轮投票、是否来自LOOKING状态的服务器。

3.处理投票
在接收到来自其他服务器的投票后,针对每一个投票,服务器都需要将别人的投票与自己的投票进行PK,PK规则如下:

  1. 优先检查ZXID。ZXID比较大的服务器优先作为Leader.
  2. 如果ZXID相同的话,那么就比较myid。myid比较大的服务器作为Leader服务器。
    上例中,server2的myid比server1大,因此server1更新自己的投票为(2,0),然后重新将投票发出去。server2不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次的投票信息即可。

4.统计投票
每次投票后,服务器都会统计所有投票,判断是否有过半的机器接收到相同的投票信息。上例中,当server1和server2都收到相同的投票信息(2,0)时,即认为已经选出了leader。

5.改变服务器状态
一旦确定了leader,每个服务器就会更新自己的状态:如果是Follower,那么就变更为FOLLOWING,如果是Leader,那么就变更为LEADING。

ZXID是一个事务ID,用来唯一标识一次服务状态的变更。在某一个时刻,集群中每一台机器的ZXID值不一定全都一致。

小结
简单来说,通常哪台服务器上的数据越新,就越有可能成为leader,因为数据越新,那么它的ZXID就越大,也就越能够保证数据的恢复。如果集群中有几个服务器具有相同的ZXID,那么SID(myid)较大的那台服务器成为leader。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值