根本原因是unicast通信不通导致vrrp状态异常,需确保两端udp 3240端口双向互通、interface和unicast_src_ip配置正确、unicast_peer填写对端真实ip,否则会进入fault状态并释放vip。

keepalived 里 vrrp_instance 配置了 unicast_peer,但 VIP 不生效
根本原因通常是 unicast 通信没通,导致 VRRP 状态卡在 BACKUP 或反复切换,VIP 根本不绑定。这不是配置写错的问题,而是网络层连通性被忽略了。
-
unicast_peer要求两端能直接 UDP 单播通信(默认端口3240),防火墙、云厂商安全组、容器网络或跨网段路由都可能拦截 - 必须双向互通:A 发给 B 的包,B 要能回;不能只开 A→B 的出口
- 检查方式不是看配置文件有没有写,而是用
tcpdump -i any port 3240在两台机器上同时抓包,确认能否看到对方发来的 VRRP 包 - 如果用的是
eth0但实际流量走的是ens192,interface参数配错也会导致发包失败
为什么加了 unicast_peer 反而 VIP 消失了
因为 keepalived 默认用多播(224.0.0.18),加了 unicast_peer 就强制切单播模式,一旦其中一台收不到对端的通告,就会降级为 FAULT 状态,主动释放 VIP。
- 常见现象:
ip addr show看不到 VIP,systemctl status keepalived显示状态是FAULT或反复在BACKUP/MASTER间跳变 - 日志里会频繁出现:
VRRP_Script(check_nginx) failed或Timeout for interface eth0—— 实际未必是脚本或接口问题,而是底层 VRRP 通告断了 - 单播模式下不依赖 IGMP 或多播路由,但要求
unicast_src_ip必须是本机真实存在的 IP(不能是 VIP,也不能是未配置的地址)
unicast_peer 和 unicast_src_ip 怎么配才不翻车
这两个参数必须成对出现,且 unicast_src_ip 是你希望用来发包的本地 IP,不是 VIP,也不是 127.0.0.1。
-
unicast_peer列表里只能写对端的真实 IP(IPv4),不能写域名、不能写 0.0.0.0、不能写 VIP - 如果集群有 3 台,每台的
vrrp_instance块里都要列出另外两台的 IP,顺序无关 - 示例正确写法:
unicast_src_ip 192.168.5.10<br>unicast_peer {<br> 192.168.5.11<br> 192.168.5.12<br>} - 错误写法:
unicast_src_ip 192.168.5.100(该 IP 未配置在任何接口上)或漏掉unicast_src_ip(keepalived 会静默降级为多播)
IPVS 规则没更新,不是 keepalived 的锅
keepalived 只管 VIP 绑定和健康检查,ipvsadm 规则得自己配或靠外部脚本同步。VIP 有了但服务无响应,大概率是 IPVS 没加载规则,或者 real server 不通。
- 检查是否真有规则:
ipvsadm -Ln,空输出说明没加;--syncid参数不等于自动同步 - 如果用了
vrrp_script触发 IPVS 更新,要确认脚本 exit code 是 0 才算成功,且脚本里调用ipvsadm时用了绝对路径(如/sbin/ipvsadm) - real server 的回包路径要一致:若 VIP 在 LB 上,RS 回包不能绕过 LB(否则 TCP 握手失败),常见解法是 RS 使用 LB 作为网关,或配置
arp_ignore/arp_announce











