当前位置:   article > 正文

Zookeeper快速选举流程详解_zookeeper选举过程

zookeeper选举过程

                                Zookeeper快速选举流程详解

在讲解流程之前,先说明一下选举流程中涉及到的角色,以及涉及到的关键类和变量(源码参考版本:3.4.9):

角色:1.LOOKING:竞选

           2.OBSERVING:观察

           3.FOLLOWING:跟随者

           4.LEADER:领导者

投票信息:

           1.logicalclock(electionEpoch):本地选举周期,每次投票都会自增

           2.epoch(peerEpoch):选举周期,每次选举最终确定完leader结束选举流程时会自增(真正zxid的前32位)

           3.zxid:数据ID,每次数据变动都会自增(真正zxid的后32位,zxid一共64位)

           4.sid:该投票信息所属的serverId

           5.leader:提议的leader(被提议的server的serverId,即sid)

投票比较规则:

          1.epoch大的胜出,否则进行步骤2

          2.zxid大的胜出,否则进行步骤3

          3.sid大的胜出

比较规则的源码如下:

  1. /**
  2. * Check if a pair (server id, zxid) succeeds our
  3. * current vote.
  4. *
  5. * @param id Server identifier
  6. * @param zxid Last zxid observed by the issuer of this vote
  7. */
  8. protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {
  9. LOG.debug("id: " + newId + ", proposed id: " + curId + ", zxid: 0x" +
  10. Long.toHexString(newZxid) + ", proposed zxid: 0x" + Long.toHexString(curZxid));
  11. if(self.getQuorumVerifier().getWeight(newId) == 0){
  12. return false;
  13. }
  14. /*
  15. * We return true if one of the following three cases hold:
  16. * 1- New epoch is higher
  17. * 2- New epoch is the same as current epoch, but new zxid is higher
  18. * 3- New epoch is the same as current epoch, new zxid is the same
  19. * as current zxid, but server id is higher.
  20. */
  21. return ((newEpoch > curEpoch) ||
  22. ((newEpoch == curEpoch) &&
  23. ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));
  24. }

下面首先讲解一下大概的选举流程,这里暂时先不用考虑投票的数据是如何进行交互的,只管拿来用即可,后续会讲到选举期间投票数据是如何进行交互的。

1.首先更新logicalclock并提议自己为leader并广播出去

2.进入本轮投票的循环

3.从recvqueue队列中获取一个投票信息,如果为空则检查是否要重发自己的投票或者重连,否则进入步骤4

4.判断投票信息中的选举状态:

        LOOKING状态:1.如果对方的logicalclock大于本地的logicalclock,则更新本地的logicalclock并清空本地投票信息统计箱recvset,并将自己作为候选和投票中的leader进行比较,选择大的作为新的投票,然后广播出去,否则进入步骤2

                                    2.如果对方的logicalclock小于本地的logicalclock,则忽略对方的投票,重新进入下一轮选举流程,否则进入步骤3

                                    3.如果两方的logicalclock相等,则比较当前本地被推选的leader和投票中的leader,选择大的作为新的投票,然后广播出去

                                     4.把对方的投票信息保存到本地投票统计箱recvset中,判断当前被选举的leader是否在投票中占了大多数(大于一半的server数量),如果是则需再等待finalizeWait时间(从recvqueue继续poll投票消息)看是否有人修改了leader的候选,如果有则再将该投票信息再放回recvqueue中并重新开始下一轮循环,否则确定角色,结束选举

        OBSERVING状态:没有投票权,无视直接进入下一轮选举

        FOLLOWING/LEADING:1.如果对方的logic

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/555271
推荐阅读
相关标签
  

闽ICP备14008679号