keepalived通过vrrp协议实现nginx高可用,监控nginx状态并控制vip漂移;需配置健康检查脚本、确保vrrp通信正常、避免脑裂,切换时需逐层验证vip绑定与日志。

在 Nginx 高可用架构中,Keepalived 通过 VRRP 协议实现 VIP(虚拟 IP)的自动漂移,从而完成主备切换。核心不是 Nginx 自身做主备,而是由 Keepalived 监控 Nginx 状态,并控制 VIP 绑定到哪台服务器上。
Keepalived 主备角色与 VIP 分配
两台服务器都部署 Nginx 和 Keepalived,其中一台设为 MASTER,另一台为 BACKUP。它们共享一个对外服务的 VIP(如 192.168.1.100),该 IP 只绑定在当前 MASTER 节点的网卡上。客户端始终访问 VIP,流量只打到实际持有 VIP 的那台机器。
- MASTER 节点正常时,VIP 在其 eth0:1 接口生效,Nginx 提供服务
- MASTER 上 Nginx 崩溃或 Keepalived 进程退出,VRRP 优先级重算,BACKUP 检测超时后抢占 VIP
- 原 MASTER 恢复后,若配置了 preempt_mode 且优先级更高,会重新抢回 VIP(可选)
关键配置:健康检查必须绑定 Nginx 状态
Keepalived 默认只检测自身进程存活,必须通过自定义脚本检查 Nginx 是否真正响应请求,否则会出现“Keepalived 运行但 Nginx 已挂”的脑裂问题。
- 写一个检测脚本(如 /etc/keepalived/check_nginx.sh),用 curl 访问本地 Nginx 的健康端点(如 curl -s http://127.0.0.1/health | grep "ok")
- 在 keepalived.conf 中定义 vrrp_script,调用该脚本,设置权重变化(如失败时 weight -20)
- vrrp_instance 中引用该 script,并确保 priority 差值大于脚本导致的 weight 变化,才能触发切换
避免脑裂:双机间通信与配置一致性
MASTER 和 BACKUP 必须能通过组播(默认 224.0.0.18)交换 VRRP 报文,否则双方都以为自己是 MASTER,导致 VIP 冲突。
- 确认防火墙放行 VRRP 协议(IP protocol 112)或对应组播地址和端口
- 两台机器的 vrrp_instance block 中,state、interface、virtual_router_id、priority 必须严格匹配(除 state 和 priority 外)
- virtual_router_id 必须相同(取值 1–255),且在同一二层网络中全局唯一
验证与常见问题定位
切换是否生效,不能只看 Keepalived 日志,要逐层确认:
- 用 ip addr show 查看 VIP 是否出现在预期网卡上
- 用 tcpdump -i any host 224.0.0.18 确认 VRRP 报文收发正常
- 手动 kill -9 nginx 主进程,观察 BACKUP 是否在 3 秒内(advert_int × failure_count)获得 VIP
- 检查 /var/log/messages 或 journalctl -u keepalived 查看是否有 “(xx) Entering MASTER STATE” 类日志











