1. 核心概念

顺序一致性 (Sequential Consistency) 是 ZooKeeper 的招牌特性。它保证了来自同一个客户端的更新请求,严格按照发送顺序生效;同时,所有 Server 都会按照相同的顺序处理全局的写请求。

2. 实现原理:Zxid

ZooKeeper 实现顺序一致性的核心机制是 Zxid (ZooKeeper Transaction Id)

2.1 什么是 Zxid?

Zxid 是一个 64 位的数字,由两部分组成:

  • 高 32 位 (Epoch):代表 Leader 的纪元(Era)。每当选举出新的 Leader,Epoch 加 1。这保证了旧 Leader 发出的提案不会干扰新 Leader。
  • 低 32 位 (Counter):是一个单调递增的计数器。在同一个 Epoch 内,每处理一个写请求,Counter 加 1。

2.2 如何保证顺序?

  1. 全局有序:所有的写请求(事务)都必须由 Leader 节点处理。
  2. 分配 Zxid:Leader 接收到写请求后,会为该请求分配一个全局唯一的 Zxid。
  3. FIFO 广播:Leader 通过 ZAB 协议,按照 Zxid 的顺序,将 Proposal(提案)广播给所有 Follower。
  4. 顺序提交:Follower 接收到 Proposal 后,严格按照 Zxid 顺序写入事务日志并反馈 ACK。Leader 统计 ACK,满足过半后,再按照 Zxid 顺序发送 Commit 消息。

3. 客户端层面的顺序

除了服务端的全局有序,ZK 还保证 Client-side FIFO Order

  • 如果一个客户端发出了请求 A,然后发出了请求 B,那么服务端必定是先执行 A,再执行 B。
  • 这是通过 TCP 连接的有序性以及 Server 端处理管线(Pipeline)保证的。

4. 总结

面试官:ZooKeeper 如何保证事务的顺序一致性?

候选人: ZooKeeper 保证顺序一致性的核心在于 ZxidLeader 统一处理写请求

具体流程是:

  1. 所有的写请求都会被转发给 Leader
  2. Leader 为每个请求分配一个全局唯一的 64 位 Zxid。Zxid 的高 32 位是纪元号,低 32 位是自增计数器,这保证了全局唯一和单调递增。
  3. Leader 严格按照 Zxid 的顺序,通过 ZAB 协议向 Followers 广播提案(Proposal)和提交(Commit)指令。
  4. Followers 也是严格按照接收到的 Zxid 顺序来应用事务。

这样就保证了所有节点上的数据变更顺序是完全一致的。