keepalived通过vrrp心跳与脚本健康检查协同实现网络异常容灾:设advert_int=1s、fall=3~5,结合ping网关+curl本地探活,启用nopreempt防脑裂,单播替代组播提升跨网可靠性。

Keepalived 在 Nginx 架构中不直接处理网络异常,而是通过 VRRP 协议感知底层连通性变化,并结合脚本主动干预,从而实现网络异常下的自动容灾。关键在于区分“网络层故障”和“应用层故障”,并配置对应响应机制。
识别真实网络异常而非误判
Keepalived 默认依赖 VRRP 心跳包通信,若主节点因网络中断(如交换机断开、网线脱落、防火墙拦截组播)无法发送心跳,备节点会在 advert_int × fall 时间后触发切换。但需避免因瞬时抖动导致的误切:
- 建议将 advert_int 设为 1 秒,fall 设为 3~5,即 3~5 秒无心跳才判定故障,兼顾灵敏与稳定
- 确保主备节点间二层互通,VRRP 使用 224.0.0.18 组播地址,需交换机允许 IGMP 或禁用组播抑制
- 关闭或放行防火墙对 VRRP 协议(IP 协议号 112)及组播流量的拦截,CentOS 可执行:
firewall-cmd --permanent --add-rich-rule='rule protocol value="112" accept'
让 Keepalived 主动探测网络可达性
仅靠 VRRP 心跳不够——若 Nginx 进程正常但上游网络不通(如默认网关失联、DNS 不可达),服务实际已不可用。此时需扩展健康检查:
- 在 vrrp_script 中增加 ping 检测:例如检查网关或核心后端 IP 是否可达
- 示例脚本片段:
ping -c 2 -W 1 192.168.1.1 && curl -s --connect-timeout 2 http://127.0.0.1/health | grep "ok" - 该脚本返回非零值时,Keepalived 会按 weight 规则降低优先级,触发 VIP 漂移
防止脑裂与服务双活
网络分区(如主备间链路中断但各自仍能对外服务)会导致 VIP 同时出现在两台机器上,引发客户端访问混乱。必须启用防护机制:
- 主备节点配置相同 virtual_router_id 和 auth_pass,确保身份可信
- 主节点配置 nopreempt(非抢占模式),避免网络恢复后 VIP 频繁来回漂移
- 加入单播替代组播(尤其跨子网场景):在 vrrp_instance 块中添加
unicast_src_ip 主IP; unicast_peer { 备IP; }
验证网络异常下的切换效果
测试不能只停 Nginx 进程,要模拟真实网络故障:
- 在主节点执行:
ip link set ens160 down(关闭网卡),观察备节点是否 3–5 秒内接管 VIP - 用
ip a show查看 VIP 是否迁移;用tcpdump -i any host 224.0.0.18确认 VRRP 包收发状态 - 从客户端持续 curl VIP,确认请求无超时或连接拒绝,切换过程丢包应 ≤ 1–2 个











