三、zookeeper 常用shell命令
作者:IvanCodes
日期:2025年5月28日
专栏:Zookeeper教程
ZooKeeper Shell (zkCli.sh) 是与ZooKeeper服务器交互的核心工具。本教程将详细介绍常用命令,并重点解析ZooKeeper数据节点 (ZNode) 的特性与分类。
思维导图
一、连接 ZooKeeper 服务
使用 zkCli.sh
前,需连接到ZooKeeper服务器或集群。
命令:
zkCli.sh -server host1:port1,host2:port2,...
示例 (连接到您的 hadoop01,hadoop02,hadoop03
集群):
zkCli.sh -server hadoop01:2181,hadoop02:2181,hadoop03:2181
成功连接后,提示符会显示连接状态。输入 quit
或 close
退出。
二、常用 Shell 命令详解
1. help
显示可用命令列表。
help
2. ls path [watch]
列出指定路径的直接子节点名称。
ls /
ls /zookeeper watch
3. ls2 path [watch]
与 ls
类似,但除了列出子节点名称外,还会同时返回该路径节点自身的 stat
信息 (元数据)。
ls2 /
ls2 /zookeeper watch
对比 ls
和 ls2
: ls2
在列出子节点的同时,省去了你再执行一次 stat /parent_path
的操作。
4. create [-s] [-e] path data [acl]
创建ZNode (不同类型如上文所述)。
create /my_persistent_node "Permanent Data"
create -e /my_ephemeral_node "Session Data"
create -s /my_sequential_node- "Sequential Data"
create -s -e /my_ephemeral_sequential_node- "Temp Seq Data"
5. get path [watch]
获取节点数据及元数据。
get /my_persistent_node
6. set path data [version]
更新节点数据。
set /my_persistent_node "Updated Data"
set /my_persistent_node "Versioned Update" 0 # 假设当前dataVersion为0
7. delete path [version]
删除无子节点的ZNode。
delete /my_ephemeral_node
8. deleteall path [ignoreErrors] (或 rmr path)
递归删除节点及其所有子节点。
# 较新版本
deleteall /my_persistent_node
# 较早版本
# rmr /my_persistent_node
9. stat path [watch]
仅获取节点元数据。
stat /
10. setAcl path acl
设置节点访问权限。
# 示例:将/secret节点设置为只有创建者有所有权限 (需要先进行认证)
# setAcl /secret auth:your_user:your_password_hashed:cdrwa (这是一个复杂场景,通常API操作)
setAcl /public_readable world:anyone:r # 任何人可读
11. getAcl path
获取节点访问权限。
getAcl /public_readable
12. history
列出当前会话中已执行的命令历史记录,最多显示最近10条。
history
13. redo cmdnum
重新执行历史记录中指定编号的命令。编号从 history
命令的输出中获取。
# 假设 history 输出的第3条命令是你想要的
redo 3
14. sync path
强制与Leader同步。
sync /
15. quit / close
退出客户端。
quit
练习题
- 连接到您的ZooKeeper集群,并使用
history
查看初始命令。 - 在根路径下创建一个名为
/app_root
的持久节点,数据为 “Application Root Node”。 - 使用
ls2 /
查看根路径子节点及根节点的stat信息,确认/app_root
存在。 - 在
/app_root
下创建一个名为config-
的持久顺序节点,数据为 “Config v1”。记录下实际生成的节点名。 - 获取刚创建的持久顺序节点的数据和
dataVersion
。 - 在
/app_root
下创建一个名为live_instance
的临时节点,数据为 “Instance XYZ running”。 - 使用
stat /app_root/live_instance
查看其ephemeralOwner
字段,理解其含义。 - 修改第4步创建的持久顺序节点的数据为 “Config v2”,并使用版本号进行乐观更新。
- 尝试使用
delete /app_root
(不使用递归删除),观察结果。然后使用deleteall
(或rmr
) 正确删除/app_root
及其所有子节点。 - 执行
history
命令,然后使用redo
命令重新执行您创建/app_root
的那条命令。
练习题答案
- 连接并查看history:
zkCli.sh -server hadoop01:2181,hadoop02:2181,hadoop03:2181
history
讲解: history
会显示连接命令本身或为空(如果这是第一个命令)。
- 创建
/app_root
:
create /app_root "Application Root Node"
讲解: 创建一个标准持久节点。
- 使用
ls2 /
查看:
ls2 /
讲解: ls2
会列出 [zookeeper, app_root, ...]
等子节点,并紧随其后打印出 /
节点的stat信息(如 numChildren
会增加)。
- 创建持久顺序节点
config-
:
create -s /app_root/config- "Config v1"
讲解: ZooKeeper会自动生成类似 /app_root/config-0000000000
的节点。你需要记下这个实际名称。
- 获取持久顺序节点数据和版本: (假设上一步生成了
/app_root/config-0000000000
)
get /app_root/config-0000000000
讲解: 记下 dataVersion
的值,初始应为0。
- 创建临时节点
live_instance
:
create -e /app_root/live_instance "Instance XYZ running"
讲解: -e
参数创建临时节点。
- 查看
live_instance
的ephemeralOwner
:
stat /app_root/live_instance
讲解: ephemeralOwner
字段会显示一个非零的会话ID,表示这个节点是临时的,并由该会话拥有。
- 修改持久顺序节点数据 (带版本): (假设
dataVersion
为0,节点名为/app_root/config-0000000000
)
set /app_root/config-0000000000 "Config v2" 0
讲解: 使用获取到的 dataVersion
进行条件更新。成功后,dataVersion
会变为1。
- 尝试删除及递归删除
/app_root
:
delete /app_root
# 这会失败,因为有子节点
# 使用 deleteall (或 rmr)
deleteall /app_root
# 或 rmr /app_root
讲解: 直接 delete
非空节点会失败。deleteall
或 rmr
可以递归删除。
- 使用
history
和redo
:
history
# 找到创建 /app_root "Application Root Node" 的命令编号,假设是 X
redo X
讲解: history
列出命令历史,redo
重新执行指定编号的命令。