目录

  1. ZNode 概述
  2. ZNode 的主要特性
  3. ZNode 的类型与特性
  4. ZNode 的元数据特性
  5. 操作示例
  6. 参考资料

ZNode 概述

ZNode 是 ZooKeeper 数据模型的核心单元,类似于文件系统中的文件或目录。它既可以存储数据,也可以作为路径的一部分组织层次结构。ZNode 的特性使其非常适合分布式协调任务,如配置管理、锁机制和领导者选举。


ZNode 的主要特性

  1. 层次化命名空间
  • ZNode 按树形结构组织,根节点为 /,路径用斜杠分隔(例如 /app/config)。
  • 子节点依赖父节点存在,创建子节点前必须确保父节点已存在。
  1. 数据存储
  • 每个 ZNode 可以存储少量数据,默认最大限制为 1MB。
  • 适合存储键值对、配置信息或状态数据,不适合大文件。
  1. 原子性操作
  • 对 ZNode 的读写操作是原子的,保证数据一致性。
  • 更新操作要么完全成功,要么完全失败。
  1. 版本控制
  • 每个 ZNode 维护版本号(dataVersion),每次数据更新时递增。
  • 支持乐观锁机制,通过指定版本号进行条件更新。
  1. Watcher 机制
  • 客户端可以为 ZNode 设置 Watcher,监听数据变化或子节点变化。
  • Watcher 是一次性的,触发后需重新注册。

ZNode 的类型与特性

ZNode 根据生命周期和行为分为多种类型,每种类型有特定特性:

  1. 持久节点 (Persistent ZNode)
  • 特性:创建后永久存在,除非显式删除。
  • 用途:存储静态配置或长期数据。
  • 创建方式create /path data
  1. 临时节点 (Ephemeral ZNode)
  • 特性:与创建它的客户端会话绑定,会话结束(超时或关闭)后自动删除。
  • 限制:不能有子节点。
  • 用途:动态成员管理、分布式锁。
  • 创建方式create -e /path data
  1. 顺序节点 (Sequential ZNode)
  • 特性:节点名称自动追加 10 位递增序号(例如 /path0000000001)。
  • 组合:可以是持久顺序或临时顺序节点。
  • 用途:任务队列、唯一标识生成。
  • 创建方式create -s /path data(持久顺序)或 create -e -s /path data(临时顺序)。
  1. 容器节点 (Container ZNode)(3.5.3+)
  • 特性:持久节点,当最后一个子节点删除时,容器节点自动删除。
  • 用途:管理临时子节点集合。
  • 创建方式create -c /path
  1. TTL 节点 (TTL ZNode)(3.6.0+)
  • 特性:持久节点,设置生存时间(TTL),到期后自动删除。
  • 要求:需在服务器配置中启用 TTL 支持(zookeeper.extendedTypesEnabled=true)。
  • 用途:自动清理过期数据。
  • 创建方式:通过 API 指定 TTL(CLI 不直接支持)。

ZNode 的元数据特性

每个 ZNode 都有元数据,记录其状态和历史,客户端可以通过 stat 命令或 API 获取。主要字段包括:

  • czxid:创建时的事务 ID。
  • mzxid:最后修改的事务 ID。
  • ctime:创建时间(毫秒级时间戳)。
  • mtime:最后修改时间。
  • dataVersion:数据版本号,每次 set 操作递增。
  • cversion:子节点版本号,子节点变化时递增。
  • aversion:ACL 版本号,权限变化时递增。
  • ephemeralOwner:临时节点的会话 ID(持久节点为 0)。
  • dataLength:数据字节长度。
  • numChildren:子节点数量。
  • pzxid:子节点最后修改的事务 ID。

元数据的作用

  • 版本控制dataVersion 用于乐观锁,确保更新时的并发一致性。
  • 临时性标识ephemeralOwner 跟踪会话归属。
  • 调试:提供节点的历史和状态信息。

操作示例

以下通过 zkCli.sh 展示 ZNode 特性的实际操作。

启动客户端

zkCli.sh -server localhost:2181
  1. 创建持久节点
   create /config "app settings"
   get /config

输出:app settings

  1. 创建临时节点并测试会话
   create -e /temp "session data"
   get /temp
   quit

重新连接后:

   ls /

/temp 已删除。

  1. 创建顺序节点
   create -s /queue "task1"
   create -s /queue "task2"
   ls /queue

输出:[queue0000000001, queue0000000002]

  1. 使用 Watcher
   get -w /config
   set /config "new settings"

输出:

   WATCHER::
   WatchedEvent state:SyncConnected type:NodeDataChanged path:/config
  1. 查看元数据
   stat /config

检查 dataVersion 等字段变化。


参考资料


这是 ZooKeeper ZNode 特性的全面解析,涵盖层次结构、类型和元数据。如果您需要特定特性的深入应用场景(例如顺序节点在队列中的使用),请告诉我!