13.10.6 运维工具与排障脚本
在 HAProxy 运维中,常用的排障与自动化工具可分为配置校验、运行态诊断、网络与系统层排查、日志与指标分析、自动化脚本五类。通过标准化命令与脚本模板,能够在故障发生时快速定位并降低人为误操作风险。
一、配置校验与语法检查(含安装与必要配置)
- 安装与版本确认(示例基于 Debian/Ubuntu):
sudo apt-get update
sudo apt-get install -y haproxy socat
haproxy -vv
- 启用 stats socket(用于后续排障脚本):
# /etc/haproxy/haproxy.cfg
global
log /dev/log local0
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
- 配置语法检测(执行后应输出 “Configuration file is valid”):
haproxy -c -f /etc/haproxy/haproxy.cfg
- 常见报错与快速修复:
- alert: parsing [haproxy.cfg:xx] unknown keyword
说明版本不支持该关键字,使用haproxy -vv对照编译参数与版本文档。 - missing argument after 'bind'
检查bind端口是否遗漏或写错。
二、运行态诊断工具(带可执行示例)
- 进程与端口确认:
ps -ef | grep [h]aproxy
ss -lntp | grep haproxy
- stats socket 实时诊断(需要 socat):
echo "show info" | socat /run/haproxy/admin.sock stdio
echo "show stat" | socat /run/haproxy/admin.sock stdio | head -n 5
- 运行态变更(临时下线后端,预期后端状态为 MAINT):
echo "set server app_backend/srv1 state maint" | socat /run/haproxy/admin.sock stdio
- 线程与CPU占用:
top -H -p $(pidof haproxy)
三、网络与系统层排查(附典型问题处理)
- TIME_WAIT/连接耗尽:
ss -s
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -nr | head
- 端口冲突与绑定失败:
lsof -i :80
ss -lntp | grep :80
- 文件描述符上限:
ulimit -n
cat /proc/$(pidof haproxy)/limits | grep "open files"
- 典型排错:若
bind失败且系统日志提示cannot bind socket
处理顺序:端口冲突 → ulimit → SELinux/AppArmor → 防火墙规则。
四、日志与指标分析(含示例与字段解释)
- 日志格式与关键字段含义(Tt 总耗时、Tr 服务器响应耗时等):
# /etc/haproxy/haproxy.cfg
defaults
log global
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
- 日志快速过滤(查看 5xx 与连接终止原因):
grep -E " 5[0-9]{2} " /var/log/haproxy.log | tail -n 20
grep -E "SC|SD|SR" /var/log/haproxy.log | tail -n 20
- Prometheus 指标验证(若启用 exporter):
curl -s http://127.0.0.1:8404/metrics | grep -E "haproxy_frontend|haproxy_backend" | head
五、常用排障脚本示例(完整可执行)
- 节点健康状态批量核验
#!/usr/bin/env bash
# /usr/local/bin/haproxy_check_up.sh
SOCK="/run/haproxy/admin.sock"
echo "show stat" | socat "$SOCK" stdio | awk -F',' '
NR>1 && $1!="" {
px=$1; sv=$2; status=$18
if (status!="UP") print px"/"sv" => "status
}'
执行与预期效果:
chmod +x /usr/local/bin/haproxy_check_up.sh
/usr/local/bin/haproxy_check_up.sh
# 输出示例:app_backend/srv2 => DOWN
- 连接高峰与队列报警脚本
#!/usr/bin/env bash
# /usr/local/bin/haproxy_queue_alarm.sh
SOCK="/run/haproxy/admin.sock"
SCUR=500
QCUR=50
echo "show stat" | socat "$SOCK" stdio | awk -F',' -v scur="$SCUR" -v qcur="$QCUR" '
NR>1 && $1!="" {
px=$1; sv=$2; cur=$5; q=$4
if (cur>scur || q>qcur) print px"/"sv" scur="cur" qcur="q
}'
- 配置差异对比脚本
#!/usr/bin/env bash
# /usr/local/bin/haproxy_cfg_diff.sh
BASE="/etc/haproxy/haproxy.cfg"
GIT="/etc/haproxy/.baseline/haproxy.cfg"
diff -u "$GIT" "$BASE"
- 日志异常聚合脚本
#!/usr/bin/env bash
# /usr/local/bin/haproxy_5xx_stat.sh
LOG="/var/log/haproxy.log"
awk '$9 ~ /^5/ {count[$11]++} END {for (u in count) print count[u], u}' "$LOG" | sort -nr | head
六、运维建议与排障顺序
- 统一脚本托管到 Git,使用 Ansible/Salt 分发,禁止线上手工修改。
- stats socket 权限建议 660,属主为 haproxy,属组为运维组。
- 排障顺序:配置校验 → 运行态诊断 → 系统资源 → 日志/指标 → 脚本验证。
七、练习(动手验证)
1. 故意在 haproxy.cfg 中写错 bind 端口,运行 haproxy -c 观察报错并修复。
2. 使用 set server 将后端置为 maint,观察 show stat 状态变化。
3. 用 haproxy_5xx_stat.sh 统计 5xx 请求并定位高频 URL。
4. 修改 timeout server 为更小值,制造超时日志,验证 Tt/Tr 字段变化。