4、收到全部 Server 复兴以后,就盘算出 zxid 最大的谁人 Server ,并将这个 Server 干系信息设置成下一次要投票的 Server 。
5、线程将当前 zxid 最大的 Server 设置为当前 Server 要保举的 Leader ,假如此时得胜的 Server 得到 n/2+1 的 Server 票数,设置当前保举的 Leader 为得胜的 Server ,将根据得胜的 Server 干系信息设置本身的状态,否则,继续这个过程,直到 Leader 被推选出来。
通过流程分析我们可以得出:要使 Leader 得到多数 Server 的支持,则 Server 总数必须是奇数 2n+1 ,且存活的 Server 的数量不得少于n+1 。每个 Server 启动后都会重复以上流程。
在规复模式下,假如是刚从瓦解状态规复的大概刚启动的 Server 还会从磁盘快照中规复数据和会话信息,Zookeeper 会纪录事件日记并定期举行快照,方便在规复时举行状态规复。
🦅 Zookeeper 选主流程(fast paxos)?
重点相识。这块在 《Zookeeper 源码分析 —— Zookeeper Leader 推选算法》 写的比力详细。
由于 LeaderElection 收敛速率较慢,以是 Zookeeper 引入了 FastLeaderElection 推选算法,FastLeaderElection 也成了Zookeeper默认的Leader推选算法。
FastLeaderElection 是标准的 Fast Paxos 的实现。它起首向全部 Server 发起本身要成为 Leader ,当别的 Server 收到发起以后,办理 epoch 和 zxid 的辩论,并继续对方的发起,然后向对方发送继续发起完成的消息。重复这个流程,末了肯定能推选出Leader。
FastLeaderElection 算法通过异步的通讯方式来网络别的节点的选票,同时在分析选票时又根据投票者的当前状态来作差别的处理处罚,以加速 Leader 的推选历程。
🦅 为什么 Zookeeper 集群保举节点数是单数?
在统计投票时,有个过半的概念,大于集群呆板数量的一半,即大于或即是(n/2+1)。那么我们来看看如下的统计:
集群数量至少正常运行数量允许挂掉的数量22 的半数为 1,半数以上最少为 2033 的半数为 1.5,半数以上最少为 2144 的半数为 2,半数以上最少为 3155 的半数为 2.5,半数以上最少为 3266 的半数为 3,半数以上最少为 42通过以上可以发现: