keepalived主节点故障恢复后自动抢回vip,依赖vrrp抢占机制:主节点需配置state master、priority高于备节点、不启用nopreempt,且virtual_router_id等参数主备一致;启用nopreempt则禁止自动回归。

Keepalived 故障转移后自动恢复原主节点,靠的是 VRRP 协议的抢占机制(preemption) 和 优先级配置,不是“自动回切”而是“按策略回归”。只要配置得当,主节点恢复后会重新抢回 VIP 和 Master 角色,备节点退回到 Backup 状态。
主节点恢复后能自动回归的关键条件
- 主节点配置中
nopreempt不能启用(默认是开启抢占的) - 主节点的
priority必须高于备节点(如主100、备90) - 主节点恢复后,VRRP 实例能正常启动并发送心跳(
advert_int正常) - 主备节点
virtual_router_id、auth_pass、interface等必须完全一致
如果主节点配置了 nopreempt,即使它恢复也不会主动抢回 VIP,需手动干预或重启 Keepalived。
如何确保恢复后自动回归
-
✅ 在主节点配置中 不要写
nopreemptvrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 # 高于备节点 advert_int 1 authentication { ... } virtual_ipaddress { ... } # 不加 nopreempt → 默认允许抢占 } -
✅ 备节点可显式写
preempt_delay(可选),避免脑裂或频繁切换vrrp_instance VI_1 { state BACKUP preempt_delay 30 # 恢复后等待30秒再尝试抢占(非必需,但更稳) ... } -
✅ 检查主节点恢复后的日志确认抢占行为
journalctl -u keepalived -f | grep -i "master\|transition"
正常情况会看到类似:
VRRP_Instance(VI_1) Entering MASTER STATEVRRP_Instance(VI_1) setting VIPs.
和 Redis 主从切换的区别要特别注意
- Keepalived 是 主优先型(Master-preferred):主恢复 → 自动夺回角色
- Redis Sentinel 是 从优先型(Failover-promoted):原主恢复 → 降级为从,不会抢回主身份
所以 Keepalived 的“自动恢复”是设计使然,不是 bug,也不需要额外脚本补救。
常见导致无法自动回归的问题
- 主节点配置了
nopreempt或state BACKUP - 主节点
priority≤ 备节点(比如都设成100,或主设90、备设95) - 主节点网卡未 UP / VRRP 绑定的 interface 不通(如 eth0 down)
- 主备
virtual_router_id不一致 → 形成两个独立 VRRP 组,互不感知 - 防火墙/交换机禁用了 VRRP 多播报文(目的地址
224.0.0.18,协议号112)
只要避开这几项,主节点重启 Keepalived 后几秒内就会完成 VIP 漂移和角色回归。











