如何利用 Keepalived 的 nopreempt 参数减少不必要的双机切回抖动

胖杰大大_5317

胖杰大大_5317

2026-05-11

1021人浏览

原创

nopreempt可避免主节点恢复后立即抢占vip引发二次切换,需同时满足:所有节点state设为backup、显式配置nopreempt、禁用vrrp_strict;配合preempt_delay和track_script才能实现健康感知的平滑切换。

如何利用 keepalived 的 nopreempt 参数减少不必要的双机切回抖动

用 nopreempt 参数能有效避免主节点恢复后立即抢回 VIP 导致的二次切换,从而减少业务抖动。它的核心作用不是“不让主节点当主”,而是“不急着抢回来”,让当前服务节点稳住流量,特别适合对连接稳定性要求高的场景(比如长连接、SIP 通话、WebSocket 或数据库代理)。

必须满足的配置前提

启用 nopreempt 不是加一行就完事,以下三点缺一不可:

  • 所有节点 state 必须设为 BACKUP:哪怕你心里认它是“主”,配置里也不能写 MASTER;VRRP 角色由 priority 决定,不是靠 state 标签
  • 明确指定 nopreempt:只写在需要“不抢占”的节点上(通常是高优先级那台),低优先级节点可不写(默认不抢占也不影响)
  • 禁用 vrrp_strict 模式:这个严格模式会校验 VRRP 报文合法性,与 nopreempt + BACKUP 组合冲突,导致 Keepalived 启动失败或日志报错

为什么光配 nopreempt 还不够?补一个 preempt_delay

nopreempt 让节点“彻底不抢”,但有时你希望它“稍等再抢”——比如主节点刚重启,Nginx 还没热起来、数据库连接池还没建好,这时抢 VIP 反而引发错误。这时候加 preempt_delay N(单位秒)更实用:

  • 主节点恢复后,先等待 N 秒(例如 300 秒),期间持续检查自身健康状态(如通过 track_script)
  • 若等待期内一切正常,才发起抢占;若中途失败,则放弃
  • 这比纯 nopreempt 更灵活,兼顾了资源回收和业务平滑

配合健康检测,避免“假恢复”触发误切

nopreempt 只管 VIP 归属逻辑,不管服务本身是否真可用。如果主节点 Keepalived 进程起来了,但 Nginx 崩了,它仍会安静待命,VIP 留在备机不动——这是对的;但万一它“假装健康”,就会让 VIP 长期滞留故障节点。

所以一定要搭配 track_script:

  • 写个简单脚本检查 Nginx 进程或端口(如 curl -s http://127.0.0.1/health | grep ok)
  • 在 vrrp_instance 中引用,并设置 weight(如 weight -20),让健康失败直接拉低 priority
  • 这样即使 nopreempt 开着,只要服务不健康,priority 掉到比备机还低,VIP 就自然留在备机

验证是否生效的快速方法

别只看日志,用命令直击关键状态:

  • ip a | grep "inet.*virtual":确认 VIP 当前在哪台机器上
  • systemctl stop keepalived && sleep 2 && systemctl start keepalived 模拟主节点闪断,观察 VIP 是否真的没切回去
  • tail -f /var/log/messages | grep -i "transition\|master\|backup":盯住状态切换日志,确认没有 “Entering MASTER STATE” 类似记录
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

2026.10.15

0

20

VS Code 怎么配置开发环境
VS Code 怎么配置开发环境

VS Code开发环境专题汇集编辑器安装、语言扩展、编译器、解释器、终端和调试配置文章,覆盖Java、Python、C++和PHP等常见语言的入门设置。

2026.10.15

0

18

C++ 开发环境怎么搭建
C++ 开发环境怎么搭建

C++开发环境专题汇集Windows、Linux下的编译器与IDE安装配置教程,涵盖GCC、Clang、Visual Studio、CLion和VS Code,以及编译运行首个程序的步骤。

2026.10.15

0

19

Python 虚拟环境是什么
Python 虚拟环境是什么

Python虚拟环境专题介绍项目依赖隔离的作用,汇集venv与uv创建、激活、退出及解释器切换的相关文章,并覆盖Windows、Linux和VS Code中的常见配置问题。

2026.10.15

0

15

Python 怎么安装并配置环境变量
Python 怎么安装并配置环境变量

Python安装与环境变量配置专题汇集Windows、macOS和Linux的安装步骤、PATH设置、pip配置及常见报错排查文章,帮助完成解释器安装并验证命令行可以正常运行。

2026.10.15

0

15

PHP 连接 MySQL 失败怎么办
PHP 连接 MySQL 失败怎么办

PHP连接MySQL失败专题汇集PDO与MySQLi扩展配置、账号权限、主机端口、套接字和认证方式等排查文章,覆盖连接报错、密码变更与容器环境配置,帮助按错误提示定位原因并修复。

2026.10.15

0

18

PHP 表单提交后如何获取数据
PHP 表单提交后如何获取数据

PHP表单提交后如何获取数据专题汇集HTML表单提交、GET与POST接收、$_POST和$_GET读取、跨文件传值、单选与下拉字段获取,以及空值和接收失败排查等文章,帮助新手完成从提交到处理的完整流程。

2026.10.15

0

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习