跳到正文
Elaine Blog
返回

Leader 选举与 ZAB 协议

分布式系统、协调与消息

ZAB(ZooKeeper Atomic Broadcast)解决的是:多台 ZooKeeper 服务器怎样对写入顺序达成一致,并在 Leader 崩溃后继续。你不需要先背状态名,先抓住 epoch、事务序号、法定人数和前缀日志四个不变量。

Table of contents

Open Table of contents

一次写入怎样提交

客户端写入先到 Leader。Leader 为事务分配 ZXID 并广播提案;获得法定人数确认后发布提交,Follower 按相同顺序应用。ZXID 可理解为由 Leader 周期(epoch)和周期内计数组成的事务标识。

读取可由连接到的服务器直接返回,所以默认不等同于“每次都读取最新 Leader 状态”。需要建立顺序边界时,应依据 ZooKeeper API 的一致性保证设计,而不是在客户端睡眠固定时间。

崩溃恢复做什么

新 Leader 必须拥有足够新的历史,并让法定人数成员的日志与之对齐。恢复阶段会补齐应该提交的前缀、丢弃未形成合法提交的分叉,再进入广播阶段。旧 Leader 恢复后不能凭旧 epoch 继续发提案。

三个常见误解:

  1. 收到 Leader 响应不等于所有副本都已落盘。
  2. Follower 数量越多,写吞吐不一定越高;一次提交要等待更多网络与磁盘工作。
  3. 只剩少数节点时拒绝写入是安全策略,不是选举失败的 bug。

用多数派建立直觉

运行实验室的法定人数测试下载

mvn -Dtest=DistributedMechanismsTest#snowflakeIdsIncreaseAndQuorumRequiresMajority test

5 节点集群可容忍 2 个节点不可用,3 个确认可提交。把节点放到故障域时还要考虑机架和可用区:5 个进程挤在同一台宿主机并不等于能抗两台机器故障。

下一步

继续阅读08-07 Paxos、Raft 与复制状态机,把 ZooKeeper 的具体协议提升为通用共识模型。


分享这篇文章:

上一篇
ZooKeeper 配置、选主、锁与注册发现
下一篇
Paxos、Raft 与复制状态机