Zookeeper 客户端基础命令使用
以下是 ZooKeeper 客户端基础命令(zkCli.sh)完整使用手册,从 连接 → 核心命令 → 高级操作 → 批量脚本 → 常见问题,全中文 + 示例 + 类比,让你 30 分钟上手 zkCli。
一、启动客户端(zkCli.sh)
# 单机
bin/zkCli.sh -server 127.0.0.1:2181
# 集群(推荐)
bin/zkCli.sh -server zk1:2181,zk2:2181,zk3:2181
# 指定超时(默认 30s)
bin/zkCli.sh -server zk1:2181 -timeout 10000
成功进入后显示:
[zk: zk1:2181(CONNECTED) 0]
二、核心命令速查表
| 命令 | 功能 | 示例 |
|---|---|---|
ls /path | 列出子节点 | ls / |
create | 创建节点 | create /app "data" |
get | 获取数据 | get /app |
set | 修改数据 | set /app "new" |
delete | 删除节点(无子节点) | delete /app |
rmr / deleteall | 递归删除 | rmr /app |
stat | 查看状态 | get -s /app |
setAcl / getAcl | 权限管理 | setAcl /app world:anyone:r |
三、详细命令使用
1. 连接与退出
# 连接
bin/zkCli.sh -server zk1:2181
# 退出
quit
# 或 Ctrl+C
2. 节点操作(CRUD)
创建节点
# 持久节点
create /config "db=localhost"
# 带数据的持久节点
create /app/name "service-a"
# 临时节点(会话断开自动删)
create -e /online/client1 "192.168.1.10"
# 顺序节点(自动加序号)
create -s /tasks/task ""
# → 创建 /tasks/task00000001
# 临时 + 顺序(分布式锁经典)
create -e -s /locks/lock ""
# → /locks/lock00000001
查看节点
# 列出子节点
ls /
# [zookeeper, config, app]
ls /app
# [name]
# 获取数据
get /config
# db=localhost
# 获取数据 + 状态(推荐)
get -s /config
# db=localhost
# cZxid = 0x100000003
# ctime = Wed Dec 31 18:00:00 CST 2025
# dataVersion = 0
# numChildren = 0
修改数据
set /config "db=192.168.1.100"
# 修改成功
# 指定版本(乐观锁)
set /config "db=backup" 0
# 如果 version=0 已被修改,会报错
删除节点
# 删除叶子节点
delete /app/name
# 递归删除(推荐)
rmr /app
# 或
deleteall /app
3. 节点类型与路径
| 命令 | 效果 |
|---|---|
create /a/b/c "data" | 自动创建父节点(如果存在) |
create /a/b/c "data" | 不存在 /a/b → 报错 |
create -e /tmp "data" | 临时节点 |
create -s /id " " | 生成 /id00000001 |
建议:用
creatingParentsIfNeeded()(Java)或先手动建父节点
4. Watcher 监听(一次性)
# 监听节点数据变化
get /config true
# 修改节点 → 触发
# WatchedEvent state:SyncConnected type:NodeDataChanged path:/config
# 监听子节点变化
ls /app true
# 创建/删除子节点 → 触发
# WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/app
注意:Watcher 只触发一次,需重新注册
5. ACL 权限控制
# 查看权限
getAcl /config
# 'world,'anyone
# :cdrwa
# 设置只读
setAcl /config world:anyone:r
# 设置认证用户(digest)
addauth digest user:password
setAcl /config digest:user:hashed_password:cdrwa
四、高级命令实战
1. 批量创建节点(脚本)
# create_nodes.sh
bin/zkCli.sh -server zk1:2181 <<EOF
create /app ""
create /app/config ""
create /app/servers ""
create /app/locks ""
quit
EOF
2. 导出/导入节点结构
# 导出所有节点(递归)
bin/zkCli.sh -server zk1:2181 <<EOF | grep "^/" > nodes.txt
ls -R /
quit
EOF
# 导入(需配合脚本)
3. 四字命令(服务端监控)
# 检查存活
echo ruok | nc zk1 2181
# imok
# 查看状态
echo stat | nc zk1 2181
# 查看所有会话
echo dump | nc zk1 2181
# 监控指标
echo mntr | nc zk1 2181
五、命令速记口诀
“创查改删,顺序临时,监听一次,权限加固”
| 动作 | 命令 |
|---|---|
| 创 | create [-e] [-s] /path "data" |
| 查 | ls /path get [-s] /path |
| 改 | set /path "new" |
| 删 | delete /path rmr /path |
| 听 | get /path true |
| 权 | setAcl /path world:anyone:r |
六、常见问题与解决方案
| 问题 | 原因 | 解决 |
|---|---|---|
Node exists | 节点已存在 | 用 -s 顺序节点 |
ConnectionLoss | 网络中断 | 重连 |
KeeperErrorCode = NoNode | 路径不存在 | 先创建父节点 |
rmr 报错 | 旧版本不支持 | 用 deleteall |
七、zkCli 交互式示例
$ bin/zkCli.sh -server zk1:2181
[zk: zk1:2181(CONNECTED) 0] create /myapp ""
Created /myapp
[zk: ...] create /myapp/config "db=localhost"
Created /myapp/config
[zk: ...] ls /myapp
[config]
[zk: …] get -s /myapp/config db=localhost cZxid = 0x200000003 dataVersion = 0 numChildren = 0 [zk: …] set /myapp/config “db=192.168.1.100” [zk: …] create -e -s /myapp/servers/server “” Created /myapp/servers/server00000001 [zk: …] ls /myapp/servers
[server00000001]
[zk: …] quit
八、最佳实践建议
| 场景 | 推荐命令 |
|---|---|
| 配置中心 | create /config/service-a "" |
| 服务注册 | create -e /registry/s1 "ip:port" |
| 分布式锁 | create -e -s /locks/lock "" |
| 任务队列 | create -s /tasks/task "" |
九、替代工具(更强大)
| 工具 | 优势 |
|---|---|
| ZooNavigator | Web UI,可视化 |
| Curator | Java 客户端 |
| zk-shell | Python 交互式 |
| Zookeeper CLI | 增强版命令行 |
十、总结:zkCli 核心命令卡片
# 连接
bin/zkCli.sh -server host:2181
# 创建
create /path "data"
create -e /tmp "tmp"
create -s /id ""
create -e -s /lock ""
# 查看
ls /path
get /path
get -s /path # 带状态
ls /path true # 监听子节点
# 修改
set /path "new data"
# 删除
delete /leaf
rmr /dir # 递归删
deleteall /dir
# 权限
getAcl /path
setAcl /path world:anyone:r
# 退出
quit
下一步建议:
- [x] 运行
zkCli.sh完成 CRUD 操作 - [x] 创建 临时顺序节点 模拟分布式锁
- [x] 用
get /path true监听变化 - [ ] 写 Shell 脚本批量初始化节点
需要我提供:
- zkCli 批量初始化脚本
- ZooNavigator 部署
- Java 替代 zkCli 操作
- 权限认证完整示例
请继续问!