Keepalived双机热备核心依赖VRRP VIP漂移、健康检查、网络对齐三重机制协同:virtual_router_id、interface、子网需严格一致,防火墙放行VRRP协议;健康检查须真实探测服务状态;主备state、priority、authentication须匹配;验证需模拟故障并观测全链路响应。

Keepalived 实现双机热备,服务连续性的核心不是“装完就自动可用”,而是靠三重机制协同生效:VRRP 协议驱动的 VIP 漂移、精准绑定的健康检查、以及网络层严丝合缝的对齐。任一环节出错,VIP 就卡住不动,用户请求直接 502 或超时。
VIP 必须能真实漂移,不能只靠配置“看起来对”
VIP 漂移是服务连续的前提,但前提是它真能动起来:
- virtual_router_id 必须完全一致(1–255 范围内),且同一局域网中不可重复;哪怕只配一个实例,ID 不同也会导致两台都抢 VIP 或全退为 BACKUP
- interface 值必须和 ip -br a 输出的网卡名完全匹配(如 ens33、enp0s3、eth0),CentOS 7/8/9 默认命名差异大,写错就无法绑定 VIP
- VIP 和物理 IP 必须在同一子网,且不能与任何物理 IP、网关、广播地址冲突;例如物理 IP 是 192.168.100.11/24,VIP 就只能设为 192.168.100.x/32
-
防火墙必须放行 VRRP 协议(协议号 112,非端口),命令为:
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept'
健康检查必须感知真实服务状态,不能只看网络通不通
默认 Keepalived 只检测本机网络层存活,Nginx 进程挂了、配置崩了、worker 全卡死,VIP 仍留在主节点——这才是 502 的真正来源:
- 写一个简单脚本(如
/etc/keepalived/check_nginx.sh),用killall -0 nginx或curl -s http://127.0.0.1/health | grep "ok"判断服务真实可用性 - 脚本权限设为
755,属主root,末尾明确用exit 0表示健康、exit 1表示异常(其他非 0 返回值会被忽略) - 在 keepalived.conf 中通过
vrrp_script引入,并在vrrp_instance里用track_script绑定;不绑定等于没写 - 避免用
systemctl is-active nginx,keepalived 子进程通常没加载 systemd 环境变量,容易误判
主备角色与切换逻辑必须无歧义
state、priority、virtual_router_id 是识别主备的铁三角,三者必须成对校验:
-
state MASTER 只能出现在主节点,备节点必须写
state BACKUP;写反了不报错,但 VIP 死活不漂移 - priority 主节点建议设 100,备节点设 90 或更低,差值 ≥10 更稳妥,避免因短暂网络抖动触发误切换
- authentication 密码必须一致,类型选 PASS 即可,密码明文传输但仅限内网,安全风险可控
- 主备节点的
router_id应不同(如 NGINX_MASTER / NGINX_BACKUP),虽不影响漂移,但便于日志排查
验证连续性不能只看“VIP 是否在备机”
真正验证服务连续性,要模拟真实故障并观察全链路响应:
- 手动停掉主节点 Nginx:
systemctl stop nginx,等 2–3 秒后执行ip a确认 VIP 已漂到备机 - 立刻从客户端 curl VIP 地址(如
curl http://192.168.100.107),确认返回正常页面且内容与备机一致 - 再 kill 主节点 keepalived 进程:
pkill keepalived,观察备机是否立即升为 MASTER 并持续提供服务 - 恢复主节点后,观察其是否自动降为 BACKUP(priority 较低),VIP 是否仍留在备机——这是“非抢占”设计的关键体现

















