ZAB协议领导者选举机制
ZAB(ZooKeeper Atomic Broadcast)协议的领导者选举采用快速领导者选举(Fast Leader Election)机制,核心目标是快速选出数据最完整的节点作为新领导者,确保集群可用性。以下是选举过程的关键要点:
成员身份与状态
ZAB定义了三种成员身份和四种状态:
- 领导者(Leader):唯一主节点,处理所有写请求。
- 跟随者(Follower):参与投票和提案提交,可处理读请求。
- 观察者(Observer):无投票权的备份节点。
状态包括:
LOOKING:选举中,节点主动发起选举。FOLLOWING:跟随者状态。LEADING:领导者状态。OBSERVING:观察者状态。
选举流程
触发选举
跟随者检测到领导者失联后,状态变更为LOOKING,发起选举。每个节点创建自荐选票,格式为<proposedLeader, proposedEpoch, proposedLastZxid, node>,广播给所有节点。选票PK规则
节点收到选票后,按优先级比较:- 任期编号(Epoch):较大者优先。
- 最新事务ID(LastZxid):较大者优先。
- 节点ID(Cluster ID):较大者优先。
若对方选票更优,节点更新自身选票并重新广播。
选举终止条件
当某个候选者获得多数票(n/2 + 1),其状态变更为LEADING,其他节点变更为FOLLOWING,选举结束。
代码实现关键点
在ZooKeeper 3.6.0中:
- 状态定义:
QuorumPeer.ServerState枚举类管理节点状态(LOOKING/FOLLOWING/LEADING/OBSERVING)。 - 选举逻辑:
FastLeaderElection.lookForLeader()方法实现核心选举逻辑,包括选票比较和状态变更。
示例代码片段:
// ZooKeeper中成员状态定义publicenumServerState{LOOKING,FOLLOWING,LEADING,OBSERVING}设计核心思想
- 数据完整性优先:优先选举拥有最新事务的节点,避免数据丢失。
- 多数派原则:确保新领导者被多数节点认可,防止脑裂。
- 快速收敛:通过选票PK和广播机制快速达成一致。
实践建议
- 故障排查:若写请求失败,优先检查集群状态(
LEADING/FOLLOWING节点数量)。 - 参数调优:调整
electionAlg(选举算法)和initLimit(初始化超时)以适应网络环境。
通过理解选举机制,可有效维护ZooKeeper集群的高可用性。