Zookeeper选主算法详解

一、zookeeper选主逻辑主要是根据投票数来定的,具体的逻辑如下:

判断依据:
1、Epoch:leader的任期,任期大的优先级高,其他的节点优先投票给任期大的节点
2、ZXID:zookeeper事务ID,越大表示数据越新,在任期相同时则比较zxid
3、SID:集群中每个节点的唯一编号,当任期、事务id都相同的时候则比较该值,sid越大的优先获得其他节点的投票

二:zookeeper选主源代码分析:

public Vote lookForLeader() throws InterruptedException 

选主的入口主要是集中在这儿:


            synchronized (this) {
   
                logicalclock.incrementAndGet();
                updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch());
            }

其中 logicalclock 表示选举轮数,每一次选举该值都会增加,表示选举轮数增加。我们跟踪进 在这里updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch());插入代码片 方法去看一下:

synchronized void updateProposal(long leader, long zxid, long epoch) {
   
        LOG.debug(
            "Updating proposal: {} (newleader), 0x{} (newzxid), {} (oldleader), 0x{} (oldzxid)",
            leader,
            Long.toHexString(zxid),
            proposedLeader,
            Long.toHexString(proposedZxid));

        proposedLeader = leader;
        proposedZxid = zxid;
        proposedEpoch = epoch;
    }

可以看到,当投票开始的时候,这里所作的操作就是初始化选举信息,
具体的投票操作是在 sendNotifications(); 这里所作的操作就是将自己的选举票发送给自己将要选举的节点,其代码如下:

private void sendNotifications() {
   
        for (long sid : self.getCurrentAndNextConfigVoters()) {
   
            QuorumVerifier qv = self.getQuorumVerifier();
            ToSend notmsg = new ToSend(
                ToSend.mType
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值