keepalived非抢占模式的核心目标是避免主节点恢复后立即抢回vip引发二次切换和业务抖动,需所有节点state设为backup、仅高优先级节点配置nopreempt、禁用vrrp_strict,并推荐搭配preempt_delay与track_script实现健康感知的平滑切换。

Keepalived非抢占模式的核心目标不是阻止高优先级节点当主,而是让它“不急着抢回VIP”,从而避免主节点短暂恢复引发的二次切换和业务抖动。对长连接、WebSocket、SIP或数据库代理类服务尤其关键。
所有节点必须设为 BACKUP
这是硬性前提,不能只在主节点写 MASTER、备节点写 BACKUP。VRRP角色由 priority 决定,state 只是配置标识。若混用 MASTER/BACKUP,nopreempt 可能失效或导致启动异常。
- 主节点配置:state BACKUP,priority 设为较高值(如 150)
- 备节点配置:state BACKUP,priority 设为较低值(如 100)
- 多节点扩容时,优先级建议阶梯差 ≥50,便于故障路径明确
nopreempt 只需加在高优先级节点
该参数作用是“本节点恢复后不主动抢占”,低优先级节点无需也不应配置它——默认就不抢占,加了反而冗余。但生产实践中,为防误删或配置漂移,不少团队会统一加上,属于防御性写法。
- 正确做法:仅在 priority 最高的节点 vrrp_instance 块内添加 nopreempt
- 错误做法:只在低优先级节点加 nopreempt,高优先级仍为默认抢占行为
- 注意:nopreempt 和 preempt_delay 不兼容,二者选其一
必须关闭 vrrp_strict 模式
vrrp_strict 是 Keepalived 的严格校验开关,启用后会拒绝 state=BACKUP + nopreempt 的合法组合,直接导致进程启动失败或日志报错“invalid configuration”。默认是关闭的,但若配置过全局 strict 指令,务必注释掉。
- 检查全局配置段,确认没有 vrrp_strict 行
- 若存在,用 # 注释并重启 keepalived
- 验证方式:journalctl -u keepalived | grep -i error 应无 VRRP 相关拒绝提示
推荐搭配 preempt_delay 实现健康感知切换
纯 nopreempt 是“永不抢”,但有时你希望主节点等服务真正就绪后再接管——比如 Nginx 加载完配置、数据库连上池子、健康检查通过。这时用 preempt_delay N 更稳妥。
- 在高优先级节点配置 preempt_delay 300(单位秒)
- 它会等待 300 秒,并持续运行 track_script 检查本地服务状态
- 期间任一检查失败,则放弃抢占;全部通过才发起 VIP 绑定
- 比 nopreempt 更灵活,兼顾稳定性与资源回收











