1. 核心特性概览
ZooKeeper 的设计目标是提供高性能、高可用的分布式协调服务,其核心特性可以概括为以下几点:
1.1 顺序一致性 (Sequential Consistency)
这是 ZK 最重要的特性。来自同一个客户端的更新请求,会严格按照其发送顺序被应用到 ZooKeeper 中。
- 原理:每个写请求都会被分配一个全局唯一的、单调递增的事务 ID (Zxid)。
1.2 原子性 (Atomicity)
更新操作要么成功,要么失败,没有中间状态。
- 原理:基于 ZAB 协议,Leader 只有在收到过半 Follower 的 ACK 后才会提交事务。
1.3 单一系统映像 (Single System Image)
无论客户端连接到集群中的哪个服务器(Leader 或 Follower),它看到的服务端数据模型都是一致的。
- 注意:严格来说,由于同步延迟,Follower 的数据可能会滞后于 Leader,但 ZK 保证客户端在同一个 Session 中看到的数据视图不会回退(Client-side FIFO Order)。
1.4 可靠性 (Reliability)
一旦一次更新被应用,它就会被持久化,直到下一次更新覆盖它。
1.5 实时性 (Timeliness)
ZooKeeper 保证在一定时间范围内,客户端能读到最新的数据。
- 注意:ZK 保证的是最终一致性,而不是强一致性(Linearizability)。如果需要读取绝对最新的数据,客户端在读取前可以调用
sync()方法。
2. CAP 理论中的定位
在 CAP 理论中,ZooKeeper 保证的是 CP(Consistency & Partition Tolerance)。
- C (一致性):ZK 保证数据的一致性(通过 ZAB 协议)。
- P (分区容错性):ZK 能够容忍网络分区。
- A (可用性):在 Leader 选举期间,集群对外不可用(无法处理写请求),因此牺牲了部分可用性。
3. 总结
面试官:你对 ZooKeeper 的特性有哪些了解?
候选人: ZooKeeper 的核心特性主要包括:
- 顺序一致性:这是最重要的,所有写操作都通过全局唯一的 Zxid 排序,保证了操作顺序。
- 原子性:所有事务请求要么全成功,要么全失败。
- 单一视图:客户端连接任意节点,看到的数据模型是一致的。
- 高可用:只要半数以上节点存活,集群就能正常工作。
从 CAP 角度来看,ZooKeeper 是一个 CP 系统。它优先保证一致性和分区容错性,在 Leader 选举期间会短暂牺牲可用性。