keepalived vrrp_instance不生效主因是state与priority配置错误:主机必须设state master、备机必须设state backup;优先级差建议≥50;需用track_script而非已废弃的check_script;interface网卡名须准确;脚本输出须精简防截断。

Keepalived配置文件里vrrp_instance块不生效?检查state和priority顺序
Keepalived主备切换失败,最常见原因是vrrp_instance里state和priority配反了:备机不能设state MASTER,哪怕它的priority更低;主机也不能设state BACKUP还指望抢主。实际运行只看state初始状态 + priority比较结果,不是靠优先级自动升降态。
实操建议:
-
state MASTER只能出现在你**预期启动时就接管VIP的节点**上,另一台必须写state BACKUP - 两台都写
state BACKUP,靠priority高低决定谁先升主(需开启nopreempt才允许降级后不抢回) -
priority值范围是1–255,主备差建议≥50,避免网络抖动触发误切换 - 改完配置必须
systemctl restart keepalived,reload不重载vrrp_instance状态
检测后端服务是否存活,用check_script还是track_script?
check_script已废弃,Keepalived 2.0+ 只认track_script。直接写check_script会导致配置加载成功但脚本完全不执行,VIP永远不飘——错误现象就是“明明服务挂了,VIP还在原机器上”。
实操建议:
- 在
vrrp_instance块内用track_script引用定义好的脚本块名,例如:track_script { chk_http } - 脚本块必须在
vrrp_instance外全局定义,用vrrp_script chk_http { ... } -
script路径必须写绝对路径,如/opt/keepalived/check_http.sh,相对路径会静默失败 - 脚本退出码必须是0(健康)或非0(异常),Keepalived只看exit code,不解析stdout
虚拟IP(VIP)没绑到网卡?确认interface和unicast_peer配置
配置没错、服务也启了,但ip addr show看不到VIP,大概率是interface写错了网卡名。CentOS 7+ 默认用ens33这类名字,不是eth0;Ubuntu 22.04 可能是enp0s3。另一个坑是用了unicast_peer却忘了关garp_master_delay,导致VIP绑定后无法发ARP刷新下游缓存。
实操建议:
- 用
ip -br a确认真实网卡名,填进interface ens33,别凭经验写eth0 - 单播模式下必须配
unicast_src_ip和unicast_peer,且两端IP要互指,不能只配一边 - 如果用多播(默认),确保交换机没禁IGMP,防火墙放行
224.0.0.18(VRRP组播地址) - 加
garp_master_delay 1让VIP绑定后立刻发免费ARP,避免客户端缓存旧MAC
日志里反复出现“Truncating long line”,脚本输出太长导致健康检查误判
自定义检测脚本里用了curl -v或journalctl -n 100之类带大量输出的命令,Keepalived内部日志缓冲区溢出,截断后可能把关键状态行砍掉,导致解析失败,最终当成脚本异常——现象是日志里不断刷Truncating long line,VIP频繁抖动。
实操建议:
- 脚本输出严格限制在1行内,只打印
ok或fail,用head -n1或grep -q过滤无用信息 - 避免在
vrrp_script里调用交互式命令(如ssh),超时默认3秒,容易触发假失败 - 调试时用
tail -f /var/log/messages | grep Keepalived,别只看systemctl status - 生产环境脚本开头加
set -e,任何子命令失败立即退出,别让错误被后续命令掩盖
真正麻烦的是跨机房或云厂商VPC场景下,unicast穿透NAT失败、安全组拦截ICMP、甚至云平台禁止虚拟MAC——这些不会报错,但VIP就是不切,得一层层验网络通路,不是配对配置就能解决的。










