在构建高可用(HA)系统时,Keepalived 是一种常见的选择。然而,配置不当可能导致主备服务器都持有 VIP(Virtual IP),进而引发脑裂现象,影响业务的稳定运行。本文将深入剖析 Keepalived 脑裂的原理,并提供切实可行的解决方案。
问题场景重现
假设我们有两台服务器 ServerA 和 ServerB,都运行 Keepalived,并且配置了相同的 VIP。正常情况下,只有主服务器(通常是优先级较高的那台)持有 VIP 并对外提供服务。但如果两台服务器都认为自己是主服务器,它们就会同时激活 VIP,导致客户端请求被随机分配到两台服务器,数据不一致等问题。
脑裂原因深度剖析
Keepalived 主要依赖 VRRP(Virtual Router Redundancy Protocol)协议来实现主备切换。脑裂的根本原因在于 VRRP 协议在某些情况下无法正确判断对方服务器的状态,导致两台服务器都认为对方宕机或不可达。常见的原因包括:
- 网络隔离:服务器之间的网络出现故障,导致 VRRP 报文无法正常传递,彼此无法检测到对方的状态。这可能是物理线路故障、交换机配置错误、防火墙策略拦截等原因。
- Keepalived 配置错误:Keepalived 的配置文件中,
vrrp_instance部分的配置不一致,例如interface、priority、virtual_router_id等参数不匹配,导致 VRRP 报文无法正确处理。 - 资源争用:服务器资源不足,例如 CPU 占用率过高、内存不足等,导致 Keepalived 进程无法及时发送或接收 VRRP 报文。
- Keepalived 自身 Bug:虽然概率较低,但 Keepalived 自身也可能存在 Bug,导致 VRRP 协议实现出现问题。
代码/配置解决方案
以下是一些解决 Keepalived 主备服务器都持有 VIP 的实用方法:
加强网络可靠性:

- 使用冗余网络链路,例如双网卡绑定(bonding)或多链路聚合。
- 确保服务器之间的网络连通性稳定,可以使用
ping、traceroute等工具进行测试。 - 检查防火墙策略,确保 VRRP 报文(通常使用 UDP 协议,端口号为 112)能够正常通过。
仔细检查 Keepalived 配置文件:
以下是一个示例的 Keepalived 配置文件 (
/etc/keepalived/keepalived.conf):
! Configuration File for keepalived global_defs { router_id LVS_DEVEL # 唯一标识,两台服务器必须不同 } vrrp_instance VI_1 { state MASTER # 初始状态,MASTER 或 BACKUP interface eth0 # 监听的网络接口 virtual_router_id 51 # VRRP 实例 ID,两台服务器必须相同 priority 100 # 优先级,MASTER 必须高于 BACKUP advert_int 1 # VRRP 报文发送间隔(秒) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 # 虚拟 IP 地址 } track_script { check_nginx # 监控脚本 } } vrrp_script check_nginx { script "killall -0 nginx" interval 2 # 脚本执行间隔(秒) weight 2 # 权重,脚本返回值为 0 时,优先级增加 2 }- 确保
virtual_router_id在两台服务器上配置相同。 - 确保
priority在主服务器上高于备服务器。 router_id在两台服务器上必须不同,用于区分服务器。- 检查
interface是否正确,监听的网卡是否存在且正常工作。 advert_int设置 VRRP 报文发送间隔,过短可能会增加网络负担,过长可能导致切换延迟。通常设置为 1 秒。
- 确保
配置监控脚本:
Keepalived 提供了
track_script功能,可以监控关键服务的状态,并在服务异常时降低优先级,触发主备切换。例如,可以监控 Nginx 的状态:
#!/bin/bash # 检查 Nginx 进程是否存在 if ps -C nginx --no-header | grep -q nginx;
then exit 0 # Nginx 运行正常 else exit 1 # Nginx 停止运行 fi ```
将脚本保存为 `/etc/keepalived/check_nginx.sh`,并确保脚本具有执行权限 (`chmod +x /etc/keepalived/check_nginx.sh`)。
使用网络隔离仲裁:
如果条件允许,可以使用第三方仲裁机制,例如 Pacemaker 或 Corosync。这些工具可以提供更强大的集群管理和故障检测能力,避免脑裂现象的发生。
实战避坑经验总结
- 测试是关键:在生产环境部署 Keepalived 之前,务必进行充分的测试,模拟各种故障场景,例如网络中断、服务器宕机、服务异常等,验证主备切换是否正常。
- 监控是保障:建立完善的监控体系,监控 Keepalived 的运行状态、VRRP 报文的收发情况、VIP 的持有者等关键指标,及时发现并解决问题。
- 定期巡检:定期检查 Keepalived 的配置,确保配置的正确性和一致性。检查服务器的网络连接,确保网络稳定可靠。
- 日志分析:Keepalived 的日志文件包含了大量有用的信息,例如 VRRP 报文的收发情况、状态切换的记录、错误信息等。定期分析日志文件,可以帮助发现潜在的问题。
通过以上方法,可以有效地解决 Keepalived 的主备服务器都持有 VIP 导致的脑裂现象,保障高可用系统的稳定运行。
冠军资讯
程序员老猫