选举机制
PPG007 ... 2021-12-28 About 2 min
# 选举机制
# 第一次启动时选举机制
假设有五台服务器:
- 第一台服务器启动,发起一次选举,投自己一票,此时这台服务器票数不够一半(3),选举无法完成,服务器保持 LOOKING。
- 第二台服务器启动,发起选举,两台服务器先把票投给自己并交换信息,第一台服务器发现第二台服务器的 myid 比自己大,就将票重新投给了第二台服务器,此时第一台 0 票,第二台 2 票,此时还是没有服务器达到一半票数(3),全部保持 LOOKING。
- 第三台服务器启动,发起一次选举,与上面相同,票都到了三号服务器,此时达到了半数以上,三号服务器成为 leader,状态为 LEADING,1、2 号服务器状态为 FOLLOWING。
- 第四台服务器启动,发起一次选举,此时服务器 1、2、3 不是 LOOKING 状态,不会更改选票信息。服务器四有一票,服从多数把票投给三号服务器,状态变为 FOLLOWING。
- 第五台服务器启动,与第四台服务器流程相同。
# 非第一次启动时的选举机制
当 ZooKeeper 集群中一台服务器出现以下两种情况之一,就会开始进入 Leader 选举:
- 服务器初始化启动。
- 服务器运行期间无法和 Leader 保持连接。
当一台服务器进入选举流程时,集群可能的状态:
- 集群中已经有 Leader。
- 集群中确实没有 Leader。
SID:服务器 ID,与 myid 一致,唯一标识。
ZXID:事务 ID,用来标识一次服务器状态的变更。
Epoch:每个 Leader 任期中的代号,每次投完一次票这个值就会增加。
现在假设 3、5 号服务器掉线,1、2、4 号服务器开始选举。
选举规则:
- Epoch 大的直接胜出。
- Epoch 相同,ZXID 大的胜出。
- ZXID 相同,SID 大的胜出。