13.7.6 故障演练与切换回切验证
故障演练与切换回切验证旨在验证HAProxy+Keepalived高可用链路在真实故障下的可靠性与可恢复性。本节提供原理草图、演练前准备、故障注入、切换与回切验证、排错与练习,确保业务连续性与可观测性。
原理草图(HAProxy+Keepalived故障切换)#
演练前准备(含命令与解释)#
- 确认服务状态(systemd)
# 查看haproxy与keepalived状态
systemctl status haproxy
systemctl status keepalived
# 关键解释
# Active: active (running) 表示进程正常
# Main PID 为服务主进程
- 确认VIP绑定与ARP
# 查看VIP是否在MASTER上
ip addr show dev eth0 | grep -E "10.0.0.100"
# 查看ARP缓存(客户端或旁路主机)
ip neigh show | grep 10.0.0.100
- 准备持续流量压测
# 在客户端持续请求VIP的80端口
while true; do
curl -s -o /dev/null -w "%{http_code}\n" http://10.0.0.100/health
sleep 1
done
# 解释:
# -w 输出HTTP状态码,用于观察切换过程是否出现5xx/timeout
- 配置检查脚本(Keepalived联动)
/etc/keepalived/check_haproxy.sh
#!/usr/bin/env bash
# 返回非0表示健康检查失败,触发降级
pidof haproxy >/dev/null 2>&1
exit $?
chmod +x /etc/keepalived/check_haproxy.sh
- Keepalived关键配置检查
/etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
virtual_ipaddress {
10.0.0.100/24 dev eth0
}
track_script {
chk_haproxy
}
}
说明:
weight -20表示HAProxy异常时降低优先级,触发切换。
故障注入方式(命令与预期)#
- 注入HAProxy进程故障
# 在MASTER上停止HAProxy
systemctl stop haproxy
# 预期:Keepalived降低优先级,BACKUP接管VIP
- 注入网络故障(心跳网卡)
# 临时断开VRRP心跳网卡
ip link set dev eth0 down
# 预期:VIP漂移到BACKUP
- 注入系统故障(模拟宕机)
# 立即重启(谨慎使用)
reboot
# 预期:BACKUP接管VIP
- 注入后端故障
# 停止后端服务(App-1)
systemctl stop app-1
# 预期:HAProxy健康检查将App-1剔除
切换验证步骤(含日志与指标)#
- 触发故障并记录时间戳
date && systemctl stop haproxy
- 观察Keepalived状态变化
journalctl -u keepalived -f
# 观察:Entering MASTER STATE / Entering BACKUP STATE
- 验证VIP漂移与服务可达
# 在BACKUP上检查VIP
ip addr show dev eth0 | grep 10.0.0.100
# 在客户端验证
curl -I http://10.0.0.100/
- 检查HAProxy接管
# HAProxy stats端口(假设9090)
curl -s http://10.0.0.100:9090/stats | head
- 记录切换耗时与错误率
# 统计日志中5xx次数(以nginx为后端示例)
grep " 5[0-9][0-9] " /var/log/nginx/access.log | wc -l
回切验证步骤(含preempt示例)#
- 恢复主节点
systemctl start haproxy
ip link set dev eth0 up
- 验证回切策略
/etc/keepalived/keepalived.conf
# 若不允许自动回切,启用 nopreempt
vrrp_instance VI_1 {
state MASTER
priority 150
nopreempt
}
- 观察回切
journalctl -u keepalived -f
# 观察是否发生回切,或保持在BACKUP
排错清单(典型问题与命令)#
- VIP未漂移
# 检查VRRP是否通
tcpdump -i eth0 vrrp
# 检查优先级与权重是否生效
grep -n "priority\|track_script" /etc/keepalived/keepalived.conf
- 客户端仍访问旧MASTER
# 刷新ARP缓存(客户端)
ip neigh flush to 10.0.0.100
# 或使用garp脚本
- HAProxy未启动但未切换
# 检查健康脚本执行权限与返回码
bash -x /etc/keepalived/check_haproxy.sh; echo $?
演练练习(可操作任务)#
-
练习一:进程故障切换
- 步骤:停止MASTER的HAProxy,观察VIP漂移与业务可达性。
- 结果:切换耗时 < 5s,错误率 < 1%。 -
练习二:网络故障切换与回切
- 步骤:ip link set dev eth0 down,观察切换;恢复后观察回切策略。
- 结果:VIP漂移成功,回切符合预期(preempt/nopreempt)。 -
练习三:健康检查一致性
- 步骤:停止后端App-1,查看HAProxy剔除与Keepalived是否误切。
- 结果:HAProxy剔除App-1,但Keepalived不切换。
关键校验点与输出结果#
- VIP漂移与ARP更新:VIP绑定成功、客户端ARP刷新生效。
- 会话保持:cookie/源IP会话保持策略在切换后可恢复或可重建。
- 告警闭环:故障告警触达与恢复通知完整。
输出结论示例(记录到变更单):
- 切换耗时:3.2s;回切耗时:4.1s
- 失败请求:12次;重试成功率:99.6%
- 改进建议:启用GARP、调整weight与advert_int、补充VRRP监控指标