主备切换时VIP无法绑定,本质是Keepalived未能将虚拟IP写入网卡,需排查网卡名匹配性、VIP占用冲突、内核ARP参数、防火墙拦截VRRP报文及SELinux限制。

主备切换时VIP无法绑定,本质是Keepalived没能成功将虚拟IP写入网卡。这不是服务没启、配置没读,而是内核网络栈和VRRP协议协同失败的结果。重点排查方向是:网卡名是否真实存在、VIP是否被其他进程占用、内核参数是否抑制绑定、防火墙是否拦截VRRP报文。
确认interface配置与实际网卡完全匹配
Keepalived配置里的interface必须和系统真实网卡名一字不差。CentOS 7+ 默认是ens192、ens33;Ubuntu 22.04 常见enp0s3;云主机可能是eth0或ens5。凭经验写eth0是高频错误。
- 执行ip -br a查看所有接口简明列表,找状态为UP的那一个
- 在keepalived.conf中vrrp_instance块里,把interface设为该名称,例如interface ens192
- 改完后重启服务:systemctl restart keepalived,不要用reload
检查VIP是否已被占用或冲突
VIP不能是本机已有IP,也不能与其他节点重复。若两台机器同时启动Keepalived且都配了state MASTER,或virtual_router_id不一致,就可能触发双主,导致VIP在两台都出现或都不出现。
- 执行ip addr show确认当前VIP未出现在任何接口上(排除残留)
- 检查virtual_router_id是否两端完全相同(如都设为51),且全网唯一
- 确保主节点state MASTER、备节点state BACKUP,不能都写MASTER
- 优先级差建议≥50(如主150、备100),避免网络抖动误切换
验证VRRP报文能否正常收发
Keepalived靠VRRP广播/单播维持主备状态。如果报文发不出去或收不到,备机就会超时升主,但VIP却没绑上——因为根本没完成状态协商。
- 在主节点执行tcpdump -i ens192 vrrp -n,确认能发出VRRP包(目的IP 224.0.0.18)
- 在备节点同样抓包,看是否收到主节点的VRRP通告
- 若收不到,检查防火墙:iptables -vnL INPUT,确认放行VRRP(协议号112)或组播地址224.0.0.18
- SELinux若为enforcing状态,也需关闭:setenforce 0并修改/etc/selinux/config
确认内核允许VIP绑定到非主接口
Linux默认禁止将非本机主IP绑定到网卡,尤其当VIP不是该网卡子网内的地址时。这会导致Keepalived调用ioctl成功,但ip addr show里看不到VIP。
- 检查net.ipv4.conf.all.arp_ignore是否为1(只响应本机IP的ARP)
- 检查net.ipv4.conf.all.arp_announce是否为2(优先使用最佳本地地址作源)
- 临时生效:echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore && echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 持久化写入/etc/sysctl.conf并运行sysctl -p










