Zookeeper 四字命令
以下是 ZooKeeper 四字命令(Four Letter Words)完整手册,从 命令分类 → 详细解释 → 使用示例 → 监控集成 → 安全控制 → 常见问题,全中文 + 实际输出 + 类比,助你 快速诊断集群健康。
四字命令 =
echo <4个字母> | nc host 2181
一、四字命令概览(官方支持 15+ 条)
| 命令 | 功能 | 级别 |
|---|---|---|
ruok | 是否存活 | 基础 |
stat | 节点状态 | 基础 |
mntr | 监控指标(Prometheus) | 高级 |
conf | 运行时配置 | 高级 |
dump | 会话 + 临时节点 | 高级 |
cons | 连接详情 | 高级 |
crst | 重置连接统计 | 高级 |
srst | 重置服务器统计 | 高级 |
wchs / wchc / wchz | Watcher 统计 | 高级 |
dirs | 数据目录大小 | 高级 |
envs | 环境变量 | 高级 |
isro | 是否只读 | 高级 |
lggr | 日志级别 | 高级 |
二、核心命令详解(带真实输出)
1. ruok —— “你还好吗?”
echo ruok | nc zk1 2181
输出:
imok
类比:心跳检查,返回
imok= 存活
2. stat —— 节点角色 + 连接数
echo stat | nc zk1 2181
输出:
Zookeeper version: 3.8.4
Clients:
192.168.1.100:58392[1](queued=0,recved=125,sent=125)
192.168.1.101:58401[1](queued=0,recved=89,sent=89)
Latency min/avg/max: 0/0/123
Received: 214
Sent: 214
Connections: 2
Outstanding: 0
Zxid: 0x10000005a
Mode: leader
Node count: 125
类比:体检报告
3. mntr —— 监控指标(Prometheus 首选)
echo mntr | nc zk1 2181
输出:
zk_version 3.8.4
zk_avg_latency 0
zk_max_latency 123
zk_min_latency 0
zk_packets_received 214
zk_packets_sent 214
zk_num_alive_connections 2
zk_outstanding_requests 0
zk_server_state leader
zk_znode_count 125
zk_watch_count 12
zk_ephemerals_count 45
zk_approximate_data_size 8923
zk_open_file_descriptor_count 38
zk_max_file_descriptor_count 1048576
zk_followers 2
zk_synced_followers 2
zk_pending_syncs 0
Prometheus 直接采集:
zookeeper_mntr_*
4. conf —— 运行时配置
echo conf | nc zk1 2181
输出:
clientPort=2181
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
tickTime=2000
maxClientCnxns=200
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=1
类比:配置文件快照
5. dump —— 会话 + 临时节点(诊断利器)
echo dump | nc zk1 2181
输出:
SessionTracker dump:
Session 0x1001 expires at 1735680000
/online/client1
/locks/order-0001
Session 0x1002 expires at 1735681000
/online/client2
用途:排查临时节点泄露
6. cons —— 连接详情
echo cons | nc zk1 2181
输出:
/192.168.1.100:58392[1](queued=0,recved=125,sent=125,sid=0x1001,lop=PING,est=1735678000,to=30000,lcxid=0x12,lzxid=0x10000005a,lresp=1735678100,llat=0,minlat=0,avglat=0,maxlat=123)
sid= sessionId,lop= 最后操作
7. wchs / wchc / wchz —— Watcher 统计
# 总 Watcher 数
echo wchs | nc zk1 2181
# 12 connections watching 15 paths, total watches: 45
# 按连接分组
echo wchc | nc zk1 2181
# 0x1001
# /config/db
# /app/servers
# 按路径分组
echo wchz | nc zk1 2181
# /config/db
# 0x1001
# 0x1002
用途:排查 Watcher 内存泄露
8. srst / crst —— 重置统计
echo srst | nc zk1 2181 # 重置服务器统计
echo crst | nc zk1 2181 # 重置连接统计
三、批量查询脚本(生产必备)
zk_check.sh(一键巡检)
#!/bin/bash
HOSTS="zk1:2181 zk2:2181 zk3:2181"
for host in $HOSTS; do
echo "=== $host ==="
echo "ruok: $(echo ruok | nc $host 2>/dev/null || echo 'DEAD')"
echo "stat: $(echo stat | nc $host | grep Mode)"
echo "mntr: zk_znode_count=$(echo mntr | nc $host | grep zk_znode_count | awk '{print $2}')"
echo
done
运行:
chmod +x zk_check.sh
./zk_check.sh
四、Prometheus 监控集成
zookeeper_exporter 配置
# prometheus.yml
scrape_configs:
- job_name: 'zookeeper'
static_configs:
- targets: ['zk1:2181', 'zk2:2181', 'zk3:2181']
metrics_path: /metrics
relabel_configs:
- source_labels: [__address__]
target_label: instance
采集 mntr 指标
# 安装 zookeeper-exporter
docker run -d --name zk-exporter \
-p 9141:9141 \
quay.io/bloomberg/zookeeper-exporter \
--zk-servers=zk1:2181,zk2:2181,zk3:2181
访问:http://zk1:9141/metrics
五、安全控制(默认全开!)
问题:四字命令默认可被任何人执行
echo dump | nc zk1 2181 # 能看到所有 session!
解决方案
1. 关闭四字命令(推荐)
# zoo.cfg
4lw.commands.whitelist=*
*= 允许所有(默认)ruok,stat= 只允许这两个
4lw.commands.whitelist=ruok,stat,mntr
2. 防火墙限制
# 只允许监控机器访问
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.100" port port=2181 protocol=tcp accept' --permanent
3. 使用 HTTPS 代理
# nginx 代理 + 认证
location /zk {
proxy_pass http://localhost:2181;
auth_basic "ZooKeeper";
auth_basic_user_file /etc/nginx/.htpasswd;
}
六、命令速查卡片
| 命令 | 输出 | 用途 |
|---|---|---|
ruok | imok | 存活检查 |
stat | 角色 + 连接 | 状态巡检 |
mntr | 监控指标 | Prometheus |
conf | 配置 | 核对参数 |
dump | session + ephemeral | 临时节点排查 |
cons | 连接详情 | 客户端诊断 |
wch* | Watcher | 内存泄露 |
srst | 重置统计 | 归零 |
七、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
Connection refused | 2181 端口不通 | 防火墙、ZK 未启动 |
Command not found | 命令被禁用 | 检查 4lw.commands.whitelist |
imok 但 stat 超时 | 网络分区 | 检查集群连通性 |
mntr 无输出 | 版本 < 3.5 | 升级 ZooKeeper |
八、生产建议
| 建议 | 操作 |
|---|---|
| 关闭危险命令 | 4lw.commands.whitelist=ruok,stat,mntr |
监控采集 mntr | Prometheus + Grafana |
定期 dump 排查 | 脚本定时执行 |
| 限制访问 | 防火墙 + 代理 |
九、Grafana 仪表盘(JSON)
{
"title": "ZooKeeper 集群监控",
"panels": [
{
"title": "节点状态",
"type": "stat",
"targets": [
{ "expr": "zk_server_state{instance=~'$instance'} == 1 ? 1 : 0" }
]
},
{
"title": "ZNode 数量",
"targets": [
{ "expr": "zk_znode_count{instance=~'$instance'}" }
]
}
]
}
总结:四字命令记忆口诀
“ruok 问好,stat 看身,mntr 体检,dump 查病”
动手练习:
- [x] 执行
ruok、stat、mntr - [x] 写脚本批量巡检 3 节点
- [x] 配置
4lw.commands.whitelist - [ ] 接入 Prometheus + Grafana
需要我提供:
- 完整监控脚本(Python)
- Grafana 仪表盘 JSON
- 四字命令安全加固方案
- Zookeeper Exporter 部署
请继续提问!