keepalived在多网卡环境下需显式指定vip绑定网卡(如interface eth0),并配置arp_ignore/arp_announce参数防止arp冲突,同时确保路由可达、心跳链路独立及vip切换正确。

Keepalived 在 Nginx 高可用架构中负责管理虚拟 IP(VIP),但当服务器存在多网卡(如 eth0、eth1、bond0 等)时,VIP 默认可能绑定到错误的网卡,导致集群不可访问或脑裂。关键在于显式指定 VIP 绑定的网卡接口,并确保内核参数与网络拓扑匹配。
明确指定 VIP 绑定的物理网卡
Keepalived 默认使用路由表决定绑定接口,容易出错。必须在 vrrp_instance 块中用 interface 指令强制指定网卡名:
- 编辑
/etc/keepalived/keepalived.conf,在vrrp_instance VI_1下添加:interface eth0(替换为实际承载业务流量的网卡,如bond0或ens192) - 避免使用别名接口(如
eth0:1),Keepalived 仅支持主接口名 - 所有节点配置的
interface必须一致,否则状态不同步
关闭非目标网卡的 ARP 响应(防 ARP 冲突)
多网卡环境下,VIP 可能被其他网卡响应 ARP 请求,引发流量错乱。需禁用非绑定网卡的 ARP 处理:
- 在
/etc/sysctl.conf中添加:net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.eth0.arp_ignore = 1net.ipv4.conf.eth0.arp_announce = 2(将eth0替换为实际 VIP 所在网卡) - 执行
sysctl -p生效 - 注意:不要设
arp_ignore = 2,它会完全禁用该接口的 ARP,影响正常通信
检查路由与网络可达性
VIP 必须能被客户端路由可达,且主备节点间心跳链路独立于业务网卡:
- 确认 VIP 所在子网与客户端在同一二层或有正确三层路由
- 若使用独立心跳网卡(如 eth1),需在
vrrp_instance中用unicast_src_ip和unicast_peer显式指定心跳地址,避免走默认路由 - 用
ip addr show eth0验证 VIP 是否出现在预期网卡上;用arping -I eth0 -c 3 [VIP]测试本机是否能发出 VIP 的 ARP 请求
验证 VIP 切换行为
启动 Keepalived 后,不只看进程是否运行,更要验证 VIP 实际归属和切换逻辑:
- 主节点执行
ip addr show eth0 | grep [VIP],确认 VIP 存在 - 停掉主节点 Keepalived,等待 3–6 秒(默认
advert_int 1+priority差值),检查 VIP 是否迁移到备节点 - 从客户端 ping VIP 并抓包,确认响应 MAC 地址始终是当前主节点的网卡 MAC
- 查看
/var/log/messages中 Keepalived 日志,搜索Entering MASTER STATE或Transition to MASTER











