看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比较,也就是要看租是否有过半机制