1. 核心概念
ZNode 并不只是存储用户写入的业务数据,它包含两部分内容:
- Data:用户存储的业务数据(二进制字节数组)。
- Stat:状态信息(元数据),描述该节点的权限、版本、事务 ID 等。
2. 详细结构 (Stat 对象)
在 Java 客户端中,可以通过 Stat 对象查看 ZNode 的元数据。关键字段如下:
2.1 事务 ID (Zxid)
ZooKeeper 的状态改变都由事务 ID 标识,保证全局有序。
- cZxid (Created Zxid):节点被创建时的事务 ID。
- mZxid (Modified Zxid):节点最后一次被修改时的事务 ID。
- pZxid (Parent Zxid):该节点的子节点列表最后一次被修改时的事务 ID(注意是子节点列表变化,不是子节点内容变化)。
2.2 版本号 (Version)
用于实现乐观锁(CAS 机制)。
- version:数据节点版本号。每次节点数据更新,version 自增。
- cversion:子节点版本号。子节点增删时自增。
- aversion:ACL(权限)版本号。
2.3 时间戳
- ctime (Create Time):节点创建时间。
- mtime (Modified Time):节点最后修改时间。
2.4 其他
- ephemeralOwner:如果是临时节点,这里存储创建该节点的 Session ID;如果是持久节点,值为 0。
- dataLength:数据内容的长度。
- numChildren:当前节点的子节点数量。
3. 为什么需要这些元数据?
- 乐观锁控制:
setData(path, data, version)。客户端更新数据时传入版本号,如果服务端版本号与传入的不一致,更新失败。这保证了并发修改的数据一致性。 - 临时节点判断:通过
ephemeralOwner可以快速判断节点是否为临时节点,以及属于哪个 Session。 - 顺序一致性:
Zxid是 ZK 保证顺序一致性的基石,所有写操作都通过 Zxid 排序。
4. 总结
面试官:ZNode 节点中存储的是什么?
候选人: ZNode 存储的内容包含两部分:用户数据 (Data) 和 状态元数据 (Stat)。
用户数据就是我们写入的二进制信息,通常用于存配置或地址,大小限制默认 1MB。
状态元数据 (Stat) 非常重要,主要包含:
- Zxid:事务 ID(如
cZxid,mZxid),用于标识操作顺序,保证一致性。- Version:版本号(
version),用于实现 CAS 乐观锁,防止并发覆盖。- EphemeralOwner:记录临时节点的 Session ID,用于判断节点归属。
- 时间戳:如创建时间和修改时间。
这些元数据支撑了 ZooKeeper 的 Watch 机制、分布式锁和并发控制等核心功能。