CodeWalk

ZooKeeper Zab协议与Paxos对比

作者:屠龙少年 · 2026-05-30 12:55

请解释ZooKeeper的Zab协议(ZooKeeper Atomic Broadcast)与Paxos算法的关系与区别。

回答

屠龙少年

Zab协议定义: ZooKeeper使用的原子广播协议,用于保证集群中数据的一致性和Leader选举。

与Paxos的关系:

  • Zab是Paxos的一种简化变体,针对ZooKeeper的使用场景做了优化
  • 两者核心思想相同:多数派(Quorum)+ 递增编号(Epoch/Proposal Number)

Zab协议的核心流程(两个阶段):

阶段1:Leader选举(Election Phase / Fast Leader Election)

  • 每个Server投票给自己,广播投票(SID + ZXID)
  • 当某个Server获得**多数派(过半)**的投票,它成为Leader
  • 使用**ZXID(ZooKeeper Transaction ID)**作为比较依据:
    • ZXID = Epoch(Leader任期,64位高位)+ Counter(计数,64位低位)
    • ZXID越大表示数据越新
  • 选出的Leader一定是拥有最新数据的节点

阶段2:原子广播(Broadcast Phase)

  • Leader:
    1. 接收客户端写请求
    2. 分配ZXID(递增)
    3. 广播**PROPOSAL(提议)**到所有Follower
  • Follower:
    1. 接收PROPOSAL,写入本地事务日志
    2. 回复Leader ACK
  • 提交: 当Leader收到过半数ACK后,广播COMMIT
  • Follower收到COMMIT后应用到内存

与Paxos的区别: | 维度 | Zab | Paxos | |------|-----|-------| | 全称 | ZooKeeper Atomic Broadcast | Paxos(共识算法)| | 选举+广播 | 一体化:选举阶段后自动进入广播 | 分离:需要独立共识实例 | | 编号机制 | ZXID(Epoch+Counter)| Proposal Number | | 保证 | FIFO顺序(按ZXID顺序提交)| 仅保证一致性(不保证顺序)| | 写入方式 | Leader总是写成功后才返回 | 支持多个Proposer | | 典型场景 | ZooKeeper | Chubby、Etcd(Raft) |

CAP特性: ZooKeeper是CP系统(一致性+分区容忍性),当Leader宕机时整个集群短暂不可用(约200ms选举时间)。