Znode 中存储的 Stat 信息包含哪些内容?
在 ZooKeeper 中,每个 Znode 除了存储数据本身(Data)之外,还维护了一个名为 Stat 的状态结构。这个结构存储了关于该 Znode 的元数据(Metadata)。
Stat 结构主要包含以下字段,可以分为事务 ID、时间戳、版本号和常规描述四类:
1. 事务 ID (Transaction IDs)
ZooKeeper 的每次写操作(创建、更新、删除)都会产生一个全局唯一的事务 ID,称为 ZXID。ZXID 用于保证操作的顺序一致性。
- czxid (Created ZXID):
- 引起该 Znode 创建的事务 ID。
- 即该节点诞生时的 ZXID。
- mzxid (Modified ZXID):
- 该 Znode 最后一次被修改(setData)的事务 ID。
- 注意:如果只是修改子节点,mzxid 不会变。
- pzxid:
- 该 Znode 的子节点列表最后一次被修改的事务 ID。
- 只有当子节点被添加或删除时,pzxid 才会更新。修改子节点的数据内容不会更新父节点的 pzxid。
2. 时间戳 (Time)
- ctime (Created Time):
- 该 Znode 被创建的时间(毫秒数,距离 1970-01-01 的时间)。
- mtime (Modified Time):
- 该 Znode 最后一次被修改的时间(毫秒数)。
3. 版本号 (Versions)
ZooKeeper 使用版本号来实现乐观锁(Optimistic Locking)机制。在进行更新操作时,可以指定版本号,如果当前版本号与指定的不一致,更新会失败(抛出 BadVersionException)。
- version (Data Version):
- Znode 数据的变化次数。
- 即使数据被修改为相同的值,版本号也会增加。
- cversion (Children Version):
- Znode 子节点的变化次数。
- 指子节点的创建或删除,不包括子节点数据的修改。
- aversion (ACL Version):
- Znode 访问控制列表 (ACL) 的变化次数。
4. 常规描述 (Metadata)
- ephemeralOwner:
- 如果该节点是临时节点 (Ephemeral Node),这里存储的是创建该节点的客户端 Session ID。
- 如果该节点是持久节点 (Persistent Node),该字段值为 0。
- dataLength:
- Znode 中存储的数据长度(字节数)。
- numChildren:
- 当前 Znode 拥有的子节点数量。
总结表
| 字段名 | 含义 | 触发更新的操作 |
|---|---|---|
| czxid | 创建节点的事务 ID | create |
| mzxid | 最后修改数据的事务 ID | setData |
| ctime | 创建时间 | create |
| mtime | 最后修改时间 | setData |
| version | 数据版本号 | setData |
| cversion | 子节点版本号 | create child / delete child |
| aversion | ACL 版本号 | setACL |
| ephemeralOwner | 临时节点拥有者的 Session ID | create (ephemeral) |
| dataLength | 数据长度 | create / setData |
| numChildren | 子节点数量 | create child / delete child |
| pzxid | 子节点列表最后变更的事务 ID | create child / delete child |