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 种类型,根据生命周期和顺序性划分:

  1. 持久节点 (Persistent):一直存在,直到主动删除。用于存储配置、路由表等静态数据。
  2. 临时节点 (Ephemeral):生命周期与客户端会话绑定,会话断开则自动删除。不能有子节点。常用于服务注册和心跳检测。
  3. 持久顺序节点:持久且带递增序号。
  4. 临时顺序节点:临时且带递增序号。这是实现分布式锁的核心基础。

这种模型简单高效,完美契合了分布式协调中“状态同步”和“存活感知”的需求。