本章定位:四字命令(Four Letter Words)是 ZooKeeper 最常用的运维工具,通过简单的 nc/telnet 即可获取集群运行状态。
定义与作用
四字命令是 ZooKeeper 服务端内置的一系列简短管理命令,通过向服务端 2181 端口发送 4 个字母的命令字符串,返回对应的运行状态信息。它们是运维 ZooKeeper 集群的首选工具。
ZooKeeper 3.5.0+ 中四字命令默认关闭,需要显式在 zoo.cfg 中配置:
4lw.commands.whitelist=*
核心原理
四字命令分类
最常用的四个命令:ruok(健康检查)、stat(性能统计)、srvr(详细信息)、cons(客户端连接)。
完整示例
示例一:基础健康检查
场景说明:快速检查 ZooKeeper 服务是否存活。
echo ruok | nc 127.0.0.1 2181
# 输出:imok
# 如果服务不可用
echo ruok | nc 127.0.0.1 2181
# 无输出或连接拒绝
操作前后对比:
| 命令 | 正常输出 | 异常输出 | 含义 |
|---|---|---|---|
| ruok | imok | 无输出/连接拒绝 | 服务健康检查 |
| stat | 详细统计信息 | — | 运行时状态 |
| srvr | 服务器信息 | — | 服务端配置 |
示例二:stat 和 srvr 运行时统计
场景说明:获取 ZooKeeper 服务的详细运行指标。
echo stat | nc 127.0.0.1 2181
输出:
Zookeeper version: 3.7.0
Clients:
/127.0.0.1:54321[1](queued=0,recved=15,sent=16)
/127.0.0.1:54322[0](queued=0,recved=5,sent=5)
Latency min/avg/max: 0/2/15
Received: 120
Sent: 121
Connections: 2
Outstanding: 0
Zxid: 0x10000000a
Mode: standalone
Node count: 25
关键指标解读:
| 指标 | 含义 | 关注点 |
|---|---|---|
| Latency min/avg/max | 请求延迟(ms) | max 不应超过 sessionTimeout |
| Received / Sent | 收发的包总数 | 持续增长正常 |
| Connections | 当前连接数 | 应与预期客户端数一致 |
| Outstanding | 等待中的请求数 | 持续 > 0 说明处理不过来 |
| Zxid | 最新事务 ID | 通过增长速度判断负载 |
| Node count | ZNode 数量 | Ephemeral 过多说明有泄漏 |
| Mode | 角色 | standalone/leader/follower |
echo srvr | nc 127.0.0.1 2181
输出:
Zookeeper version: 3.7.0
Latency min/avg/max: 0/2/15
Received: 120
Sent: 121
Connections: 2
Outstanding: 0
Zxid: 0x10000000a
Mode: standalone
Node count: 25
操作前后对比:
| 场景 | stat 关键变化 | 诊断 |
|---|---|---|
| 正常 | Connections 稳定 | 集群健康 |
| 客户端泄漏 | Connections 持续增长 | 检查客户端 close() |
| 高负载 | Outstanding > 0 | 考虑扩展 |
| 延迟增大 | Latency max 增大 | 检查磁盘 IO 和网络 |
示例三:客户端连接列表
场景说明:排查哪些客户端连接到了 ZooKeeper。
echo cons | nc 127.0.0.1 2181
输出:
/127.0.0.1:54321[1](queued=0,recved=120,sent=119,
sid=0x10000000001,lop=PING,est=1623500000000,
to=30000,lcxid=0x5,lzxid=0x10000000a,lresp=1623501000000,
lreq=1623501000000,llat=2,minlat=0,avglat=2,maxlat=15)
字段解析:
| 字段 | 含义 |
|---|---|
| sid | Session ID |
| lop | 最后一个操作(PING/GETD/SETD 等) |
| est | 连接建立时间(时间戳) |
| to | Session Timeout(ms) |
| lreq / lresp | 最后请求/响应时间 |
| llat / minlat / avglat / maxlat | 延迟统计(ms) |
操作前后对比:
| 诊断场景 | cons 输出线索 |
|---|---|
| 空闲连接 | lop=PING 且长时间未更新 |
| 连接泄漏 | 大量 sid 且 est 很早 |
| 慢客户端 | avglat 明显高于其他客户端 |
示例四:mntr 监控指标
场景说明:获取 Prometheus/Grafana 友好的键值对监控数据。
echo mntr | nc 127.0.0.1 2181
输出:
zk_version 3.7.0
zk_avg_latency 2
zk_max_latency 15
zk_min_latency 0
zk_packets_received 120
zk_packets_sent 121
zk_num_alive_connections 2
zk_outstanding_requests 0
zk_server_state standalone
zk_znode_count 25
zk_watch_count 3
zk_ephemerals_count 2
zk_approximate_data_size 1024
zk_open_file_descriptor_count 35
zk_max_file_descriptor_count 1024
操作前后对比:
| 指标 | 含义 | 告警阈值建议 |
|---|---|---|
| zk_avg_latency | 平均延迟 | > 50ms 关注 |
| zk_outstanding_requests | 等待请求数 | > 0 持续关注 |
| zk_znode_count | ZNode 总数 | 持续增长检查泄漏 |
| zk_watch_count | Watcher 数 | 过大检查泄漏 |
| zk_open_file_descriptor_count | 文件描述符 | > 80% 需扩展 |
易错场景与面试考点
易错场景
1. 四字命令默认被禁用
echo stat | nc 127.0.0.1 2181
# stat is not executed because it is not in the whitelist.
ZooKeeper 3.5.0+ 必须在 zoo.cfg 中配置 4lw.commands.whitelist=* 或指定具体命令。
2. 将 ruok 的输出视为服务实际可用
imok 只表示服务进程还在,但可能处于选举中或 Follower 状态。应结合 stat 或 mntr 检查 Mode。
3. 在选举期间执行四字命令
选举期间命令可能超时或返回过时信息。mntr 中的 zk_server_state 在选举期间为 looking。
面试高频题
Q:四字命令中哪些是只读的,哪些有副作用?
A:
- 只读:ruok、stat、srvr、cons、dump、envi、mntr、wchs、wchc、wchp
- 副作用:srst(重置统计)、crst(重置连接统计)、kill(关闭服务)
执行有副作用的命令需谨慎,尤其是 kill。
Q:如何将四字命令集成到监控系统?
A:使用 mntr 命令获取键值对输出,通过脚本定期采集并推送到 Prometheus(使用 Pushgateway)或直接配置 ZK Exporter。不建议用 stat 等人类可读格式,解析成本高且不稳定。
Q:stat 中的 Outstanding 持续很高怎么办?
A:说明 Leader 处理能力跟不上请求速率。排查:
- 磁盘 IO 是否瓶颈(事务日志 fsync 延迟)
- 网络带宽是否充足
- 集群是否需要增加 Follower 分担读压力
- 客户端是否需要限流
小结
| 要点 | 说明 |
|---|---|
| 默认关闭 | 3.5.0+ 需配置 whitelist |
| 核心命令 | ruok / stat / srvr / cons / mntr |
| mntr | 键值对格式,适合监控采集 |
| ruok 局限 | 只检查进程存活,不检查可用性 |
| 读写分类 | 只读命令安全,srst/kill 有副作用 |
四字命令是运维的快速入口。下一节深入 JMX 和日志监控,构建完整的 ZooKeeper 可观测性体系。