12.7.1 常见故障类型与症状识别

Keepalived在生产环境中的故障通常表现为VIP漂移异常、主备状态不一致、健康检查误判与业务中断。本节聚焦常见故障类型与症状识别,并通过示例、命令与排错流程建立快速定位思路。

原理草图(VIP漂移与健康检查触发切换):

文章图片

常见故障类型与典型症状(含可验证示例):
- VIP不漂移或无法切换:主节点故障后备节点未接管VIP;备节点处于BACKUP但未提升为MASTER。
验证命令与预期:
bash # 在备节点查看VIP是否绑定 ip addr show dev eth0 | grep -w "192.168.10.100" # 预期:切换后能看到VIP/32绑定在备节点网卡

  • VIP漂移频繁抖动:短时间多次切换导致连接断开。
    日志症状:
    bash journalctl -u keepalived -n 50 # 预期:看到频繁的 "Entering MASTER/BACKUP STATE" 记录

  • 脑裂(双主):主备同时持有VIP导致ARP冲突。
    现场检查:
    bash # 在同一网段客户端查看VIP对应的MAC arping -I eth0 192.168.10.100 -c 5 # 预期:若出现多个MAC响应,可能发生双主

  • 健康检查误判:服务正常却切换或服务异常未切换。
    脚本返回码验证:
    bash # 手动执行健康检查脚本 /etc/keepalived/check_nginx.sh; echo $? # 预期:正常服务返回0;异常返回非0

  • VRRP通信异常:实例状态停留在INIT/BACKUP,或优先级异常抢占。
    抓包识别:
    bash # 抓取VRRP通告(协议号112) tcpdump -i eth0 vrrp -nn -c 5 # 预期:每1s或配置间隔看到VRRP通告

  • LVS/负载均衡不生效:Keepalived显示正常但转发失败。
    LVS状态检查:
    bash ipvsadm -Ln # 预期:Virtual Server与Real Server列表存在且状态为UP

  • 配置错误与语法问题:启动失败或持续重启。
    检查配置语法:
    bash keepalived -t -f /etc/keepalived/keepalived.conf # 预期:输出 "Configuration is OK"

  • 系统与网络层冲突:ARP缓存异常、iptables阻断、路由冲突。
    典型排查:
    bash iptables -S | egrep 'DROP|REJECT' ip route show # 预期:VIP路由无异常,防火墙未阻断VRRP或VIP端口

症状与可能原因对照(含命令定位):
- 业务不可达但节点状态正常:VIP未绑定、iptables拦截、ARP邻居缓存不更新。
bash ip addr show dev eth0 | grep -w VIP ip neigh show | grep VIP
- 主备切换延迟明显:vrrp_script超时、检查频率过低、CPU负载高。
bash top -b -n 1 | head -20 grep -n "vrrp_script" -n /etc/keepalived/keepalived.conf
- 只有部分客户端异常:ARP缓存不一致或交换机ARP抑制。
bash arping -I eth0 VIP -c 3 # 多客户端对比MAC变化
- 状态反复变化:抢占配置不合理、优先级波动或脚本不稳定。
bash grep -n "nopreempt|priority|advert_int" /etc/keepalived/keepalived.conf
- 双主现象:网络分区或认证不一致。
bash grep -n "auth_type|auth_pass|virtual_router_id" /etc/keepalived/keepalived.conf

完整排错示例(从症状到定位):

# 1) 确认VIP位置
ip addr show dev eth0 | grep -w 192.168.10.100

# 2) 查看状态日志
journalctl -u keepalived -n 100 | egrep "STATE|vrrp"

# 3) 检查VRRP通告是否丢失
tcpdump -i eth0 vrrp -nn -c 5

# 4) 验证健康检查脚本返回码
/etc/keepalived/check_nginx.sh; echo "rc=$?"

# 5) 校验配置一致性与语法
keepalived -t -f /etc/keepalived/keepalived.conf

预期效果:能快速判断是VIP未绑定、脚本误判还是VRRP通告异常。

示例配置片段(含关键参数与作用):

# /etc/keepalived/keepalived.conf
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    timeout 1
    fall 2
    rise 3
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100/32
    }
    track_script {
        chk_nginx
    }
}

健康检查脚本示例(排错与稳定性验证):

# /etc/keepalived/check_nginx.sh
#!/usr/bin/env bash
curl -fsS http://127.0.0.1:80/health >/dev/null 2>&1
if [ $? -eq 0 ]; then
  exit 0
else
  exit 1
fi

说明:脚本返回码不稳定会造成频繁切换,需控制超时与重试策略。

练习与自检:
1. 人为停止Nginx并观察VIP漂移:
bash systemctl stop nginx ip addr show dev eth0 | grep -w 192.168.10.100 journalctl -u keepalived -n 50
预期:VIP从MASTER漂移至BACKUP,日志出现切换记录。
2. 修改auth_pass使主备不一致,观察状态变化:
bash sed -i 's/auth_pass 1111/auth_pass 2222/' /etc/keepalived/keepalived.conf systemctl restart keepalived tcpdump -i eth0 vrrp -nn -c 5
预期:收不到对端通告或状态长期停留在BACKUP。