答案
Zookeeper 的 Leader 选举机制是保证集群高可用性的核心,基于 ZAB 协议实现。
选举触发时机
- 集群启动时:所有节点参与选举,选出 Leader
- Leader 故障时:Follower 检测到 Leader 失效,触发重新选举
- Leader 主动退出:Leader 正常关闭,触发选举
选举算法
Zookeeper 使用 Fast Leader Election(快速领导者选举)算法:
投票结构:
- sid:服务器 ID,配置文件中指定
- zxid:事务 ID,表示数据更新次数
- epoch:选举周期,每次选举递增
选举规则:
- 优先比较 zxid:zxid 越大,数据越新,优先当选
- 其次比较 sid:zxid 相同时,sid 越大优先当选
选举流程
-
初始化投票:
- 每个节点先投票给自己
- 投票信息:(epoch, zxid, sid)
-
投票交换:
- 节点之间互相交换投票信息
- 更新自己的投票状态
-
投票统计:
- 统计每个候选者的得票数
- 超过半数节点支持的候选者当选
-
选举完成:
- 当选者成为 Leader
- 其他节点成为 Follower
- Leader 开始处理请求
选举状态
节点在选举过程中有以下状态:
- LOOKING:正在寻找 Leader,参与选举
- FOLLOWING:已找到 Leader,作为 Follower 运行
- LEADING:作为 Leader 运行
- OBSERVING:作为 Observer 运行
选举优化
快速选举:
- 节点优先投给数据更新最多的节点
- 减少投票轮次,加快选举速度
投票验证:
- 验证投票信息的合法性
- 防止无效投票干扰选举
超时机制:
- 设置合理的选举超时时间
- 避免选举长时间阻塞
集群规模影响
- 3 节点集群:2 个节点同意即可选举成功
- 5 节点集群:3 个节点同意即可选举成功
- 7 节点集群:4 个节点同意即可选举成功
注意事项
- 脑裂问题:通过过半机制避免
- 网络分区:分区后无法选举出 Leader
- 选举时间:通常在几秒内完成
- 数据一致性:选举期间不处理写请求