ZooKeeper Leader选举详解
Leader选举是ZooKeeper集群高可用的核心机制。
Leader选举算法
FastLeaderElection算法:
Bash
投票比较规则:
1. ZXID越大越优先(数据最新)
2. ZXID相同则myid越大越优先
3. 获得过半投票成为Leader
投票信息:
| 字段 | 说明 |
|---|---|
| sid | 投票者ID(myid) |
| zxid | 事务ID |
| leader | 推举的Leader ID |
| epoch | 选举纪元 |
选举流程:
properties
1. 所有节点状态LOOKING
2. 各节点发起投票(投自己)
3. 收到其他节点投票后比较
4. 更新投票给更优者
5. 统计投票数,过半者当选
6. 节点状态变为LEADING/FOLLOWING
投票比较示例:
properties
节点A: zxid=0x100, myid=1
节点B: zxid=0x101, myid=2
节点C: zxid=0x100, myid=3
比较结果:
B的zxid最大 → 节点B当选Leader
选举时间线:
| 阶段 | 时间 |
|---|---|
| 发起投票 | 立即 |
| 投票收集 | 数秒 |
| 选举完成 | <10秒 |
选举状态:
text
# 查看选举后状态
zkServer.sh status
# 输出
Mode: leader ← Leader节点
Mode: follower ← Follower节点
提示:ZXID越大说明数据越新,优先当选保证数据完整性。
选举配置参数
关键参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
| tickTime | 2000ms | 心跳时间单位 |
| initLimit | 10 | 初始化超时倍数 |
| syncLimit | 5 | 同步超时倍数 |
| electionAlg | 3 | 选举算法版本 |
超时计算:
text
初始化超时 = tickTime × initLimit = 2000 × 10 = 20秒
同步超时 = tickTime × syncLimit = 2000 × 5 = 10秒
配置示例:
text
# zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
# 高延迟网络调整
tickTime=4000
initLimit=20
syncLimit=10
参数调整建议:
| 场景 | 建议 |
|---|---|
| 正常网络 | 默认值 |
| 高延迟网络 | 增大tickTime和倍数 |
| 快速选举 | 减小倍数(但不稳定) |
electionAlg说明:
| 值 | 说明 |
|---|---|
| 0 | UDP单播(已废弃) |
| 1 | UDP多播(已废弃) |
| 2 | UDP快速(已废弃) |
| 3 | TCP快速(默认,推荐) |
选举端口:
text
# server.N配置中第二个端口为选举端口
server.1=host1:2888:3888
# 3888为选举端口
注意:高延迟网络需增大initLimit避免选举超时。
要点总结
- FastLeaderElection基于过半投票机制
- 投票比较:ZXID优先、myid次优
- 选举时间约数秒完成
- initLimit控制Follower初始化超时
- syncLimit控制心跳同步超时
- electionAlg=3使用TCP快速选举(默认)
- 高延迟网络需增大超时参数
📝 发现内容有误?点击此处直接编辑