目录
ZooKeeper 数据模型概述
ZooKeeper 的数据模型是一个层次化的命名空间,类似于文件系统,但专为分布式协调设计。它由称为 ZNode 的节点组成,每个 ZNode 可以存储数据并拥有子节点。ZooKeeper 的数据模型特点包括:
- 树形结构:以
/
为根节点,路径用斜杠分隔(如/app/config
)。 - 小数据存储:ZNode 通常存储少量数据(默认最大 1MB),适合配置、状态等。
- 一致性:所有节点共享一致的视图,数据更新是原子的。
ZNode 结构详解
ZNode 是 ZooKeeper 数据模型的基本单位,既是路径的一部分,也可以存储数据。它的结构类似文件系统中的文件或目录,但有独特的特性。
ZNode 的特点
- 路径唯一:每个 ZNode 由路径标识,例如
/znode1
。 - 数据存储:每个 ZNode 可以存储少量字节数据(通常是键值对形式)。
- 层次化:支持嵌套结构,父节点必须存在才能创建子节点。
- 临时性与持久性:ZNode 可以是临时的(客户端断开后删除)或持久的。
ZNode 类型
ZooKeeper 支持多种 ZNode 类型,根据生命周期和用途不同分为以下几类:
- 持久节点 (Persistent ZNode)
- 特点:创建后永久存在,除非显式删除。
- 用途:存储配置信息、静态数据。
- 创建方式:
create /path data
(无特殊参数)。
- 临时节点 (Ephemeral ZNode)
- 特点:与创建它的客户端会话绑定,会话结束后自动删除。
- 用途:用于领导者选举、分布式锁。
- 创建方式:
create -e /path data
。
- 持久顺序节点 (Persistent Sequential ZNode)
- 特点:持久存在,且名称自动追加递增序号(如
/path0000000001
)。 - 用途:任务队列、命名服务。
- 创建方式:
create -s /path data
。
- 临时顺序节点 (Ephemeral Sequential ZNode)
- 特点:临时存在,名称带序号,会话结束后删除。
- 用途:分布式锁排序、临时任务分配。
- 创建方式:
create -e -s /path data
。
- 容器节点 (Container ZNode)(3.5.3+)
- 特点:持久节点,专为嵌套结构设计,当最后一个子节点删除时自动删除。
- 用途:管理临时子节点。
- 创建方式:
create -c /path
。
- TTL 节点 (TTL ZNode)(3.6.0+)
- 特点:持久节点,设置生存时间(TTL),到期后自动删除。
- 用途:临时数据清理。
- 创建方式:需通过 API 指定 TTL(CLI 不直接支持)。
ZNode 的属性
每个 ZNode 都有元数据,通过 stat
命令或 API 可以查看。主要属性包括:
- czxid:创建时的 ZooKeeper 事务 ID。
- mzxid:最后修改的事务 ID。
- ctime:创建时间(Unix 时间戳,毫秒)。
- mtime:最后修改时间。
- version:数据版本号,每次更新递增。
- cversion:子节点版本号。
- aversion:ACL(访问控制列表)版本号。
- ephemeralOwner:临时节点的会话 ID(持久节点为 0)。
- dataLength:数据字节长度。
- numChildren:子节点数量。
- pzxid:子节点最后修改的事务 ID。
示例输出(stat 命令)
stat /znode1
输出:
cZxid = 0x100000002
ctime = Wed Mar 28 10:00:00 UTC 2025
mZxid = 0x100000002
mtime = Wed Mar 28 10:00:00 UTC 2025
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 0
操作 ZNode 的示例
以下通过 ZooKeeper 客户端命令行(zkCli.sh
)展示 ZNode 操作。
启动客户端
zkCli.sh -server localhost:2181
- 创建持久节点
create /app "app data"
get /app
输出:app data
- 创建临时节点
create -e /temp "temp data"
get /temp
退出客户端后(quit
),再次连接检查:
ls /
/temp
已消失。
- 创建顺序节点
create -s /queue "task1"
create -s /queue "task2"
ls /queue
输出:[queue0000000001, queue0000000002]
- 修改和查看属性
set /app "new data"
stat /app
get /app
输出:
new data
[更新后的 stat 属性]
- 删除节点
delete /app
参考资料
- ZooKeeper 官方文档 – 数据模型 – 官方数据模型说明。
- ZooKeeper Programmer’s Guide – ZNode 结构详解。
- Baeldung – ZooKeeper 数据模型 – 数据模型简介。
- Apache ZooKeeper FAQ – 常见问题解答。
这是 ZooKeeper 数据模型和 ZNode 结构的详细解析,涵盖了类型、属性和操作示例。如果您需要更深入的内容(例如 ZNode 在分布式系统中的应用场景),请告诉我!
发表回复