Keepalived原生不支持跨网段节点感知,需通过unicast单播、HTTP/TCP探活脚本或Consul/ETCD等外部协调服务实现;推荐优先使用unicast模式替代组播。

Nginx 本身不感知网络拓扑,也不参与节点发现;Keepalived 的 VRRP 协议默认只在同一二层广播域(即同一子网)内工作,因为它依赖组播地址 224.0.0.18 发送心跳包——而标准 VRRP 组播无法跨网段路由。所以,“多网段节点感知”不是 Keepalived 原生支持的能力,必须通过架构调整或协议替代来实现。
真正可行的方案不是“让 Keepalived 跨网段发心跳”,而是绕过 VRRP 组播限制,改用可控的、可路由的健康探测机制,并配合 VIP 管理逻辑。以下是三种实用路径:
用 unicast 单播模式替代组播(推荐)
Keepalived 自 1.3.0+ 支持 unicast_src_ip 和 unicast_peer,允许在不同网段的节点间建立点对点心跳通道,无需依赖二层组播:
-
主节点配置片段(如 192.168.10.10):
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 unicast_src_ip 192.168.10.10 unicast_peer { 172.16.20.20 # 备节点在另一网段的IP } virtual_ipaddress { 192.168.10.100/24 dev eth0 label eth0:1 } } -
备节点配置(如 172.16.20.20)对应写:
unicast_src_ip 172.16.20.20 unicast_peer { 192.168.10.10 }
✅ 优势:
- 不依赖交换机支持组播、不需开启 IGMP 或 PIM
- 可穿透三层路由(只要两个 IP 能
ping通、TCP/UDP 端口互通) - 心跳走单播 UDP,防火墙规则更明确(放行目标端口即可)
⚠️ 注意:
- 两节点必须能双向
telnet <peer-ip> 112</peer-ip>(VRRP 协议号 112 对应的 raw socket) -
interface仍需指定本地出向网卡(用于绑定 VIP),但不再要求与 peer 同网段
用 HTTP/TCP 探活脚本 + VIP 手动接管(灵活兜底)
当网络策略严格禁止非业务端口通信(如禁用协议号 112),或跨云厂商/混合云环境无法打通底层网络时,可完全放弃 VRRP,转为“应用级心跳 + 脚本驱动 VIP”。
-
在
/etc/keepalived/check_vip.sh中写:#!/bin/bash # 检查对端 Nginx 是否可访问(跨网段 HTTP 探测) if curl -s --connect-timeout 2 http://172.16.20.20/healthz | grep -q "ok"; then exit 0 else exit 1 fi
-
Keepalived 配置中禁用 VRRP 实例,仅用
vrrp_script触发 VIP 绑定/解绑:vrrp_script chk_remote { script "/etc/keepalived/check_vip.sh" interval 3 fall 2 rise 2 }
vrrp_instance FAILOVER { state BACKUP interface eth0 virtual_router_id 52 priority 90 nopreempt
track_script {
chk_remote
}
# VIP 不在此处声明,由脚本内部用 ip addr add/remove 控制}
- 脚本内根据探测结果执行: ```bash # 探测失败 → 当前节点主动绑定 VIP ip addr add 192.168.10.100/24 dev eth0 label eth0:1 2>/dev/null # 探测成功 → 解绑 VIP(避免双主) ip addr del 192.168.10.100/24 dev eth0 label eth0:1 2>/dev/null
✅ 优势:
- 完全基于业务可达性判断,更贴近真实服务状态
- 不受限于网络层协议,适配公网、专线、VPC 对等连接等复杂场景
⚠️ 注意:
- 需自行处理脑裂(例如加分布式锁或仲裁节点)
- VIP 绑定/解绑需 root 权限,脚本要设
chmod +x并在 keepalived 运行用户下可执行
用外部协调服务(Consul / ETCD)做状态同步(适合集群化演进)
若已有服务发现基础设施,可将 Keepalived “降级”为纯 VIP 管理器,节点存活状态由 Consul Agent 上报、由 Consul Template 或自定义 Watcher 触发 VIP 切换:
- 每个节点运行 Consul Agent,注册本地 Nginx 健康检查
- 编写轻量 Watcher(Python/Shell),监听
/v1/health/service/nginx?passing - 当仅剩一个节点 healthy,就调用
ip addr add ...把 VIP 绑到它身上
✅ 优势:
- 天然支持任意数量、任意网络位置的节点
- 可集成 ACL、TLS、多数据中心同步等企业级能力
⚠️ 注意:
- 引入新组件,运维复杂度上升
- 切换延迟略高于原生 VRRP(通常 3–5 秒),但可控且可审计
不复杂但容易忽略:跨网段高可用的关键不在“怎么传心跳”,而在“谁来决策、依据什么决策、如何避免双主”。选对模式比调参数更重要。


















