11.9.3 四字命令与监控脚本
四字命令与监控脚本#
原理草图:四字命令采集链路#
四字命令用途与适用范围#
ZooKeeper 四字命令用于快速获取服务状态与运行指标,适合无 JMX/Prometheus 的场景健康检查、容量评估与故障定位。常用命令与作用:
- ruok:探活,返回 imok
- stat:状态与性能概览
- srvr:服务端信息与角色
- mntr:机器可解析指标(推荐采集)
- conf:运行配置
- cons:客户端连接信息
- envi:运行环境
安装与前置依赖#
四字命令通过 TCP 连接发送,需要 nc 工具:
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y netcat
# RHEL/CentOS
sudo yum install -y nc
# 预期:执行后 nc 命令可用
nc -h | head -n 1
开启四字命令白名单#
在 conf/zoo.cfg 中显式开启(3.5+ 必需):
# /opt/zookeeper/conf/zoo.cfg
4lw.commands.whitelist=ruok,stat,srvr,mntr,conf,cons,envi
重启生效:
/opt/zookeeper/bin/zkServer.sh restart
常用四字命令示例(含预期效果)#
# 1) 探活
echo ruok | nc 127.0.0.1 2181
# 预期输出:imok
# 2) 状态
echo stat | nc 127.0.0.1 2181 | head -n 5
# 3) 角色与版本
echo srvr | nc 127.0.0.1 2181 | egrep "Mode|Version"
# 4) 机器可解析指标(推荐采集)
echo mntr | nc 127.0.0.1 2181 | head -n 10
关键输出字段解读(以 mntr 为主)#
mntr 输出为 key\tvalue,便于采集:
- zk_server_state:角色(leader/follower/standalone)
- zk_num_alive_connections:存活连接数
- zk_outstanding_requests:待处理请求
- zk_packets_received/zk_packets_sent:流量
- zk_znode_count:节点总数
- zk_ephemerals_count:临时节点数
- zk_watch_count:watch 数量
- zk_approximate_data_size:数据体积
- zk_max_file_descriptor_count / zk_open_file_descriptor_count:FD 使用
轻量监控脚本(Shell,含阈值与告警)#
#!/bin/bash
# /usr/local/bin/zk_4lw_monitor.sh
# 作用:采集 mntr 并进行简单阈值判断
HOST=${1:-127.0.0.1}
PORT=${2:-2181}
TIMEOUT=2
zk_cmd() {
echo "$1" | nc -w "$TIMEOUT" "$HOST" "$PORT" 2>/dev/null
}
# 1) 探活
RUOK=$(zk_cmd ruok)
if [[ "$RUOK" != "imok" ]]; then
echo "CRITICAL: zk ruok failed, output=$RUOK"
exit 2
fi
# 2) 获取指标
MNTR=$(zk_cmd mntr)
if [[ -z "$MNTR" ]]; then
echo "CRITICAL: mntr empty"
exit 2
fi
# 3) 解析关键指标
STATE=$(echo "$MNTR" | awk '$1=="zk_server_state"{print $2}')
OUT_REQ=$(echo "$MNTR" | awk '$1=="zk_outstanding_requests"{print $2}')
FD_OPEN=$(echo "$MNTR" | awk '$1=="zk_open_file_descriptor_count"{print $2}')
FD_MAX=$(echo "$MNTR" | awk '$1=="zk_max_file_descriptor_count"{print $2}')
# 4) 简单阈值判断
FD_RATE=$(( FD_OPEN * 100 / (FD_MAX==0?1:FD_MAX) ))
STATUS=0
MSG="OK: state=$STATE outstanding=$OUT_REQ fd_rate=${FD_RATE}%"
if [[ "$OUT_REQ" -ge 1000 ]]; then
STATUS=1
MSG="WARN: outstanding_requests high=$OUT_REQ"
fi
if [[ "$FD_RATE" -ge 80 ]]; then
STATUS=2
MSG="CRITICAL: fd_rate high=${FD_RATE}%"
fi
echo "$MSG"
exit $STATUS
运行示例:
chmod +x /usr/local/bin/zk_4lw_monitor.sh
/usr/local/bin/zk_4lw_monitor.sh 127.0.0.1 2181
# 预期输出:
# OK: state=leader outstanding=0 fd_rate=12%
典型排错步骤(命令可直接执行)#
# 1) 端口连通性
nc -vz 127.0.0.1 2181
# 2) 是否开启白名单
grep "4lw.commands.whitelist" /opt/zookeeper/conf/zoo.cfg
# 3) 查看 ZooKeeper 进程
ps -ef | grep zookeeper | grep -v grep
# 4) 查看日志(确认是否拒绝四字命令)
tail -n 50 /opt/zookeeper/logs/zookeeper.out
# 5) 确认防火墙/安全组
sudo iptables -L -n | grep 2181
练习#
- 只用
mntr计算zk_outstanding_requests的 5 分钟平均值(可用awk或bash循环)。 - 编写脚本,当
zk_watch_count连续三次增长超过 20% 时输出告警。 - 通过
cons列出客户端连接,过滤出来源 IP 数超过 3 的客户端(可用awk+sort+uniq -c)。