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节点挂掉>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)