Keepalived 不同步 Nginx 状态,而是通过进程、端口、HTTP 多级健康检查主动探测,并基于 VRRP 状态机驱动 VIP 漂移;配置 vrrp_script 与 track_script 实现强绑定降级,结合双 VIP、nopreempt 和单播等优化提升高可用性。

Keepalived 本身不直接同步 Nginx 的运行状态,它通过独立的健康检查机制间接感知 Nginx 状态,并据此触发 VIP 漂移。所谓“状态同步”,本质是 Keepalived 主动探测 + 决策 + 切换的过程,而非进程间实时通信或状态复制。
Keepalived 如何感知 Nginx 状态
Keepalived 不依赖 Nginx 主动上报,而是主动发起多层级探测,判断其是否真正可用:
-
进程层检查:用
kill -0 $(cat /var/run/nginx.pid)或pgrep nginx验证 Nginx 主进程是否存在;但仅存在不等于可服务,需进一步验证 -
端口层检查:用
nc -z 127.0.0.1 80或timeout 2 bash -c 'echo > /dev/tcp/127.0.0.1/80' && echo ok确认监听端口已就绪且能响应连接 -
应用层检查(推荐):发送 HTTP 请求验证真实服务能力,例如:
curl -s --fail -o /dev/null http://127.0.0.1/healthz || exit 1
配合 Nginx 返回200 OK的自定义健康接口(如location /healthz { return 200 'OK'; }),避免仅端口通但配置错误或后端全挂的情况
VIP 漂移不是“同步”,而是 VRRP 状态机驱动
VRRP 协议决定了主备角色切换逻辑,Keepalived 是其实现载体:
- 主节点(Master)持续发送 VRRP 广播/组播报文(默认每秒1次),携带自身优先级和状态
- 备节点(Backup)监听报文;若连续丢失
advert_int × 3(默认3秒)未收到,则判定 Master 失联,升为 Master 并绑定 VIP - 切换动作是原子性的:解绑本机 VIP → ARP 抑制 → 绑定 VIP → 发送免费 ARP(Gratuitous ARP)通知局域网更新 MAC 映射
- 无“同步延迟”概念,只有“检测窗口”——可通过
advert_int(通告间隔)和authentication加密校验缩短故障发现时间
避免“假存活”:让 Keepalived 与 Nginx 生命周期强绑定
常见陷阱是 Nginx 进程崩溃但 Keepalived 仍在运行,VIP 滞留在不可用节点上。优化关键在于将健康检查失败直接导致 Keepalived 主动降级:
- 在
vrrp_script中定义检查脚本,返回非0即视为失败 - 用
track_script将该脚本关联到vrrp_instance,并设置fall 2 rise 2(连续2次失败才降级,2次成功才恢复)防止抖动 - 关键配置示例:
vrrp_script chk_nginx {<br> script "/etc/keepalived/check_nginx.sh"<br> interval 2<br> weight -5<br> fall 2<br> rise 2<br>}
其中weight -5表示脚本失败时,当前节点优先级自动减5;当低于备节点优先级,即触发切换
高可用进阶:双 VIP + 非抢占模式防脑裂
单 VIP 架构下备用机闲置,且易因网络分区引发脑裂(双 Master)。优化方向包括:
- 双 VIP 互为主备:两台节点各自作为某个 VIP 的 Master,实现负载分担;任一节点故障,另一节点接管两个 VIP
-
启用
nopreempt:备节点升主后不再因原主恢复而抢回 VIP,避免频繁漂移;仅当当前 Master 故障时才切换 -
单播替代组播:在云环境或 VLAN 限制场景,VRRP 组播可能被禁用;改用
unicast_src_ip和unicast_peer配置点对点心跳,提升可靠性 - 增加仲裁机制:引入第三方节点(如 Redis、Quorum Disk)作为投票源,当两节点心跳中断时,由仲裁方决定 VIP 归属,彻底规避脑裂


















