*** 纵大选又引发卡塔尔断交潮的"俄罗斯黑客"有多牛?

 *** 纵大选又引发卡塔尔断交潮的"俄罗斯黑客"有多牛?,第1张

QuorumPeer继承了ZooKeeperThread线程类
orgapachezookeeperserverquorumQuorumPeer#run
本地或远程注册

在循环内根据不同的状态运行

1、readonlymode
首先判断只读模式是否打开readonlymodeenabled默认是false

2、进行领导者选举

表示:zk1、zk2、zk3三台zk服务端(myid1=1、epoch1当前届数、zxid1是当前zk1服务的状态信息)。图中连线0表示把投给自己的选票并放入sendqueue队列中,图中连线1表示发送给其他参与者(即是调用sendNotifications方法),2表示从recvqueue接收队列获取的选票与当前服务器持有选票进行比较。
orgapachezookeeperserverquorumFastLeaderElection#lookForLeader

1、第一次启动,默认投自己,并更新当前服务协议的领导者信息的值proposedLeader、proposedZxid、proposedEpoch

4、从recvqueue不断获取收到的投票信息
其他服务器的投票或投给自己的都放到这里

②、connectAll建立连接
orgapachezookeeperserverquorumQuorumCnxManager#connectAll

orgapachezookeeperserverquorumSyncedLearnerTracker#hasAllQuorums
是否过半判断

领导者角色已经确立,其他服务器启动角色处理
recvqueue数据是从MessengerWorkerReceiver线程不断获取的
1、WorkerReceiver#run
orgapachezookeeperserverquorumFastLeaderElectionMessengerWorkerReceiver#run

2、不是有效的投票者
!validVoter(responsesid)表示是观察者
这里也进行了处理,把当前current的投票放入到sendqueue并返回给当前启动的那台服务器(通过responsesid)

把当前服务得到的currentVote放入到sendqueue队列,并返回发送给这台服务器

1、FOLLOWING节点挂了一半
orgapachezookeeperserverquorumLeader#lead

不断向learners节点ping,如果挂了一半则会跳出循环leaderlead();阻塞被解除

orgapachezookeeperserverquorumQuorumPeer#updateServerState

领导者选举算法核心就是把选票封装并放入到sendqueue集合发送,通过recvqueue得到其他服务节点的选票。并不断比较PK,更改选票并不断发送,并验证是否过半。如果过半则选举出来领导者。
领导者选举触发情况:刚启动、FOLLOWING节点挂了一半、LEADING节点挂掉

>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10325156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存