文章内容收录到个人网站,方便阅读:hardyfish.top/
ZAB(Zookeeper Atomic Broadcast)是 ZooKeeper 专门设计的一种原子广播协议,用于保证 数据一致性 和 故障恢复。它主要用于 主从复制(Leader-Follower) ,并确保 写请求(事务)严格有序,同时保证集群在发生 Leader 失效 时能正确恢复。
1. ZAB 协议核心目标
-
保证数据一致性
- ZooKeeper 采用 强一致性(Linearizability) ,所有写入(事务)按顺序执行。
-
支持主从复制
- 通过 Leader 负责写操作,Follower 只进行读操作,确保数据同步。
-
故障恢复(Crash Recovery)
- 发生故障后,保证恢复一致状态,并选举新 Leader 继续服务。
2. ZAB 工作流程
ZAB 主要由两个阶段组成:
- 崩溃恢复(Crash Recovery)阶段:当 Leader 崩溃或网络分区时,集群需要选举一个新的 Leader 并同步数据,确保一致性。
- 消息广播(Atomic Broadcast)阶段:当集群稳定后,Leader 通过 ZAB 协议进行事务同步,确保所有 Follower 都接收到相同的事务。
2.1 崩溃恢复阶段(Leader 选举 & 数据同步)
如果 ZooKeeper 发现 Leader 宕机或发生了网络分区,它会进入 恢复模式,重新选举新的 Leader 并确保数据一致。
步骤
-
选举 Leader:
- 使用 ZAB 选举算法(基于 ZXID 最大值)。
- 拥有最大事务 ID(ZXID)的节点 优先成为 Leader。
- 选举完成后,Leader 进入 "LOOKING" 状态,等待 Follower 连接。
-
同步数据:
- Follower 连接到新的 Leader,检查 Leader 最新的数据状态。
- 如果 Follower 落后于 Leader,Leader 发送缺失的事务日志,Follower 进行同步。
- 只有当大多数(Quorum)Follower 完成同步后,Leader 才能进入 BROADCAST(广播)模式,开始正常处理请求。
2.2 消息广播阶段(Atomic Broadcast)
当 Leader 进入 正常状态(Broadcasting) 后,它会通过 ZAB 原子广播协议 处理事务请求。
写请求流程
-
客户端发送写请求到 Leader。
-
Leader 生成全局递增的事务 ID(ZXID) :
ZXID = [epoch(时期) | counter(递增计数)]- 确保所有事务有全局唯一的执行顺序。
-
Leader 发送
PROPOSAL给所有 Follower :- 事务以
PROPOSAL形式广播给所有 Follower。
- 事务以
-
Follower 接收
PROPOSAL并返回ACK:- 当过半 Follower (
Quorum) 确认后,Leader 发送COMMIT。
- 当过半 Follower (
-
Leader 发送
COMMIT并持久化:- Leader 持久化事务日志 并发送
COMMIT给所有 Follower。 - Follower 执行事务 并返回确认。
- Leader 持久化事务日志 并发送
示例
客户端 -> Leader -> Follower1, Follower2, Follower3
写请求 -> 事务 ZXID=0x10001 (Proposal) -> Ack
<- 事务已提交 (Commit) <-
3. ZAB 关键特性
3.1 ZXID(Zookeeper Transaction ID)
-
全局唯一
事务 ID,格式如下:
ZXID = [epoch | counter]- epoch(时期) :每次 Leader 选举时递增,标记不同的 Leader 时代。
- counter(计数器) :在同一时代内,每个事务递增,保证顺序。
示例
0x10000001代表epoch=1, counter=10x10000002代表epoch=1, counter=2
作用
- 通过
ZXID选举 Leader(拥有最大 ZXID 的服务器会当选)。 - 事务严格按照
ZXID顺序执行,确保一致性。
3.2 选举算法
ZooKeeper 采用 Fast Leader Election(FLE) 选举算法:
- 选举过程中,服务器会向其他服务器发送投票,选择 ZXID 最大的节点 作为 Leader。
- 只有当超过半数(Quorum) 的节点确认后,Leader 才能正式生效。
3.3 事务一致性
ZAB 采用 过半确认机制(Quorum) ,确保 Leader 提交事务前,至少半数 Follower 先收到:
- 只有当
N/2 + 1以上的 Follower 确认后,事务才会COMMIT。 - 这样即使部分 Follower 宕机,事务仍然可以继续。
4. ZAB vs Paxos vs Raft
| 协议 | 用途 | 特点 |
|---|---|---|
| ZAB | ZooKeeper 强一致性 | 适用于 主从复制,支持崩溃恢复 |
| Paxos | 分布式共识协议 | 适用于 分布式数据库,但实现复杂 |
| Raft | 简化版 Paxos | 适用于 分布式 KV 存储,选举更高效 |
5. 总结
- ZAB 主要用于 ZooKeeper 复制和一致性保证,由 崩溃恢复 + 原子广播 组成。
- Leader 负责处理写请求,Follower 负责读请求,通过 ZAB 原子广播协议 保证数据一致。
- 事务采用
ZXID严格有序提交,通过 过半确认(Quorum)机制 确保强一致性。 - 如果 Leader 崩溃,ZAB 进入恢复模式,选举最大
ZXID服务器作为新的 Leader。
总结一句话: ZAB 通过 Leader-Follower 复制 + 事务广播,确保 ZooKeeper 在 高可用、强一致 的分布式环境下正确运行。