zookeeper 源码解析专题一 (选举算法解析)

看Zookeer源码,看完后,记录下心得,不过感觉不好文章表达,如果后续点赞人多,我就录个频给大家,如果不好拿就算了,哈哈
在这里插入图片描述
zookeep 有的选举重点有个两个部分:
quorumPeer.start() 中 startLeaderElection()和super.start()两个方法

quorumPeer.start() 代码往下看:

     @Override
    public synchronized void start() {
        loadDataBase();
        cnxnFactory.start();   
        //开启选举的通道socket:发送和接受    
        // 关于选举的策略:默认为fastLeaderElection 
        startLeaderElection();
        // 进行选举
        super.start();
    }

quorumPeer.createElectionAlgorithm方法:

  //监听:发送和SendWorker接受RecvWorker
 listener.start();
 //赋值选举的方法
 le = new FastLeaderElection(this, qcm);

接着去看quorumpeer.run,peerstate状态为LOOKING,中
makeLEStrategy().lookForLeader()方法
FastLeaderElection.lookForLeader方法

//先选择提议自己为leader
 recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));
.....
....
//然后在方法:totalOrderPredicate里面可以看到,选举的优先级别
// 通过这些来看是否提议修改为其他,如果条件不成立,提议还是选择之前提议的
//leader
 return ((newEpoch > curEpoch) || 
                ((newEpoch == curEpoch) &&
                ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));

FastLeaderElection中

    return self.getQuorumVerifier().containsQuorum(set);
    //进入看看默认为QuorumMaj,看是否过半
     containsQuorum(HashSet<Long> set){
        return (set.size() > half);
    }
    

还有一个方法为QuorumHierarchical
里面其实按照group和权限,如果所选择的机子在这个组权限加起来大于,其他机子Weight/2,那比较过半机制就+1,然后跟多少组/2,来判断是否过半
怎么说呢,小G想想,就是按照组进行过半,比如一个组里面有3个机子,首先判断这个机子在组的weight是否大于其他组weight的和/2,如果算,这个组说明算一个投票有限,不过只能算一个投票,(一个组里多个机子投票,只能算一个投票),然后所得投票跟有多少组/2比较,也就是要看租是否有过半机制

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值