ZooKeeper Leader选举原理机制分析

什么场景下需要选举

当 ZooKeeper 集群中的一台服务器出现以下两种情况之一时,需要进入 Leader 选举。

(1)服务器初始化启动。

(2)服务器运行期间 Leader 故障。

几个重要参数和选举状态

在分析选举原理前,先介绍几个重要的参数。

(1)服务器 ID(sid):编号越大在选举算法中权重越大,比如有三台服务器,编号分别是 1,2,3。编号越大在选择算法中的权重越大,比如初始化启动时就是根据服务器 ID 进行比较。

(2)事务 ID(zxid):值越大说明数据越新,权重越大。服务器中存放的数据的事务 ID,值越大说明数据越新,在选举算法中数据越新权重越大。

(3)逻辑时钟(epoch-logicalclock):同一轮投票过程中的逻辑时钟值是相同的,每投完一次值会增加。

选举状态:

(1)LOOKING: 竞选状态;

(2)FOLLOWING: 随从状态,同步 leader 状态,参与投票;

(3)OBSERVING: 观察状态,同步 leader 状态,不参与投票;

(4)LEADING: 领导者状态

启动时期的 Leader 选举

 假设一个 ZooKeeper 集群中有 5 台服务器,id 从 1 到 5 编号,并且它们都是最新启动的,没有历史数据。

集群刚启动选举过程 :

假设服务器依次启动,我们来分析一下选举过程:

(1)服务器 1 启动

发起一次选举,服务器 1 投自己一票,此时服务器 1 票数一票,不够半数以上(3 票),选举无法完成。

         投票结果:服务器 1 为 1 票。

服务器 1 状态保持为 LOOKING(竞选状态)。

(2)服务器 2 启动

         发起一次选举,服务器 1 和 2 分别投自己一票,此时服务器 1 发现服务器 2 的 id 比自己大,更改选票投给服务器 2。

         投票结果:服务器 1 为 0 票,服务器 2 为 2 票。

         服务器 1,2 状态保持 LOOKING。

(3)服务器 3 启动

         发起一次选举,服务器 1、2、3 先投自己一票,然后因为服务器 3 的id 最大,两者更改选票投给为服务器 3;

         投票结果:服务器 1 为 0 票,服务器 2 为 0 票,服务器 3 为 3 票。此时服务器 3 的票数已经超过半数(3 票),服务器 3 当选 Leader。

         服务器 1,2 更改状态为 FOLLOWING,服务器 3 更改状态为 LEADING。

(4)服务器4启动

         发起一次选举,此时服务器 1,2,3 已经不是 LOOKING 状态,不会更改选票信息。交换选票信息结果:服务器 3 为 3 票,服务器 4 为 1 票。此时服务器 4 服从多数,更改选票信息为服务器 3。

         服务器 4 并更改状态为 FOLLOWING。

(5)服务器5启动

         与服务器 4 一样投票给 3,此时服务器 3 一共 5 票,服务器 5 为 0 票。

         服务器 5 并更改状态为 FOLLOWING。

         最终的结果:

         服务器3是 Leader,状态为 LEADING;其余服务器是 Follower,状态为 FOLLOWING。

 运行时期的 Leader 选举

     在 ZooKeeper 运行期间 Leader和 非 Leader 各司其职,当有非 Leader服务器宕机或加入不会影响 Leader,但是一旦 Leader 服务器挂了,那么整个 ZooKeeper 集群将暂停对外服务,会触发新一轮的选举。

     初始状态下服务器 3 当选为 Leader,假设现在服务器 3 故障宕机了,此时每个服务器上 zxid 可能都不一样,server1 为 99,server2为 102,server4 为 100,server5 为 101。

投票的过程和初始化的基本类似,主要为以下几个步骤:

1)状态变更,除 Obsever 状态的其他服务器全部变更为 looking,然后进行 leader 的选举过程

2)每个服务器先投自己一票,然后同步选票

3)每个服务器都会收到各个服务器的投票,如果发现有 txid 比自己大的,会进行改票

4)处理和统计投票,每一轮投票结束后都会统计投票,超过半数即可当选。

5)改变服务器的状态,宣布当选。

很显然,最后服务器 2 被当选为新的 leader。 

ZooKeeper选举原理理解

 每个节点启动的时候都 LOOKING 观望状态,接下来就开始进行选举主流程。这里选取三台机器组成的集群为例。第一台服务器 server1启动时,无法进行 leader 选举,当第二台服务器 server2 启动时,两台机器可以相互通信,进入 leader 选举过程。

(1)每台 server 发出一个投票,由于是初始情况,server1 和 server2 都将自己作为 leader 服务器进行投票,每次投票包含所推举的服务器sid、zxid、epoch,使用(sid,zxid)表示,此时 server1 投票为(1,0),server2 投票为(2,0),然后将各自投票发送给集群中其他机器。

(2)接收来自各个服务器的投票。集群中的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票(epoch)、是否来自 LOOKING 状态的服务器。

(3)分别处理投票。针对每一次投票,服务器都需要将其他服务器的投票和自己的投票进行对比,对比规则如下:

         a. 优先比较 epoch

b. 检查 zxid,zxid 比较大的服务器优先作为 leader

         c. 如果 zxid 相同,那么就比较 sid,sid 较大的服务器作为 leader 服务器

(4)统计投票。每次投票后,服务器统计投票信息,判断是都有过半机器接收到相同的投票信息。server1、server2 都统计出集群中有两台机器接受了(2,0)的投票信息,此时已经选出了 server2 为 leader 节点。

(5)改变服务器状态。一旦确定了 leader,每个服务器响应更新自己的状态,如果是 follower,那么就变更为 FOLLOWING,如果是 Leader,变更为 LEADING。此时 server3继续启动,直接加入变更自己为 FOLLOWING。

 总结:

(1)ZooKeeper 选举会发生在服务器初始状态和运行状态(Leader宕机)下。

(2)初始状态下会根据服务器 sid 的编号对比,编号越大权值越大,投票过半数即可选出 Leader。

(3)Leader 故障会触发新一轮选举,zxid 代表数据越新,权值也就越大。

(4)在运行期选举还可能会遇到脑裂的情况(后文展开说明)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值