Znode(数据节点)有几种类型?
Apache ZooKeeper 中的 Znode(数据节点)主要根据 生命周期(Lifecycle) 和 命名方式(Naming) 这两个维度进行分类。
最基础的类型有 4种,但在 ZooKeeper 3.5.x 版本之后,又新增了 2种 特殊类型。
以下是详细分类说明:
一、 基础的 4 种类型
这四种类型是由 PERSISTENT(持久)和 EPHEMERAL(临时)与 SEQUENTIAL(顺序)组合而成的。
1. 持久节点 (Persistent)
- 特性:这是默认的节点类型。一旦创建,除非客户端主动发起删除请求,否则该节点会一直存在于 ZooKeeper 中。即使创建它的客户端断开连接或 Session 过期,节点也不会消失。
- 适用场景:存储配置信息、路由信息等静态数据。
2. 临时节点 (Ephemeral)
- 特性:节点的生命周期与客户端的 Session(会话) 绑定。如果客户端会话失效(如断网、宕机、心跳超时),该节点会被 ZooKeeper 自动删除。
- 重要限制:临时节点不能拥有子节点。
- 适用场景:服务注册与发现(Service Discovery)、检测机器存活状态。
3. 持久顺序节点 (Persistent Sequential)
- 特性:兼具持久节点的特性,但在创建节点时,ZooKeeper 会自动在节点名后面追加一个单调递增的数字后缀(例如:
node-0000000001)。 - 适用场景:生成全局唯一 ID、分布式队列(记录入队顺序)。
4. 临时顺序节点 (Ephemeral Sequential)
- 特性:兼具临时节点的特性(Session 断开即删除),同时也会自动追加单调递增的数字后缀。
- 适用场景:分布式锁(这是最经典的应用,如 Curator 框架实现的 InterProcessMutex)、分布式选主(Leader Election,通常编号最小的节点成为 Leader)。
二、 新增的特殊类型 (ZooKeeper 3.5.3+)
为了解决特定场景下的问题,新版本引入了以下类型:
5. 容器节点 (Container Node)
- 特性:主要用于作为子节点的容器。如果一个容器节点由于删除了最后一个子节点而变为空,ZooKeeper 的后台任务会在未来某个时刻将其删除。
- 适用场景:防止因业务逻辑遗漏而导致大量空的父节点残留(类似垃圾回收机制)。
6. TTL 节点 (Time To Live Node)
- 特性:这种节点在创建时可以指定一个过期时间(TTL)。如果该节点在 TTL 时间内没有被修改且没有子节点,它就会被自动删除。
- 注意:TTL 节点默认是禁用的,需要在系统配置(
zookeeper.extendedTypesEnabled=true)中开启。 - 适用场景:类似于 Redis 的过期键,用于缓存或限时任务。
总结表
| 类型 | 生命周期 | 是否自动编号 | 断开连接后 | 能否有子节点 |
|---|---|---|---|---|
| 持久 (Persistent) | 永久 (直到主动删除) | 否 | 存在 | 能 |
| 临时 (Ephemeral) | Session 期间 | 否 | 自动删除 | 不能 |
| 持久顺序 | 永久 | 是 | 存在 | 能 |
| 临时顺序 | Session 期间 | 是 | 自动删除 | 不能 |
面试重点提示:
如果面试官问“Znode 有几种”,通常回答 4种 即可,但如果能补充提到 容器节点 和 TTL 节点,会是很好的加分项。同时,务必记住 “临时节点不能有子节点” 这一特性。