Keepalived配置中必须用track_script而非health_check(该词不存在);需在vrrp_instance中引用全局定义的vrrp_script块名,脚本须绝对路径、可执行、返回0/非0,且不能依赖进程存在而应探测真实服务可用性。

Keepalived配置文件里health_check必须用script还是track_script
必须用 track_script,health_check 不是 Keepalived 配置项,属于常见拼写错误或混淆(比如和 Nginx 的 health_check 搞混)。真实可用的机制是:track_script 块定义检测脚本,再在 vrrp_instance 中引用它。
脚本本身没有固定命名要求,但需满足:可执行(chmod +x)、返回值为 0(健康)或非 0(不健康)、执行时间远小于 interval 设置(建议 ≤1s)。
-
track_script块中脚本名不带路径,只写 basename(如check_nginx),Keepalived 会按 PATH 查找或默认在 /usr/local/bin/ 下找 - 若脚本不在 PATH 中,推荐用绝对路径 +
exec方式,例如:exec /opt/scripts/check_db.sh - 不要在脚本里用
sleep或长连接等待——超时会导致 VRRP 状态卡住或误切
写一个检测 Nginx 是否响应 HTTP 的健康检查脚本要注意什么
不能只用 pgrep nginx 或 systemctl is-active,进程存在 ≠ 服务可用。真实场景下 Nginx worker 崩溃、端口被占、配置加载失败都可能让 VIP 漂移失效。
推荐用 curl -f -s -m 2 http://127.0.0.1:80/health(前提是后端有轻量 health 接口),或退而求其次用 nc -z -w 1 127.0.0.1 80 判断端口通断。
-
-f让 curl 在 HTTP 非 2xx/3xx 时返回非 0;-m 2控制最大耗时,避免阻塞 - 避免用
http://localhost——某些系统 hosts 解析慢,直接写127.0.0.1 - 脚本开头加
#!/bin/bash,结尾明确exit 0或exit 1,别依赖最后一行命令返回值 - 不要输出任何内容到 stdout/stderr(Keepalived 会记录日志,大量输出可能撑爆 journal)
双机切换时VIP漂不过去?重点查这三处
90% 的“VIP 不漂移”问题出在底层连通性或权限,不是脚本逻辑错。
- 两台机器的
vrrp_instance中state必须不同(一台MASTER,一台BACKUP),且priority差值 ≥ 50,防止抖动 - 防火墙要放行 VRRP 协议(IP 协议号 112),不是 UDP 端口——CentOS/RHEL 上运行
iptables -I INPUT -p 112 -j ACCEPT;firewalld 用firewall-cmd --add-protocol=vrrp --permanent - SELinux 若启用,需允许 keepalived_t 访问网络:临时关掉验证用
setenforce 0,长期方案是setsebool -P keepalived_read_config on
脚本里要不要加 systemctl restart keepalived 自动重载
不要。Keepalived 支持热重载:kill -USR1 $(cat /var/run/keepalived.pid) 或 systemctl reload keepalived 即可重新读配置,无需重启。硬重启会导致 VIP 瞬断、状态重置,还可能触发脑裂。
唯一需要重启的情况是:升级 Keepalived 二进制、修改了 global_defs 中的 notify 脚本路径、或启用了新模块(如 enable_track_process)。
- 配置变更后,先用
keepalived -t -f /etc/keepalived/keepalived.conf语法校验 - reload 前确认
pidfile路径与实际一致(默认/var/run/keepalived.pid),否则 reload 会失败静默 - 如果用 Ansible 自动部署,
systemd模块的state: reloaded比restarted更安全


















