1. 核心概念
ZooKeeper 的数据模型是一个树形结构(Tree-like Structure),非常类似于 Linux 的文件系统。
- 树中的每个节点被称为 ZNode。
- 每个 ZNode 都有一个唯一的路径标识(如
/app/config)。 - ZNode 既可以存储数据,也可以拥有子节点(Ephemeral 节点除外)。
2. ZNode 的类型(关键考察点)
ZNode 的类型由 生命周期(Lifecycle) 和 顺序性(Sequential) 两个维度组合而成,主要有 4 种(ZK 3.5+ 新增了容器节点等,但面试主要考这 4 种):
2.1 持久节点 (Persistent)
- 特性:一旦创建,除非客户端主动删除,否则一直存在。即使创建它的客户端断开连接,节点也不会消失。
- 场景:存储静态数据,如配置信息、数据库地址、服务根路径。
2.2 临时节点 (Ephemeral)
- 特性:生命周期与客户端会话(Session)绑定。如果客户端断开连接(Session 失效),该节点会被 ZooKeeper 自动删除。
- 限制:临时节点不能拥有子节点。
- 场景:服务注册发现(服务下线自动剔除)、集群管理(节点存活监控)。
2.3 持久顺序节点 (Persistent Sequential)
- 特性:具有持久节点的特性,同时 ZK 会在节点名后面自动追加一个单调递增的 10 位数字后缀(如
node-0000000001)。 - 场景:分布式唯一 ID 生成(虽然性能一般)、持久化队列。
2.4 临时顺序节点 (Ephemeral Sequential)
- 特性:具有临时节点的特性,同时也会自动追加递增后缀。
- 场景:分布式锁(最经典场景)。客户端创建临时顺序节点,序号最小的获得锁,断开连接自动释放。
3. 深入理解
- 数据存储:ZNode 存储的数据通常很小(KB 级别),它是为了协调而生,不是为了存海量数据。
- 原子性:对 ZNode 的读写操作都是原子的。读会读取整个数据,写会替换整个数据。
- 版本控制:每个 ZNode 都维护着一个
Stat数据结构,记录了czxid(创建事务ID)、mzxid(修改事务ID)、version(数据版本)等。CAS(Compare And Swap)操作就是基于version实现的。
4. 总结
面试官:ZNode 有几种类型?ZooKeeper 的数据模型是什么样的?
候选人: ZooKeeper 的数据模型是一个类似 Linux 文件系统的树形结构,每个节点叫 ZNode。
ZNode 主要有 4 种类型,根据生命周期和顺序性划分:
- 持久节点 (Persistent):一直存在,直到主动删除。用于存储配置、路由表等静态数据。
- 临时节点 (Ephemeral):生命周期与客户端会话绑定,会话断开则自动删除。不能有子节点。常用于服务注册和心跳检测。
- 持久顺序节点:持久且带递增序号。
- 临时顺序节点:临时且带递增序号。这是实现分布式锁的核心基础。
这种模型简单高效,完美契合了分布式协调中“状态同步”和“存活感知”的需求。