zookeeper3.6.1版本源码----zookeeper选举leader--by闫明
2021-12-24 21:47:15 0 举报
zookeeper3.6.1版本源码----zookeeper选举leader
作者其他创作
大纲/内容
选票pk
queuesendMap
start方法
选举逻辑
N
变更内部选票
poll数据
判断单机还是集群
Y
super.start()启动线程
receivequeue
是否变更选票
选票得到仲裁
logicalclock++
sendNotifications()发送通知
sendNotification
WorkerSender
判断选举轮次
完成选举
start()启动两个守护线程,一个用于发送票据,一个用于接收票据WorkerSender()。startWorkerReceiver().start()
获取QuorumCnxnManger对象oldQcm,不是null则终止掉,说明已经开启了选举
loadDataBase()加载数据
QuorumCnxnManager
createEletionAlgorithm(electionTyep)创建选举算法
sendqueue
recvWorker
socket通信
startServerCnxnFactory()启动2181服务监听
内部大于外部
zookeeper3.6.1版本源码QuorumPeer 线程对象,继承ZookeeperThread,重写了start()方法
更新logicalclock
更新投票的提案是自己的信息
DatadirCleanManager管理日志清理相关的线程
ZookeeperServerMain
FastLeaderElection
FastLeaderElection.lookingLeader
发送选票
创建一个集群中的节点QuorumPeer
清空reset
节点状态是looking时
QuorumPeerMain
sendWorker
myid/zxid/epoch
统计选票
recvQueue
mainloop使用while循环(running)获取状态,leading,following,looking,oberving
归档选票
验证收到的vote的sid和leader是否合法(就是myid是否合法)
集群的话ServerCnxnFactroy
main()解析zoo.cfg文件
判断myid是否在当前集群配置的myid范围内
recvSet
当前节点是looking状态就一直接收集群中任意一个节点发来的票据(在recvqueue中poll),然后进行对比
startJVMPauseMonitior()启动jvm暂停监控
开启listener监听集群中的票据
WorkerReceiver
创建QuorumCnxnManger对象qcm,用于集群管理
run()
轮次一致
初始化leader选举算法
队列中没有数据后,设置最终投票状态
初始化revset
在recvqueue中没有数据时,若manager中存在需要投递的票据,则重新发送;否则使用延迟重试的方式重新连接其他节点
启动2181监听
解析zoo.cfg
集群中已经选出leader,再次循环一下recvqueue中vote,看看是否有变化
更新服务器状态
runFromConfig()监听2181端口,发送指标数据到jmx
开始选举
startLeaderElection()发起选举
从快照恢复数据loadDataBase(),最新的ezxid(事物id),当前的epoch
发送选票(自己)
注册jms上报数据,发布指标
原子递增逻辑时钟也就是epoch
若选举终止,则开始选举,获取leader的vote(lookForLeader())并设置leader的vote
synchronized(this)代码块中执行
lookForLeader()
looking状态
接收外部选票
外部大于内部
若收到的vote比自己的epoch,zxid,myid大则设置自己的为接受到vote,并发送出去;比自己小则不处理;判断是否过半,过半则设置leader节点vote
0 条评论
下一页