3. ZooKeeper - 集群模式Leader选举及客户端请求处理
2021-03-30 16:53:07 0 举报
登录查看完整内容
ZooKeeper Leader选举原理和客户端请求处理逻辑
作者其他创作
大纲/内容
Leader.startZkServer();
sendNotifications();通知其他节点当前自己的选票
获取节点状态
设置选票为自己
创建选举算法并启动FastLeaderElection
开启请求节流阀,对客户端请求做限流熔断,基于计数器的方式
追赶选举周期并清空落后的选票
startRequestThrottler();
继续接收选票
通过节流阀
FOLLOWING / LEADING
初始状态为Looking即需要找到Leader
接收到选票
process
同样通过接收选票来比较是否有过半选票
接收选票
通过异步责任链处理请求
LEADING
假设ABC,选票优先关系:A>B>C当BC之间协商出B为Leader时,A仍然有机会成为Leader
Clear
FOLLOWING
((newEpoch > curEpoch) || ((newEpoch == curEpoch) && ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));
否
LOOKING
recvset用于存储:LOOKING,FOLLOWING,LEADING 状态节点的选票
Processor
过半时检查Leader并设置当前状态和选票状态
LearnerZooKeeperServer.startup();
时钟周期是否落后
firstProcessor
当前节点可能是新加入的节点或延迟等原因造成选举的时钟周期落后
recvset.put接收选票
follower.followLeader();
选举完成
此时为已经拥有Leader的情况
回到QuorumPeer
未再接收到选票
totalOrderPredicate预测失败的话重新放回recvqueue
outofelection用于存储:FOLLOWING,LEADING 状态节点的选票,代表集群中已有Leader的情况
leader.lead();
lookForLeader()寻找leader
FinalRequestProcessor
syncWithLeader(newEpochZxid);
startLeaderElection()
是
选票对比,重新设置当前节点选票
优先比较任期,最新的事务ID,当前节点ID
已选出leader,设置当前节点状态和最终选票后退出
判断当前选票是否已经过半赞同
lookForLeader()方法
0 条评论
回复 删除
下一页