返回首页

Keepalived + Nginx 高可用实战 — VRRP / VIP 漂移 / 主备切换

📅 创建于 2026-05-11 🔄 更新于 2026-05-11 📝 509 字

Keepalived + Nginx 高可用

Keepalived + Nginx 是实现中小规模业务高可用的经典方案。 基于 VRRP 协议实现 VIP 漂移,主节点宕机时备节点自动接管,切换时间 3-10 秒, 对上游客户端完全透明。是运维工程师入门高可用架构的第一课。

架构原理

VRRP 协议

VRRP(Virtual Router Redundancy Protocol)允许多台路由器共享一个虚拟 IP(VIP):

  • 主节点(Master)持有 VIP,定期发送 VRRP 广播(默认 1 秒)
  • 备节点(Backup)监听广播,主节点失联(3 次未收到广播)时自动接管 VIP
  • 切换对客户端透明,IP/MAC 映射通过 ARP 更新

核心组件

客户端 → VIP
             → Keepalived(VRRP 心跳)→ Nginx → Backend Servers
  • Keepalived: VRRP 实现 + 健康检查 + 状态通知
  • Nginx: 反向代理 / 静态资源服务
  • VIP: 浮动 IP,始终绑定到当前主节点
  • 健康检查脚本: vrrp_script 调用外部脚本,检测 Nginx 进程和 HTTP 响应

适用场景

  • 静态资源服务高可用
  • Nginx 反向代理入口高可用
  • 小型业务主备方案

不适用场景: 多活架构、毫秒级切换需求 → 需用 LVS DR 模式或硬件负载均衡器。

Keepalived 配置要点

主备核心参数

参数 主节点 备节点 说明
state MASTER BACKUP 初始状态,最终由 priority 决定
priority 100 80 差值建议 20-50,需考虑 weight 影响
virtual_router_id 51 51 同集群内一致,同一网段不同集群不可重复
advert_int 1 1 VRRP 广播间隔,单位秒

关键配置项

# 网卡名确认(不同发行版差异大)
ip a
ls /sys/class/net/

# virtual_router_id 范围 0-255,同一网段不可重复
# weight 为负值时:脚本失败 → 优先级降低 → 备节点接管
# weight -10 表示脚本失败时 priority -= 10

非抢占模式(nopreempt)

默认主节点恢复后抢回 VIP。若希望减少切换次数:

vrrp_instance VI_1 {
    state BACKUP
    priority 100
    nopreempt
}

Nginx 健康检查策略

健康检查有多个层次,根据可靠性要求选择:

层次 检查方法 发现的问题 响应速度
1 ps -ef | grep nginx Nginx 进程崩溃 快(2s 间隔)
2 curl http://127.0.0.1/ Nginx 无法响应(超载/死锁) 中等(2-3s)
3 curl http://upstream/health 后端服务不可达 慢(取决于 upstream)

生产建议: 层次 1 + 2 必须启用,层次 3 根据业务场景选择。 如果后端全挂时不想触发主备切换(换个节点也一样),层次 3 可以改为只记日志不退出。

VIP 漂移全流程

正常状态:
  Master: VIP + Nginx 运行
  Backup: 无 VIP + Nginx 待命

Nginx 崩溃:
  Master: check_nginx 脚本返回非 0 → priority -= weight → priority < Backup
  Backup: 检测到 priority 更高 → 广播发送 → 绑定 VIP

主机宕机:
  Master: 停止 VRRP 广播
  Backup: 3×advert_int 未收到广播 → 接管 VIP

恢复(默认):Master 恢复后 priority 回归 → 抢回 VIP
恢复(nopreempt):Master 恢复后不抢回,等待 Backup 故障

配置一致性保障

两台 Nginx 配置必须同步,否则备节点接管后无法正确服务:

# rsync 同步
rsync -avz /etc/nginx/ root@backup:/etc/nginx/

# ansible playbook
ansible nginx-servers -m copy -a "src=/etc/nginx/ dest=/etc/nginx/"

# 证书同步(SSL 证书双向同步)
rsync -avz /etc/nginx/ssl/ root@backup:/etc/nginx/ssl/

与 Nginx 配置的关联

Keepalived + Nginx 的 HA 方案中,Nginx 自身配置的可靠性同样重要。 参见 nginx-config-pitfalls 了解常见的 Nginx 配置错误(location 匹配、proxy_pass 路径处理、upstream keepalive 等)。

风险与注意事项

  1. 脑裂(Split-Brain): 网络分区时两台可能各自持有 VIP。 解决:使用单播(unicast_src_ip + unicast_peer)替代广播,并配置防火墙放行 VRRP(协议号 112)。

  2. 切换中断: 默认 3-10s 中断。需要更高可用性时,客户端应有重试机制(HTTP 请求重试、Nginx upstream 失败重试)。

  3. 配置一致性: 两台 Nginx 配置必须同步。建议使用 rsync、ansible 或 git+部署脚本。
  4. VIP 同网段约束: Keepalived 依赖 ARP 广播,无法跨网段。跨网段需 LVS DR 模式或隧道模式。
  5. 后端单点瓶颈: 本方案只解决 Nginx 层的 HA,后端服务若为单点则仍有单点故障风险。

部署后验证清单

  • [ ] VIP 绑定在主节点(ip addr show
  • [ ] 备节点无 VIP
  • [ ] 通过 VIP 访问服务正常(curl http://VIP/
  • [ ] 杀掉 Nginx → VIP 漂移到备节点 → 服务恢复
  • [ ] 主节点关机 → 备节点接管
  • [ ] 恢复后 VIP 行为符合预期(nopreempt 或自动抢回)
  • [ ] 健康检查脚本返回码正确(手动执行 echo $?
  • [ ] VRRP 通信正常(tcpdump -i eth0 vrrp -n
  • [ ] SSL 证书在两台同步

关联页面

页面关联点
nginx-config-pitfallsNginx 典型配置错误复盘(高可用架构中的 upstream 与 proxy_pass 误配)
keepalived-ha-hidden-pitfallsKeepalived+Nginx 高可用架构 3 个隐藏坑位与生产级防护方案(脑裂/健康检查僵尸进程
nginx-pre-launch-checklistNginx 上线前检查清单(Keepalived + Nginx 高可用上线前必检项)