Nginx+Keepalived双机热备通过VIP漂移实现秒级切换,核心是Keepalived基于VRRP协议管理VIP并配合健康检查脚本(如检测nginx进程或/health端点),主备节点priority差≥1、advert_int设为1秒、启用nopreempt防抖动,确保故障3–5秒内自动切流且避免脑裂。

Keepalived 主备模式:最稳妥的双机热备基础
主节点优先级设为 100,备节点设为 99;两者配置相同 virtual_router_id 和认证密码,但 state 分别为 MASTER / BACKUP。
关键在于健康检查脚本:
• 每 2 秒执行一次 /etc/keepalived/nginx_check.sh
• 脚本检测 ps -C nginx --no-header 或访问本地 curl -s http://127.0.0.1:80/health
• 若失败,触发 weight -20,使主节点优先级降至 80,低于备节点,触发 VIP 切换
避免脑裂:必须加的防护机制
两台机器同时持有 VIP 会导致服务混乱。需同步启用:
• 单播通信替代默认多播(尤其跨网段或有安全组限制时)
• 降低 advert_int 到 1 秒 加快故障识别
• 设置 nopreempt(仅主节点) 防止主恢复后立即抢回 VIP,造成二次抖动
• 在脚本中加入 ip addr show | grep "inet.*vip" 双重校验,避免误判
切换验证与可观测性
光配好不够,要能确认它真能切:
• 手动 kill 主节点 nginx 进程,观察 ip a 输出中 VIP 是否 3–5 秒内出现在备机上
• 查看 keepalived 日志:tail -f /var/log/messages | grep Keepalived,确认状态从 “MASTER” → “BACKUP” → “FAULT” → 新 MASTER
• 在客户端持续 curl VIP,记录最长中断时间(通常 • 建议配合 Prometheus + node_exporter 监控 keepalived 进程、VIP 绑定状态、nginx worker 数量
进阶:双主互备(双活)不是双机热备
如果想让两台 Nginx 同时对外服务,就不是传统“热备”,而是“双主负载”。这时:
• 配置两个独立 vrrp_instance,各持一个 VIP(如 192.168.100.133 和 .134)
• 主机 A 持 VIP1(state MASTER),主机 B 持 VIP2(state MASTER)
• 每个 VIP 都有 backup 实例兜底,实现“一主一备”叠加成“双主双备”
• 注意 DNS 或客户端需支持解析多个 A 记录,否则无法真正分摊流量


















