zk选举过程——Leader lead()方法
2015-08-31 20:31:38 5 举报
Zookeeper的选举过程是通过Leader的lead()方法实现的。当一个节点成为Leader后,它会调用lead()方法来开始领导其他节点。在这个方法中,Leader会向其他节点发送消息,告诉它们自己已经成为了Leader。同时,Leader还会监听其他节点的消息,以便及时处理它们的请求。如果Leader发现自己不再是Leader,它会停止领导其他节点,并重新进入选举过程。这个过程是自动进行的,不需要人工干预。总之,Zookeeper的选举过程是通过Leader的lead()方法实现的,它能够保证系统的高可用性和稳定性。
作者其他创作
大纲/内容
生成LeaderBean 注册到JMX
Leader waitForEpochAck传入:serverId ss当followers过半,leader则认为自己是leader同时发送给所有followers LEADERINFO并等待followers的确认
electingFollowers.wait(end - cur);该线程等待,直到其他线程完成了electionFinised=true操作
LearnerHandler 线程开启 一个handler对应一个follow开始同步数据
超过半数 返回epoch获取zxid (值得商榷!)
qp.getData 获取serverId、version并复制给handler的属性
electionFinished = true唤醒沉睡的electingFollowers线程
tick = 0;LeaderZk loadData() 清除deadSession 未明?
registerWithLeader方法readPacket(pq)follower节点更新version acceptedEpoch返回packettype:ACKEPOCHzxid:lastLoggedZxiddata:节点当前的epoch
发送给follower
保存当前选举论述waitForNewLeaderAck创建newLeaderProposal投票箱对象再进行一次newleader的确认,等待足够多的followers确认,则自己真的就为leader了。
获取follower的epoch zxid组装成StateSummary对象
获取leader的QuorumVerifier对象未??
lead()
getEpochToPropose(sid,epoch) 先将自己加入connectingFollower半数followers都投票为lead,则确认自己为leader否则leader进程会阻塞在这里除非timeout
N
lead开启socket等待follow请求,以便向follow同步数据
Y
QuorumPeer makeLeader()
QuorumPackettype:NEWLEADERzxid:zxid
开启CnxAcceptor线程 打开socket监听
注:Leader两个重要方法getEpochToPropose方法connectingFollowerswaitForEpochAckelectingFollower
new Leader() 初始化Leader 注入quorum对象 self;LeaderZk对象;创建ServerSocket对象;
选举结束后 节点都有自己状态这是leader节点打开监听follower需要将自己注册到主触发learnHandlergetEpochToPropose过半的follower连接了leader则leader可认为自己有效waitForEpochAckleader需要让所有follower确认参考:http://iwinit.iteye.com/blog/1775439
获取接收数据包,判断qptype是否为FOLLOWERINFO 或OBSERVERINFO
version 0x10000
ZxidUtils.getEpochFromZxid(qp.getZxid())获取follow最后一次epoch(逻辑时钟)lastAcceptedEpoch
确认后follower需要同步数据未 !!
follow的connectToLeader方法
创建 leaderStatSummary参数为currentEpoch zxid用于后面同步数据时对逻辑时钟的比较
ackEpochPacket判断type 是否 ACKEPOCH
和leaderStateSummary比较如果epoch大于当前或者在epoch相等情况下zxid大
将followerserverId放入electionFollowers 跟随者注册成功
electingFollower包括leader的id同时verifier.containsQuorum(electingFollowers)
0 条评论
下一页