下面详细讲解这三个 Zookeeper 命令返回数据的含义:
1. ls /path
- 列出子节点
命令功能:
列出指定路径下的所有直接子节点名称(不包含孙子节点)
示例返回:
[child1, child2, child3]
输出解析:
- 返回的是一个数组,包含所有直接子节点的名称
- 如果路径不存在会返回
NoNodeException
- 如果路径下没有子节点则返回空数组
[]
使用场景:
- 快速查看某个节点下的子节点结构
- 服务发现时查看可用的服务实例列表
示例:
[zk: localhost:2181(CONNECTED) 0] ls /services
[order-service, user-service, payment-service]
2. ls2 /path
- 列出子节点及详细信息(Zookeeper 3.6+ 已弃用,改用 ls -s
)
命令功能:
列出子节点同时返回详细的元数据信息
示例返回:
[child1, child2, child3]
cZxid = 0x200000002
ctime = Wed Dec 01 15:22:34 CST 2021
mZxid = 0x200000005
mtime = Wed Dec 01 16:10:12 CST 2021
pZxid = 0x200000010
cversion = 3
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 3
输出解析:
- 第一部分:子节点列表(同
ls
命令) - 第二部分:元数据(与
stat
命令相同),各字段含义:
字段 |
说明 |
|
该节点创建时的事务ID(十六进制) |
|
节点创建时间(UTC) |
|
最后修改该节点数据的事务ID |
|
最后修改数据的时间 |
|
最后修改子节点列表的事务ID |
|
子节点版本号(子节点变化次数) |
|
数据版本号(数据修改次数) |
|
ACL版本号(权限修改次数) |
|
临时节点所有者会话ID(持久节点为0) |
|
节点数据长度(字节) |
|
直接子节点数量 |
使用场景:
- 需要同时查看子节点列表和节点元数据时
- 调试时查看节点完整信息
3. stat /path
- 查看节点状态信息
命令功能:
返回指定节点的详细元数据信息(不返回子节点列表)
示例返回:
cZxid = 0x200000002
ctime = Wed Dec 01 15:22:34 CST 2021
mZxid = 0x200000005
mtime = Wed Dec 01 16:10:12 CST 2021
pZxid = 0x200000010
cversion = 3
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 3
字段详解(同 ls2
的元数据部分):
- 事务ID相关:
cZxid
:创建事务ID(集群全局唯一)mZxid
:最后修改数据的事务IDpZxid
:最后修改子节点的事务ID
- 时间戳:
ctime
:创建时间(毫秒精度)mtime
:最后修改时间
- 版本控制:
cversion
:子节点变化次数(每次子节点增删改都会+1)dataVersion
:数据修改次数aclVersion
:ACL修改次数
- 其他信息:
ephemeralOwner
:临时节点会话ID(非临时节点为0)dataLength
:数据字节大小numChildren
:直接子节点数量
使用场景:
- 检查节点是否存在(不存在会返回
NoNodeException
) - 监控节点数据变更(通过比较
dataVersion
) - 判断节点类型(通过
ephemeralOwner
是否为0) - 调试分布式锁、选举等场景
三者的核心区别
命令 |
子节点列表 |
元数据 |
适用版本 |
|
✅ 有 |
❌ 无 |
所有版本 |
|
✅ 有 |
✅ 完整 |
3.5及以前 |
|
✅ 有 |
✅ 完整 |
3.6+(推荐) |
|
❌ 无 |
✅ 完整 |
所有版本 |
实际应用示例
场景:检查一个分布式锁的状态
[zk: localhost:2181(CONNECTED) 0] ls /locks/order_lock
[lock-000000001, lock-000000002]
[zk: localhost:2181(CONNECTED) 1] stat /locks/order_lock
cZxid = 0x300000005
ctime = Thu Dec 02 09:15:47 CST 2021
mZxid = 0x300000005
mtime = Thu Dec 02 09:15:47 CST 2021
pZxid = 0x300000008
cversion = 2 # 表示已经有2次子节点变更
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0 # 持久节点
dataLength = 0 # 无数据
numChildren = 2 # 当前有2个客户端在等待锁
通过分析这些信息可以知道:
- 这是一个持久节点(
ephemeralOwner=0
) - 当前有2个客户端在等待锁(
numChildren=2
) - 锁节点创建后数据从未修改过(
dataVersion=0
)