脑裂诡局:双节点同时霸占虚拟 IP 的机房凶案

1 Keepalived 基础概述

1.1 简介

Keepalived是C语言开发的高可用软件,最初为LVS负载均衡配套开发,核心依托VRRP虚拟路由冗余协议实现故障自动转移,同时支持3/4/7层服务健康检测,解决网关、负载均衡器单点故障问题。

1.2 HA集群适用场景

适合无自带故障转移能力的服务(Nginx、LVS、RabbitMQ等);

不适合自带主从/多节点冗余的服务(DNS、LDAP);

局限:无法解决程序代码BUG、全网链路故障问题。

2 VRRP 核心协议原理

2.1 解决的痛点

单网关一旦宕机,内网所有主机断网;VRRP将多台物理路由器虚拟成一台逻辑路由器,共用同一个VIP作为网关,实现故障自动切换。

2.2 VRRP基础术语

  1. VRRP组 :同一局域网内一组协同工作的节点,由唯一VRID标识(1~255),同组VRID、认证密码必须完全一致;
  2. 虚拟IP(VIP):对外统一访问地址,集群共用;
  3. 虚拟MAC :固定格式0000-5e-00-01-XX,XX为VRID;
  4. Master主节点:持有VIP,定期发送心跳报文,响应VIP的ARP请求;
  5. Backup备节点:监听心跳,主故障后自动升级接管VIP;
  6. 优先级priority:0~255,数值越大优先;接口IP等于VIP时自动为255,永久主。

2.3 VRRP报文规则

  • 报文名称:Advertisement通告报文;
  • 传输方式:组播,目标地址224.0.0.18,协议号112;
  • 默认心跳间隔advert_int=1s
  • 认证模式:无认证、明文PASS、MD5加密。

2.4 核心定时器

  1. ADVER_INTERVAL:Master发心跳间隔,默认1秒;
  2. MASTER_DOWN定时器:备节点等待主失效超时时间
    计算公式:3*心跳间隔 + 偏移时间
    偏移时间 = (255 - 优先级)/256
    Master主动下线会发送优先级0报文,备机无需等待完整超时,快速切换。

2.5 主备选举逻辑

  1. 初始化所有节点先进入Backup;
  2. 优先级高更快成为Master,定期发心跳;
  3. 优先级相同,对比节点物理IP,IP更大者为主;
  4. 节点IP等于VIP,直接强制Master,不参与竞争。

2.6 主备切换两种场景

  1. Master正常停止:发送优先级0心跳,备机瞬间切换;
  2. Master故障断网:备机等待MASTER_DOWN超时后接管VIP。

3 VRRP脑裂(Split-Brain)

3.1 定义

主备节点心跳通信中断,但两台服务器均正常运行,双方都判定对方宕机,同时绑定VIP,造成流量混乱、数据冲突。

3.2 产生原因

  1. 防火墙拦截112号VRRP协议;
  2. 主备间网络/网卡故障,组播报文不通;
  3. 集群VRID、认证密码配置不一致;
  4. 服务器CPU/内存耗尽,无法发送心跳。

3.3 危害

客户端请求随机分发至两台主机,数据库、存储场景会出现双写冲突,服务直接崩溃。

3.4 脑裂规避方案

  1. 放行防火墙VRRP协议;
  2. 多网卡心跳检测(track_interface);
  3. 开启VRRP密码认证;
  4. 多线路冗余心跳;
  5. 故障隔离脚本(notify脚本,脑裂时关机/杀死对方服务);
  6. 业务层加分布式锁、主从读写分离兜底;
  7. 监控告警双主状态。

4 Keepalived三层健康检测机制

  1. 网络层(ICMP):ping探测主机存活;
  2. 传输层(TCP端口):检测80、22等端口是否监听;
  3. 应用层(自定义脚本):执行自定义脚本,检测Nginx、数据库等业务服务状态。

5 Keepalived配置详解

5.1 配置文件路径

/etc/keepalived/keepalived.conf,分为三大块:

  1. global_defs 全局配置
  2. vrrp_instance VRRP主备配置
  3. virtual_server LVS负载均衡联动配置

5.2 基础双主备标准配置

web1(MASTER,优先级110)
ini 复制代码
global_defs {
router_id web1
}
vrrp_instance nginx {
state MASTER
interface ens33
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass laogao@123
}
virtual_ipaddress {
10.1.8.100/24
}
}
web2(BACKUP,优先级100)
ini 复制代码
global_defs {
router_id web2
}
vrrp_instance nginx {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass laogao@123
}
virtual_ipaddress {
10.1.8.100/24
}
}

5.3 非抢占模式(生产稳定推荐 nopreempt)

所有节点统一写state BACKUP,增加nopreempt

主节点故障恢复后,不会抢回VIP,避免频繁切换抖动。

5.4 多网卡心跳指定 mcast_src_ip

多网卡服务器,手动指定心跳报文出口IP,防止跨网卡收不到心跳,引发脑裂。

6 Keepalived 日志配置

6.1 修改系统参数文件

/etc/sysconfig/keepalived

ini 复制代码
KEEPALIVED_OPTIONS="-D -S 7"
  • -D:后台守护进程;
  • -d:调试日志(生产关闭);
  • -S 7:指定日志设备local7。

6.2 rsyslog分离日志

/etc/rsyslog.d/keepalived.conf

conf 复制代码
local7.*  /var/log/keepalived.log
& stop

重载服务生效:

bash 复制代码
systemctl restart rsyslog
systemctl restart keepalived
# 实时查看日志
tail -f /var/log/keepalived.log
# 系统日志替代方案(无需配置)
journalctl -u keepalived -f

7 实操验证流程

  1. 两台服务器安装Nginx,区分首页标识;
  2. 分别部署Keepalived主备配置;
  3. 正常状态:VIP绑定web1,访问返回web1页面;
  4. 停止web1 keepalived:VIP漂移至web2,访问切换页面;
  5. 重启web1 keepalived:默认抢占模式VIP切回,nopreempt模式保持web2持有。

8 高频故障汇总

  1. 备机看不到VIP:主节点正常运行,VRRP机制备机不持有;
  2. 双主机同时拥有VIP(脑裂):防火墙拦截VRRP、密码/VRID不一致、心跳网卡错误;
  3. 主恢复后频繁切换:未配置nopreempt抢占关闭;
  4. 日志文件不存在:syslog设备与rsyslog配置不匹配;
  5. VIP切换后访问异常:后端网关、路由未同步调整。

9 Keepalived 典型搭配架构

  1. Keepalived + LVS-DR:四层高可用负载均衡;
  2. Keepalived + Nginx:七层Web服务高可用;
  3. Keepalived + MySQL/Redis:数据库缓存主备故障转移。
相关推荐
闲云野鹤在人间1 小时前
项目实战:LNMP-电商平台-ECshop
linux·运维·nginx·apache·lvs
李小白661 小时前
1-Shell编程和网络服务介绍
运维·云计算
吹什么轩1 小时前
linux网络:UDP套接字的业务实现:字典
linux·运维·udp
迷途之人不知返1 小时前
gcc编译器,以及源文件的翻译
linux
砚凝霜2 小时前
软考网络工程师|第 9 章 网络诊断命令 + 故障工具 + 故障排查完整笔记
网络·笔记
啊啊啊啊啊!!!!2 小时前
【Linux】初始Linux操作系统
linux·运维·服务器
一目Leizi2 小时前
Wireshark SSH 远程抓包配置指南(以 UniFi Dream Router 为例)
智能路由器
数据知道2 小时前
XXE 漏洞深度实战:XML 外部实体攻击与 OOB 带外
xml·网络·安全·网络安全
2401_894915532 小时前
新手落地 Geo 优化:源码下载、依赖安装、数据库初始化完整步骤
运维·服务器·数据库·人工智能·缓存·开源