故障现象

生产环境 Keepalived 双机热备,VIP 为 10.244.69.249,挂在 MASTER 节点(10.244.69.37)的 eth0:1 上。

具体表现:

  • 从其他机器 ping MASTER 物理 IP 10.244.69.37,正常
  • 从其他机器 ping VIP 10.244.69.249,不通
  • MASTER 本机 ip addr 看,VIP 绑定正常
  • BACKUP 节点(10.244.69.38)没有持有 VIP,排除脑裂

环境

角色 IP 网卡 说明
MASTER 10.244.69.37 eth0 VIP 持有节点
BACKUP 10.244.69.38 eth0 热备节点
VIP 10.244.69.249/32 eth0:1 label 方式挂载

Keepalived 关键配置:

vrrp_script chk {
    script "/usr/bin/bash -c '</dev/tcp/127.0.0.1/13531'"
    interval 2
    weight  -2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 249
    priority 100
    virtual_ipaddress {
        10.244.69.249 dev eth0 label eth0:1
    }
}

健康检查探测本机 13531 端口,失败则 priority 降到 98,触发主备切换。

排查过程

第一步:确认 VIP 是否真的绑上了

在 MASTER 上执行 ip addr show eth0,输出里有:

inet 10.244.69.249/32 scope global eth0:1

VIP 确实在 MASTER 上,排除 VIP 丢失。

第二步:确认是否脑裂

BACKUP 节点 ip addr show eth0 输出里没有 VIP 条目,主备状态正常,排除脑裂。

第三步:查 ARP

物理 IP 通、VIP 不通,两者在同一张网卡、同一个子网,区别只有一个:VIP 是 /32,对端 ARP 表里可能压根没有这条记录。在对端执行:

arp -n | grep 10.244.69.249

结果为空。对端 ARP 表里没有 VIP 的 MAC 映射,二层根本转发不了,ping 请求到不了 MASTER。

原因

Keepalived 在 VIP 漂移或服务启动时会发 Gratuitous ARP,通知网络里其他节点刷新 ARP 表。但有些情况下这个广播没被交换机/SDN 正确学习,或者已经过期了:

  • 云环境 / SDN 可能对 Gratuitous ARP 有限速或过滤
  • ARP 缓存老化,默认 TTL 几分钟到几小时不等
  • VIP 以 /32 掩码配合 label 方式添加,部分实现不会再次触发 Gratuitous ARP

结果就是对端 ARP 表里没有 10.244.69.249 → MAC 的映射,二层帧投递不了,ICMP 包被丢,表现为 ping 不通。

解决

先恢复:手动发 Gratuitous ARP

在 MASTER 节点上执行:

sudo arping -U -I eth0 -c 5 10.244.69.249

参数说明:

  • -U:Unsolicited ARP,也就是 Gratuitous ARP 模式,不用等回应直接广播
  • -I eth0:指定出口网卡
  • -c 5:发 5 次,确保交换机学到

执行完 ping VIP 立刻恢复。

持久化:在 notify_master 脚本里加 arping

编辑 /apps/conf/keepalived/notify_master.sh,节点切为 MASTER 时自动刷新 ARP:

#!/bin/bash
# 其他逻辑...

# VIP 漂移后主动刷新全网 ARP 表
VIP="10.244.69.249"
INTERFACE="eth0"
arping -U -I ${INTERFACE} -c 5 ${VIP} &

这样每次 VIP 从 BACKUP 切回 MASTER,都会自动广播 Gratuitous ARP,不用人工干预。

总结

核心结论:VIP ping 不通不一定是 Keepalived 配置问题,也不一定是脑裂,ARP 表缺失是一个容易被忽略的二层原因。

排查顺序建议:

  1. 确认 VIP 是否真的绑定(ip addr
  2. 确认是否脑裂(BACKUP 上有没有 VIP)
  3. 检查对端 ARP 表(arp -n | grep <VIP>
  4. 发 Gratuitous ARP 验证(arping -U

预防建议

  • notify_master.sh 里加 arping -U,主备切换后自动刷新 ARP
  • 云环境需确认 SDN/VPC 对 Gratuitous ARP 广播的支持情况
  • 监控 VIP 可达性时,用独立探针(如 Prometheus Blackbox Exporter)从外部 ping VIP,不要只在本机检测端口

环境为 Keepalived 2.x + CentOS/RHEL,VIP 以 /32 label 方式挂载。