zookeeper选举leader

(1) 集群启动中的 Leader 选举

这里以三台主机组成的集群为例。

在集群初始化阶段,当第一台服务器 Server1 启动时,其会给自己投票,然后发布自己 的投票结果。投票包含所推举的服务器的 myid 和 ZXID,(zxid:事务请求的唯一标记,由leader服务器负责进行分配。),此时 Server1 的投票为(1, 0)。由于其它机器还没有启动所以它收不到反馈信息,Server1 的状态一直属于 Looking,即属于非服务状态。

当第二台服务器 Server2 启动时,此时两台机器可以相互通信,每台机器都试图找到 Leader,选举过程如下:

(1) 每个 Server 发出一个投票。此时 Server1 的投票为(1, 0),Server2 的投票为(2, 0),然后 各自将这个投票发给集群中其他机器。

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

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

 优先检查 ZXID。ZXID 比较大的服务器优先作为 Leader。如果 ZXID 相同,那么就比较 myid。myid 较大的服务器作为 Leader 服务器。对于 Server1 而言,它的投票是(1, 0),接收 Server2 的投票为(2, 0)。其首先会比较两者的 ZXID,均为 0,再比较 myid,此时 Server2 的 myid 最大,于是 Server1 更新自己的投票为 (2, 0),然后重新投票。对于 Server2 而言,其无须更新自己的投票,只是再次向集群中所有 主机发出上一次投票信息即可。

(4) 统计投票。每次投票后,每一台 zkServer 都会统计投票信息,判断是否已经有过半机 器接受到相同的投票信息。对于 Server1、Server2 而言,都统计出集群中已经有两台主机接 受了(2, 0)的投票信息,此时便认为已经选出了新的 Leader,即 Server2。

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

(6) 添加主机。在新的 Leader 选举出来后 Server3 启动,其想发出新一轮的选举。但由于 当前集群中各个主机的状态并不是 LOOKING,而是各司其职的正常服务,所以其只能是以 Follower 的身份加入到集群中。

(2) 断连后的 Leader 选举

在 Zookeeper 运行期间,Leader 与非 Leader 服务器各司其职,即便当有非 Leader 服务 器宕机或新加入时也不会影响 Leader。但是若 Leader 服务器挂了,那么整个集群将暂停对 外服务,进入新一轮的 Leader 选举,其过程和启动时期的 Leader 选举过程基本一致。

ZAB 通过设计巧妙的 zxid 实现了这一目的。一个 zxid 是 64 位,高 32 是纪元 epoch 编号,每一次选举 epoch 的值都会增一。低 32 位是事务标识 xid,每产生一个事务,该 xid 值都会增一。这样设计的好处是旧的 Leader 挂了后重启,它不会被选举为新的 Leader,因 为此时它的 zxid 肯定小于当前新的 epoch。当旧的 Leader 作为 Follower 接入新的 Leader 后,新的 Leader 会让其将所有旧的 epoch 编号的、未被 COMMIT 的 proposal 清除。

假设正在运行的有 Server1、Server2、Server3 三台服务器,当前 Leader 是 Server2,若 某一时刻 Server2 挂了,此时便开始新一轮的 Leader 选举了。选举过程如下:

(1) 变更状态。Leader 挂后,余下的非 Observer 服务器都会将自己的服务器状态由 FOLLOWING 变更为 LOOKING,然后开始进入 Leader 选举过程。

(2) 每个 Server 会发出一个投票,仍然会首先投自己。不过,在运行期间每个服务器上 的 ZXID 可能是不同,此时假定 Server1 的 ZXID 为 111,Server3 的 ZXID 为 333;在第一轮投 票中,Server1 和 Server3 都会投自己,产生投票(1, 111),(3, 333),然后各自将投票发送给 集群中所有机器。

(3) 接收来自各个服务器的投票。与启动时过程相同。集群的每个服务器收到投票后, 首先判断该投票的有效性,如检查是否是本轮投票、是否来自 LOOKING 状态的服务器。

(4) 处理投票。与启动时过程相同。针对每一个投票,服务器都需要将别人的投票和自 己的投票进行 PK。对于 Server1 而言,它的投票是(1, 111),接收 Server3 的投票为(3, 333)。 其首先会比较两者的 ZXID,Server3 投票的 zxid 为 333 大于 Server1 投票的 zxid 的 111,于是 Server1 更新自己的投票为(3, 333),然后重新投票。对于 Server3 而言,其无须更新自己的投 票,只是再次向集群中所有主机发出上一次投票信息即可。

(5) 统计投票。与启动时过程相同。经过票数统计,最终 Server3 当选新的 Leader。

(6) 改变服务器的状态。与启动时过程相同。一旦确定了 Leader,每个服务器就会更新 自己的状态。Server1 变更为 FOLLOWING,Server3 变更为 LEADING。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值