Zookeeper选举Leader源码剖析(二)

maven版本尽量3.5版本以上,jdk1.8

 1.选举流程

如果其他服务器sid小于自己的sid,直接关闭socket连接,这么做的原因是为了减少连接

 如果相同,打印警告信息,如果远端sid大于自己的sid,建立发送线程,接收线程

 

 sendWorker.start,直接看run方法逻辑:
从阻塞队列中拿到消息

1.2 recver.run方法

读取远端服务器socker消息

 

整体选票逻辑,业务层丢入sendqueue-workerSender-queueSendMap发送队列选票消息,然后将选票信息发送到远端服务器和自己的recvWorker接收->recvQueue队列中,生成选票。 

 

wokersender构建选票

 mysid等于sid加入到传输层队列,如果不相等丢到queuesendMap中

 

 fastleaderElection选举算法:初始化状态looking

 真实的选票逻辑:newEpoch等于curEpoch,先比较zxid并且比较newID,curId,

updateProposal:更新选票,下次投票投竞争出来的选票

sendNotifications:将选出的选票发送给其他机器

 

 

 termPredicadate:将选出来的选票放入voteSet并且进行半数比较

 

 

 半数比较逻辑:比较投票机器数量是否大于半数half

half:投票数/2

 

 

 

  返回为true以后,如果自己PK赢了,将自己设置为leading,否则,将当前状态设置为following

 

 当一次选举以后状态更改,看leading和following,当第三个机器收到选票会比较当前状态是否是looking,

 

 当第三台机器进来以后会走follwoing和leading,首先比较当前周期,进行上面的选票比较逻辑。最后设置当前选举状态

 

猜你喜欢

转载自blog.csdn.net/qq_21575929/article/details/126217768
今日推荐