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剔除

切换验证步骤(含日志与指标)#

  1. 触发故障并记录时间戳
date && systemctl stop haproxy
  1. 观察Keepalived状态变化
journalctl -u keepalived -f
# 观察:Entering MASTER STATE / Entering BACKUP STATE
  1. 验证VIP漂移与服务可达
# 在BACKUP上检查VIP
ip addr show dev eth0 | grep 10.0.0.100

# 在客户端验证
curl -I http://10.0.0.100/
  1. 检查HAProxy接管
# HAProxy stats端口(假设9090)
curl -s http://10.0.0.100:9090/stats | head
  1. 记录切换耗时与错误率
# 统计日志中5xx次数(以nginx为后端示例)
grep " 5[0-9][0-9] " /var/log/nginx/access.log | wc -l

回切验证步骤(含preempt示例)#

  1. 恢复主节点
systemctl start haproxy
ip link set dev eth0 up
  1. 验证回切策略
    /etc/keepalived/keepalived.conf
# 若不允许自动回切,启用 nopreempt
vrrp_instance VI_1 {
  state MASTER
  priority 150
  nopreempt
}
  1. 观察回切
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 $?

演练练习(可操作任务)#

  1. 练习一:进程故障切换
    - 步骤:停止MASTER的HAProxy,观察VIP漂移与业务可达性。
    - 结果:切换耗时 < 5s,错误率 < 1%。

  2. 练习二:网络故障切换与回切
    - 步骤:ip link set dev eth0 down,观察切换;恢复后观察回切策略。
    - 结果:VIP漂移成功,回切符合预期(preempt/nopreempt)。

  3. 练习三:健康检查一致性
    - 步骤:停止后端App-1,查看HAProxy剔除与Keepalived是否误切。
    - 结果:HAProxy剔除App-1,但Keepalived不切换。

关键校验点与输出结果#

  • VIP漂移与ARP更新:VIP绑定成功、客户端ARP刷新生效。
  • 会话保持:cookie/源IP会话保持策略在切换后可恢复或可重建。
  • 告警闭环:故障告警触达与恢复通知完整。

输出结论示例(记录到变更单):
- 切换耗时:3.2s;回切耗时:4.1s
- 失败请求:12次;重试成功率:99.6%
- 改进建议:启用GARP、调整weightadvert_int、补充VRRP监控指标