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

练习#

  1. 只用 mntr 计算 zk_outstanding_requests 的 5 分钟平均值(可用 awkbash 循环)。
  2. 编写脚本,当 zk_watch_count 连续三次增长超过 20% 时输出告警。
  3. 通过 cons 列出客户端连接,过滤出来源 IP 数超过 3 的客户端(可用 awk + sort + uniq -c)。