13.5.4 恢复与重加入策略
恢复与重加入策略#
恢复与重加入策略决定后端从故障中恢复时的平滑性与业务稳定性,目标是避免抖动、雪崩重连与流量瞬时回灌。需通过检查间隔、阈值与权重渐进实现稳态恢复。
原理草图(慢恢复、快失败)
关键策略与参数
- inter:健康检查间隔,恢复阶段不宜过短。
- rise:从 DOWN 到 UP 需要的连续成功次数。
- fall:从 UP 到 DOWN 需要的连续失败次数。
- slowstart:恢复后逐步提升权重,避免瞬时涌入。
- on-marked-down shutdown-sessions:标记 DOWN 时主动关闭会话。
- weight:恢复后配合 slowstart 使用,先低权重再升高。
配置示例(含恢复策略)#
文件路径:/etc/haproxy/haproxy.cfg
global
log /dev/log local0
maxconn 20000
defaults
mode http
log global
timeout connect 5s
timeout client 30s
timeout server 30s
option httpchk GET /health
frontend fe_web
bind *:80
default_backend be_app
backend be_app
balance roundrobin
default-server inter 2000 rise 3 fall 2 slowstart 30s on-marked-down shutdown-sessions
server app1 10.0.0.1:8080 check weight 10
server app2 10.0.0.2:8080 check weight 10
预期效果
- app1/app2 若故障,连续 2 次失败后摘除。
- 恢复需连续 3 次成功后进入 slowstart 30s 渐进放量。
启动/重载与验证#
检查配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg
- 说明:
-c校验配置,-f指定配置文件。
平滑重载
systemctl reload haproxy
- 说明:避免断链,保留现有连接。
验证健康状态(stats socket)
1) 启用 socket(加入 global)
global
stats socket /run/haproxy/admin.sock mode 660 level admin
2) 查询后端状态
echo "show servers state" | socat stdio /run/haproxy/admin.sock
预期输出关键字段
- srv_state:2 表示 UP,1 表示 DOWN。
手动重加入与权重调整#
临时将节点加入并逐步放量
echo "set server be_app/app1 state ready" | socat stdio /run/haproxy/admin.sock
echo "set server be_app/app1 weight 5" | socat stdio /run/haproxy/admin.sock
sleep 20
echo "set server be_app/app1 weight 10" | socat stdio /run/haproxy/admin.sock
- 说明:
state ready允许接收流量,先低权重再升高。
故障排查清单(含命令)#
1) 频繁上下线(抖动)
# 查看日志是否频繁出现 DOWN/UP
journalctl -u haproxy -n 200 | egrep "DOWN|UP"
- 处理:增大
inter或rise,减少误判。
2) 恢复后流量暴增
# 查看后端当前权重与状态
echo "show servers state" | socat stdio /run/haproxy/admin.sock | grep be_app
- 处理:设置
slowstart,并降低初始weight。
3) 健康检查路径误配
curl -I http://10.0.0.1:8080/health
- 处理:确保
option httpchk与应用健康接口一致。
练习与实操#
练习 1:模拟恢复慢放量
1) 将 slowstart 改为 60s,重载。
2) 手动 set server be_app/app1 state drain,观测流量下降。
3) 再 state ready,观察 60s 内权重逐步生效。
练习 2:调优 rise/fall
1) 设置 rise 5 fall 2,模拟后端间歇失败。
2) 观察上下线次数是否下降。
练习 3:检查间隔与误判
1) 设置 inter 500 与 inter 3000 对比。
2) 记录日志中的 DOWN/UP 次数,选择更稳配置。