目录
ZNode 概述
ZNode 是 ZooKeeper 数据模型的核心单元,类似于文件系统中的文件或目录。它既可以存储数据,也可以作为路径的一部分组织层次结构。ZNode 的特性使其非常适合分布式协调任务,如配置管理、锁机制和领导者选举。
ZNode 的主要特性
- 层次化命名空间
- ZNode 按树形结构组织,根节点为
/
,路径用斜杠分隔(例如/app/config
)。 - 子节点依赖父节点存在,创建子节点前必须确保父节点已存在。
- 数据存储
- 每个 ZNode 可以存储少量数据,默认最大限制为 1MB。
- 适合存储键值对、配置信息或状态数据,不适合大文件。
- 原子性操作
- 对 ZNode 的读写操作是原子的,保证数据一致性。
- 更新操作要么完全成功,要么完全失败。
- 版本控制
- 每个 ZNode 维护版本号(
dataVersion
),每次数据更新时递增。 - 支持乐观锁机制,通过指定版本号进行条件更新。
- Watcher 机制
- 客户端可以为 ZNode 设置 Watcher,监听数据变化或子节点变化。
- Watcher 是一次性的,触发后需重新注册。
ZNode 的类型与特性
ZNode 根据生命周期和行为分为多种类型,每种类型有特定特性:
- 持久节点 (Persistent ZNode)
- 特性:创建后永久存在,除非显式删除。
- 用途:存储静态配置或长期数据。
- 创建方式:
create /path data
。
- 临时节点 (Ephemeral ZNode)
- 特性:与创建它的客户端会话绑定,会话结束(超时或关闭)后自动删除。
- 限制:不能有子节点。
- 用途:动态成员管理、分布式锁。
- 创建方式:
create -e /path data
。
- 顺序节点 (Sequential ZNode)
- 特性:节点名称自动追加 10 位递增序号(例如
/path0000000001
)。 - 组合:可以是持久顺序或临时顺序节点。
- 用途:任务队列、唯一标识生成。
- 创建方式:
create -s /path data
(持久顺序)或create -e -s /path data
(临时顺序)。
- 容器节点 (Container ZNode)(3.5.3+)
- 特性:持久节点,当最后一个子节点删除时,容器节点自动删除。
- 用途:管理临时子节点集合。
- 创建方式:
create -c /path
。
- 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
- 创建持久节点
create /config "app settings"
get /config
输出:app settings
- 创建临时节点并测试会话
create -e /temp "session data"
get /temp
quit
重新连接后:
ls /
/temp
已删除。
- 创建顺序节点
create -s /queue "task1"
create -s /queue "task2"
ls /queue
输出:[queue0000000001, queue0000000002]
- 使用 Watcher
get -w /config
set /config "new settings"
输出:
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/config
- 查看元数据
stat /config
检查 dataVersion
等字段变化。
参考资料
- ZooKeeper 官方文档 – 数据模型 – ZNode 特性官方说明。
- ZooKeeper Programmer’s Guide – 数据模型和节点类型。
- Baeldung – ZooKeeper 数据模型 – ZNode 特性简介。
- Apache ZooKeeper FAQ – 常见问题解答。
这是 ZooKeeper ZNode 特性的全面解析,涵盖层次结构、类型和元数据。如果您需要特定特性的深入应用场景(例如顺序节点在队列中的使用),请告诉我!
发表回复