12.6.6 典型故障场景与切换流程复盘

本节聚焦 Keepalived 高可用体系中的典型故障场景与切换流程,复盘从检测、仲裁到业务恢复的关键路径,补充可执行示例、排错命令与演练练习,建立可预期、可验证的切换机制。

原理草图:故障检测与切换链路#

文章图片

典型故障场景一:主节点网络中断#

现象:VIP 不可达、ARP 缓存指向旧主、应用连接超时。

切换流程
1. Backup 节点检测到 VRRP 广播丢失或健康检查失败。
2. Backup 提升为 MASTER,绑定 VIP。
3. 发送 gratuitous ARP 更新上游与客户端 ARP 缓存。
4. 应用连接自动重试,流量切换到新主。

关键配置示例(/etc/keepalived/keepalived.conf)

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:vip
    }

    garp_master_delay 1
    garp_master_repeat 3
}

排错命令与解释

# 1) 查看VRRP状态与VIP绑定
ip -4 addr show dev eth0 | grep 10.0.0.100
# 2) 抓包确认VRRP心跳是否到达
tcpdump -i eth0 vrrp
# 3) 检查GARP是否发送
tcpdump -i eth0 arp and host 10.0.0.100
# 4) 查看系统日志
journalctl -u keepalived -n 200 --no-pager

复盘要点
- VRRP 通告间隔与降级阈值需合理配置,避免假死放大。
- 上游交换机或安全设备需允许 GARP。
- TCP 长连接需配合应用侧重连策略与连接池健康检测。

演练练习
1. 主节点执行 ifdown eth0(或禁用接口)模拟网络中断。
2. 观察 VIP 是否在 3~5s 内切换到备节点。
3. 恢复网络后检查是否发生频繁抢占。


典型故障场景二:主节点应用进程异常但系统存活#

现象:系统仍在线,VIP 未切换,但业务不可用。

切换流程
1. Keepalived 执行自定义健康检查脚本返回失败。
2. 权重降低或触发 notify 脚本,主节点降级为 BACKUP。
3. 备节点接管 VIP,并恢复业务服务。

健康检查脚本示例(/etc/keepalived/check_nginx.sh)

#!/bin/bash
# 检查HTTP端口是否可用,不可用返回1触发降级
curl -sSf http://127.0.0.1:80/healthz >/dev/null
if [ $? -ne 0 ]; then
  exit 1
fi
exit 0

配置关联(/etc/keepalived/keepalived.conf)

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    fall 2
    rise 2
    weight -30
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1

    track_script {
        chk_nginx
    }

    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:vip
    }
}

排错命令与解释

# 1) 手动执行健康检查脚本
bash -x /etc/keepalived/check_nginx.sh
# 2) 查看keepalived脚本执行日志
grep -i "Script" /var/log/messages | tail -n 50
# 3) 检查应用端口
ss -lntp | grep :80

复盘要点
- 健康检查脚本必须判定“业务可用性”,而非仅进程存在。
- 建议设置 rise/fall 防抖,避免抖动。
- 应用启动耗时长时需配合 preempt_delay 与启动完成探测。

演练练习
1. 手动停止 Nginx:systemctl stop nginx
2. 验证 VIP 是否从主节点切换到备节点。
3. 恢复服务后确认是否发生抢占回切。


典型故障场景三:脑裂(双主)#

现象:两节点同时持有 VIP 或业务分流异常。

切换流程
1. 网络分区导致 VRRP 通信中断。
2. 双方均提升为 MASTER 并绑定 VIP。
3. 客户端访问受网络拓扑影响出现不一致。

现象确认命令

# 两节点都出现VIP即疑似脑裂
ip -4 addr show dev eth0 | grep 10.0.0.100
# 观察VRRP报文异常
tcpdump -i eth0 vrrp

配置建议(专用心跳网卡 + 单播)

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100

    unicast_src_ip 10.0.1.10
    unicast_peer {
        10.0.1.11
    }

    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:vip
    }
}

复盘要点
- 优化 VRRP 链路可靠性,配置专用心跳网卡。
- 使用 vrrp_garp_interval 控制 GARP 频率。
- 关键系统引入第三方仲裁或 BFD 支持。
- 数据类业务需配合复制一致性与写保护策略。

演练练习
1. 通过防火墙阻断 VRRP 流量模拟分区:
iptables -A INPUT -p vrrp -j DROP
2. 观察两端 VIP 是否同时存在。
3. 清理规则并验证恢复。


典型故障场景四:切换后回切导致业务抖动#

现象:主节点恢复后频繁抢占,业务流量抖动。

切换流程
1. 原主恢复后基于优先级抢占 VIP。
2. 短时间内多次抢占导致连接频繁中断。

抑制回切配置示例

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    nopreempt
    preempt_delay 30
    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:vip
    }
}

排错命令与解释

# 观察频繁切换日志
journalctl -u keepalived -n 200 --no-pager | grep -i "Transition"

复盘要点
- 设置 nopreempt 或合理配置 preempt_delay
- 通过业务稳定期后再手工或定时触发回切。
- 重要系统采用“无自动回切”的运维策略。

演练练习
1. 恢复主节点后观察是否自动抢占。
2. 修改配置为 nopreempt 后再次验证。


典型故障场景五:LVS/负载均衡后端失效#

现象:VIP 可用但服务实际不可用,流量打到失效后端。

切换流程
1. 健康检查检测到后端失败,Keepalived 移除 Real Server。
2. 如主节点负载均衡服务异常,触发 VIP 切换。

示例:LVS 配合健康检查

virtual_server 10.0.0.100 80 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 10.0.0.201 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 2
        }
    }

    real_server 10.0.0.202 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

排错命令与解释

# 查看LVS后端状态
ipvsadm -Ln
# 验证后端可达性
curl -sS http://10.0.0.201/healthz

复盘要点
- 区分“节点高可用”与“后端服务可用性”两层检查。
- 对 LVS/HAProxy 场景,应同步后端状态避免黑洞。

演练练习
1. 停止其中一台后端服务,观察是否被剔除。
2. 停止负载均衡服务,观察 VIP 是否切换。


典型故障场景六:配置漂移导致切换失败#

现象:备节点无法接管 VIP 或服务启动失败。

切换流程
1. 主节点故障后,备节点尝试接管但应用未就绪。
2. VIP 虽切换但端口不可用或依赖缺失。

对比配置一致性示例

# 对比主备配置一致性
diff -u /etc/keepalived/keepalived.conf /backup/keepalived.conf
# 检查依赖服务状态
systemctl status nginx

复盘要点
- 使用配置管理与校验机制保证主备一致性。
- 统一部署脚本与依赖版本,定期进行演练。
- 切换前后自动化检查服务端口与业务依赖。

演练练习
1. 主备安装不同版本应用,模拟漂移。
2. 触发切换验证业务是否可用。


切换流程复盘清单(适用于演练与故障回放)#

  1. 检测:触发条件(VRRP 通告丢失、脚本失败、资源异常)。
  2. 仲裁:优先级与抢占策略判断。
  3. 接管:VIP 绑定与 GARP 广播。
  4. 服务:应用启动与端口可用确认。
  5. 恢复:业务侧重连与稳定性观察。
  6. 回切:手工或自动回切策略执行。
  7. 验证:链路、DNS、监控告警与日志完整性确认。

复盘记录模板(示例)

故障时间: 2024-xx-xx 10:21
触发条件: VRRP心跳丢失
切换耗时: 4s
业务恢复: 8s
是否发生回切: 否
关键日志: /var/log/messages
优化建议: 调整preempt_delay为30s

关键运维建议#

  • 定期演练,验证切换时延与业务恢复时间(RTO)。
  • 监控 VRRP 状态、VIP 可达性、GARP 发送成功率。
  • 关键路径采用双网卡、独立心跳与隔离平面。
  • 将切换流程纳入变更与应急预案,形成标准化复盘模板。