故障现象
生产环境 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 表缺失是一个容易被忽略的二层原因。
排查顺序建议:
- 确认 VIP 是否真的绑定(
ip addr) - 确认是否脑裂(BACKUP 上有没有 VIP)
- 检查对端 ARP 表(
arp -n | grep <VIP>) - 发 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 方式挂载。
评论 · 0
发表评论