Zookeeper leader选举原理
2022-01-20 13:39:28 0 举报
Zookeeper 集群启动过程中leader选举流程
作者其他创作
大纲/内容
创建传输层收发选票线程和队列
addToRecvQueue
sendworker
选票参与leader选举
发送线程投递选票
addToSendQueue
应用层
sockect
QuorumCnxManager.Listener listener = qcm.listener;listener.start();
poll()接收线程获取投票
sid(key)
updateProposal()更新选票为投自己zookeeper刚开始都是投的自己为leader
queue
public boolean containsQuorum(Set<Long> ackSet) { return (ackSet.size() > half); }当前投票leader 数大于 总参与选举的zookeeper的一半时,leader选举成功
termPredicate()过半选举逻辑
所有选票放入发送队列
Zookeeper leader选举源码中的核心方法
keysid(3)
接收线程获取选票msg
super.start(); leader选举核心逻辑makeLEStrategy().lookForLeader()
sendqueue
totalOrderPredicate选举核心方法return ((newEpoch > curEpoch) || ((newEpoch == curEpoch) && ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));事务zxid大的优先为leader事务id 一致,默认myid(curid)大的为leader
mySid == sidaddToRecvQueue()
WorkerSenderwsThread.start();
(sid)RecvWorker
termPredicate()Zookeeper过半选举机制
WorkerReceiverwrThread.start();
queueSendMap
recvqueue.offer(n);
keysid(myid)
未选举出leader进行下一轮选举
recvqueue
recvqueue.poll
value
recvQueue
keysid(2)
leader选举逻辑makeLEStrategy().lookForLeader()
poll()
createElectionAlgorithm()创建socket、收发队列
发送方选举状态为Looking状态且选举周期小于当前选举周期,将选票回发给发送方sendqueue.offer(notmsg);
server.1=127.0.0.1:2001:3001:participantserver.2=127.0.0.1:2002:3002:participantserver.3=127.0.0.1:2003:3003:participant
sendNotifications()经过一轮选举后,将选举结果发送出去
quorumPeer.start();入口方法
从接收队列获取选票
self.setPeerState((proposedLeader == self.getId()) ? ServerState.LEADING: learningState());各新选举结果,设置当前节点为leading或者following
QuorumCnxManager.Listener listener = qcm.listener;listener.start();创建socket创建SendWorker、RecvWorker、recvQueue、queueSendMap
updateProposal()更新当前选票为上面选举出来的leader
senderWorkerMap
创建应用层收发选票线程和队列
config
sendNotifications()每个server生成一张选票
传输层
FastLeaderElection
0 条评论
回复 删除
下一页