13.10.5 变更回滚与应急预案
在HAProxy运维中,变更回滚与应急预案的核心是“可预见、可验证、可快速恢复”。变更前需明确影响范围(前端、后端、证书、ACL、健康检查、超时等),建立变更窗口与回滚点,确保配置可追溯、可对比、可复现。
回滚策略与流程(含示例)
1) 配置级回滚:保留上一个稳定版本配置,预检新配置,异常即回滚并平滑重载。
示例:使用Git管理/etc/haproxy/haproxy.cfg并回滚
# 1) 变更前保存基线
cd /etc/haproxy
git init
git add haproxy.cfg
git commit -m "baseline"
# 2) 修改后生成差异清单
git diff > /tmp/haproxy.diff
# 3) 预检新配置(返回0表示通过)
haproxy -c -f /etc/haproxy/haproxy.cfg
# 4) 平滑重载
systemctl reload haproxy
# 5) 异常时回滚到上一版本并重载
git checkout -- haproxy.cfg
haproxy -c -f /etc/haproxy/haproxy.cfg && systemctl reload haproxy
2) 版本级回滚:保留旧二进制与服务单元,失败时切回旧版本。
# 备份旧二进制
cp /usr/sbin/haproxy /usr/sbin/haproxy.old
# 安装新版本后验证
/usr/sbin/haproxy -v
haproxy -c -f /etc/haproxy/haproxy.cfg
# 出现问题时快速回切
mv /usr/sbin/haproxy.old /usr/sbin/haproxy
systemctl restart haproxy
3) 流量级回滚:通过DNS/上游LB切流,或临时降低权重隔离故障后端。
示例:通过Runtime API下线单个后端
# 确认stats socket
grep -n "stats socket" /etc/haproxy/haproxy.cfg
# 临时下线后端
echo "disable server app_backend/app01" | socat /run/haproxy/admin.sock stdio
# 恢复后端
echo "enable server app_backend/app01" | socat /run/haproxy/admin.sock stdio
应急预案要点(含命令解释)
- 故障分级:S0(全站不可用)/S1(核心功能不可用)/S2(性能明显下降),对应响应时限与升级路径。
- 指标门槛:错误率、连接数、响应时间、队列长度、后端健康数。
- 快速隔离:对异常后端执行
disable server或降低weight,保留观测窗口。 - 会话保持影响:stick-table或cookie变更需评估用户会话影响,必要时保留兼容期。
- 证书回退:证书变更失败时切回旧证书或临时关闭SNI差异配置。
- 平滑重载:优先
systemctl reload,保证旧进程处理完连接后退出。
变更前检查清单(含示例)
# 1) 配置预检:确认语法无误
haproxy -c -f /etc/haproxy/haproxy.cfg
# 2) 渐进变更:仅调小权重做灰度
# 在配置中对灰度后端降低权重(示例片段)
# backend app_backend
# server app01 10.0.0.11:8080 weight 10 check
# server app02 10.0.0.12:8080 weight 2 check
故障快速定位(排错示例)
# 1) 查看HAProxy运行状态与进程
systemctl status haproxy
ps -ef | grep haproxy
# 2) 通过stats接口查看后端健康
# 若启用HTTP stats
curl -s http://127.0.0.1:8404/metrics | head -n 20
# 3) 定位最近错误日志
grep -E "CRIT|ALERT|err" /var/log/haproxy.log | tail -n 50
常见现象与原因定位:
- 大量5xx:后端不可达或健康检查失败;检查backend健康状态与网络ACL。
- 连接堆积:timeout过大/后端处理慢;临时降低timeout server并扩容后端。
- 重载失败:配置语法错误或证书路径错误;用haproxy -c验证路径与权限。
应急操作脚本示例(批量隔离异常后端)
#!/bin/bash
# /usr/local/bin/haproxy_quarantine.sh
# 用法:./haproxy_quarantine.sh app_backend app01 app02
backend="$1"; shift
for srv in "$@"; do
echo "disable server ${backend}/${srv}" | socat /run/haproxy/admin.sock stdio
done
echo "show stat" | socat /run/haproxy/admin.sock stdio | head -n 5
演练与复盘(含练习)
练习1:模拟错误配置并回滚
1) 修改timeout connect为不合理值(如1ms),执行haproxy -c预检并重载。
2) 观察应用请求超时与后端健康状态。
3) 使用git checkout -- haproxy.cfg回滚并重载,验证恢复。
练习2:运行时下线/上线后端
1) 执行disable server下线app01,观察流量转移。
2) 执行enable server恢复,确认权重回归。
复盘模板建议包含:变更内容、时间线、影响面、根因、MTTR、改进项与预防机制,形成闭环。