选举是Zookeeper的重要技术之一,采用过半机制(Quorom)
选举算法图
image.pngimage.png
服务端启动时期的Leader选举过程
- 每个server(非Observer角色) 发起投票 (以 (myid,zxid)形式 投自己)
2.每个接收来自各个服务器的投票(接收其他loking,本周期选举的投票)
3.处理投票 (PK zxid大的为leader,zxid一样,myid大的为leader)
4.统计投票 (是否过半)
5.改变服务器状态 (选举完成leader后,follower更改成following状态,leader 更改成 leading状态)
服务端运行时期的Leader选举
1.变更状态(leader挂了,非Observer角色 变更为Looking 进入选举流程)
- 每个server(非Observer角色) 发起投票 (接收其他loking,本周期选举的投票)
3.每个接收来自各个服务器的投票
4.处理投票 (PK zxid大的为leader,zxid一样,myid大的为leader)
5.统计投票(是否过半)
6.改变服务器状态(选举完成leader后,follower更改成following状态,leader 更改成 leading状态)
方法栈跟踪
image.png image.png image.pngimage.png
image.png
image.png
image.png
方法栈总结
选举相关
>org.apache.zookeeper.server.quorum.QuorumPeer.startLeaderElection 开始leader选举
>org.apache.zookeeper.server.quorum.Vote 生成选举对象
>org.apache.zookeeper.server.quorum.QuorumPeer.createElectionAlgorithm 创建选举算法
>org.apache.zookeeper.server.quorum.QuorumCnxManager 过半选举策略管理器
>org.apache.zookeeper.server.quorum.FastLeaderElection pk选举总模板
>org.apache.zookeeper.server.quorum.FastLeaderElection.starter 开始器 发送与接收队列初始化 LinkedBlockingQueue
>org.apache.zookeeper.server.quorum.FastLeaderElection.Messenger.Messenger 启动俩个队列发送与接收队列 俩个线程
>org.apache.zookeeper.server.quorum.FastLeaderElection.Messenger.WorkerSender 发送队列
>org.apache.zookeeper.server.quorum.FastLeaderElection.Messenger.WorkerSender.process
>org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend
>org.apache.zookeeper.server.quorum.FastLeaderElection.Messenger.WorkerReceiver 接收外部选举队列 Buffer处理
>org.apache.zookeeper.server.quorum.QuorumCnxManager.pollRecvQueue
总结
所有非Observer 进入选举时,接收外部的投票,并根据zxid和myid,对自己投票和外部投票进行PK,统计投票,更改状态完成选举
参考
官网:http://zookeeper.apache.org
书籍:从Paxos到Zookeeper
网课: 推荐 慕课网 图灵学院 谷粒学院
网友评论