抢占模式下主节点恢复后立即抢回vip,非抢占模式下启用nopreempt后原主节点不再反抢;两者均需结合健康检查脚本与weight动态调整优先级才能感知应用层故障。

Keepalived高可用集群中,抢占模式与非抢占模式的核心区别在于:主节点(MASTER)故障恢复后,是否主动夺回VIP控制权。
抢占模式(默认行为)
未配置 nopreempt 时即为抢占模式。只要节点优先级更高,无论当前谁持有VIP,都会触发切换:
- 备节点发现主节点优先级低于自己 → 立即接管VIP
- 原主节点恢复且 priority 重新高于当前主节点 → 立即抢回VIP
- 依赖 weight 动态调整优先级 才能真正响应业务层故障(如 Nginx 崩溃)。若只靠静态 priority,OS 层存活但服务宕机时无法触发切换
非抢占模式(需显式配置)
必须在 vrrp_instance 块中添加 nopreempt 参数。启用后:
- 备节点一旦升级为 MASTER 并接管 VIP,就不会再被原主节点“挤下去”
- 即使原主节点恢复、priority 更高,也保持 BACKUP 状态,直到当前 MASTER 主动退出或宕机
- 适合对 VIP 切换敏感的场景,比如避免因短暂抖动引发的反复漂移
关键适配要点
两种模式下都必须结合健康检查脚本和 weight 使用,否则无法感知应用层状态:
- 例如配置 vrrp_script chk_nginx { script "/etc/keepalived/check.sh"; interval 2; weight -30; },让故障时 priority 实时下降
- 抢占模式下,weight 是实现“服务挂即切”的必要条件;非抢占模式下,weight 决定的是“谁有资格首次接管”,而非后续是否反抢
- 注意:nopreempt 只在 BACKUP 节点上生效;MASTER 节点配置了也无效
不复杂但容易忽略










