VRRP、VIP 和 Keepalived 健康检查机制:构建高可用系统的关键

*Keepalived 是一个用于实现高可用性(High Availability, HA)的软件,主要用于通过虚拟路由冗余协议(VRRP)来管理虚拟IP地址(VIP),从而确保在主服务器故障时,备用服务器能够迅速接管服务,减少系统停机时间:

一、VRRP(虚拟路由器冗余协议)

1. 协议核心原理
  • 定义:VRRP(RFC 5798)通过在一组路由器中选举主节点(MASTER)和备份节点(BACKUP),实现 IP 地址和路由的冗余。

    • 主节点:承担数据包转发,定期发送 VRRP 通告(Advertisement)。

    • 备份节点:监听主节点状态,主节点故障时接管 VIP。

  • 状态机

    • Initialize:启动初始状态,等待配置完成。

    • Master:主节点周期发送通告(默认间隔 1 秒),优先级最高(范围 0-255,默认 100)。

    • Backup:备份节点监听通告,若超时(3 倍通告间隔)未收到,则发起选举。

  • 选举规则

  1. 优先级高者优先:手动配置或通过接口优先级(如链路带宽)自动计算。

  2. IP 地址所有者优先:若节点 IP 与 VIP 一致,直接成为主节点。

  3. 接口 MAC 地址辅助:优先级相同时,MAC 地址更大的节点胜出。

2. 典型应用场景
  • 单播网络冗余:在企业局域网中,多台路由器组成 VRRP 组,VIP 作为默认网关。当主路由器故障时,备份路由器接管流量,避免终端设备重新配置网关。

  • 云服务器高可用:云环境中,多台 EC2 实例通过 VRRP 共享公网 VIP,实现无状态服务的故障转移(如 Web 服务器集群)。

  • 数据中心双活:跨数据中心的 VRRP 组通过专线互联,VIP 在主数据中心故障时自动漂移到灾备中心,实现业务连续性。

3. 配置示例(Linux ipvsadm)
# 主节点配置
sudo ip link set dev eth0 up
sudo ip addr add 192.168.1.254/24 dev eth0  # VIP
sudo vrrp -i eth0 -c MASTER -u 1 -p 101 -a 192.168.1.254

# 备份节点配置
sudo vrrp -i eth0 -c BACKUP -u 1 -p 100 -a 192.168.1.254

二、VIP(虚拟 IP 地址)

1. VIP 的技术特性
  • 无状态性:VIP 不与特定物理接口绑定,通过 ARP 通告动态更新 MAC 地址,实现 “浮动” 效果。
# 主节点ARP响应(VIP的MAC为eth0的MAC)
ARP table: 192.168.1.254 -> 00:0c:29:ab:cd:01

# 故障转移后,备份节点ARP响应
ARP table: 192.168.1.254 -> 00:0c:29:ef:gh:02
  • 多实例支持:同一物理接口可绑定多个 VIP,属于不同 VRRP 组,实现细粒度冗余(如区分内外网 VIP)。

  • 负载分担模式

    • 非抢占模式:主节点恢复后不自动夺回 VIP,适用于读写分离场景。

    • 抢占模式:主节点恢复后立即重新成为 MASTER,确保高优先级节点优先服务。

2. VIP 与高可用集群结合
  • 数据库集群:MySQL 主从集群通过 VIP 提供统一写入入口,Keepalived 监控主库状态,故障时 VIP 漂移至从库并提升为新主库。

  • 负载均衡器集群:Nginx 负载均衡节点组成 VRRP 组,VIP 作为客户端访问入口,避免单点故障。

  • 容器化场景:Kubernetes 通过金属 LB(MetalLB)插件实现 VIP 分配,在裸机集群中模拟云原生负载均衡。

3. 故障转移延迟优化
  • 缩短通告间隔
vrrp -i eth0 -m 100ms  # 通告间隔设为100ms(默认1000ms)
  • 抢占延迟设置
vrrp -i eth0 -w 500ms  # 主节点恢复后等待500ms再抢占VIP

三、Keepalived 健康检查机制

1. 健康检查类型
  • 基础检查:ICMP Ping通过定期 Ping 目标节点 IP,判断链路连通性。
track_interface {
  eth0
}
  • TCP 连接检测检测指定端口是否可达(如 Web 服务的 80 端口、数据库的 3306 端口)。
virtual_server 192.168.1.254 80 {
  delay_loop 6
  lb_algo rr
  lb_kind NAT
  persistence_timeout 50
  protocol TCP

  real_server 192.168.1.101 80 {
    TCP_CHECK {
      connect_port 80
      connect_timeout 3
      retry 3
      delay_before_retry 3
    }
  }
}
  • 脚本自定义检测执行 Shell 脚本动态判断服务状态(如检测数据库主从同步延迟、应用进程存活)。
# 检测MySQL主库状态的脚本
# 返回0表示健康,非0表示故障
#!/bin/bash
mysql -uroot -pPassword -e "SHOW SLAVE STATUS;" | grep "Seconds_Behind_Master" | awk '{print $2}' | grep -q "0"
2. 多级健康检查策略
  • 分层检测
  1. 第一层:VRRP 层检测路由器存活(ICMP)。

  2. 第二层:Keepalived 层检测服务端口(TCP)。

  3. 第三层:应用层脚本检测业务逻辑(如订单系统写入可用性)。

  • 依赖关系配置
track_script {
  check_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2
    weight -20  # 检测失败时,主节点优先级降低20(可能触发故障转移)
  }
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  track_script {
    check_mysql
  }
  virtual_ipaddress {
    192.168.1.254/24 dev eth0
  }
}
3. 故障转移与恢复流程
  1. 检测到服务故障
  • Keepalived 调用健康检查脚本,返回非 0 状态码。

  • 主节点优先级降低,触发 VRRP 选举。

  1. 备份节点接管
  • 备份节点检测到主节点通告超时,升级为 MASTER 并绑定 VIP。

  • 流量切换至备份节点,服务继续运行。

  1. 主节点恢复
  • 健康检查脚本返回 0,主节点优先级恢复。

  • 若配置抢占模式,主节点重新成为 MASTER,VIP 漂移回原节点。

四、最佳实践与故障排查

1. 高可靠配置要点
  • 多 VRRP 组隔离:将管理平面(VRRP)与数据平面(业务流量)分离,避免广播风暴影响业务。

  • 链路聚合(LACP):结合链路聚合技术(如 Eth-Trunk),避免单一物理链路故障导致 VRRP 组失效。

  • 硬件 BFD 加速:与 BFD(双向转发检测)协议结合,将故障检测时间缩短至毫秒级:

vrrp -i eth0 -b 192.168.1.1 -d 30ms  # BFD邻居IP和检测间隔
2. 常见故障排查
  • VIP 无法漂移
  1. 检查 VRRP 组配置一致性(VRID、优先级、认证密码)。

  2. 确认防火墙允许 VRRP 通告(UDP 112 端口)。

  3. 查看日志:/var/log/keepalived.log 中是否有选举失败记录。

  • 健康检查误判
  1. 调整检测参数(如connect_timeoutretry次数)。

  2. 增加脚本健壮性,避免瞬时网络波动导致误判。

  • ARP 缓存不一致:在客户端执行arp -d VIP强制刷新 ARP 表,或配置gratuitous_arp主动通告 VIP 的 MAC 地址。

五、总结

VRRP、VIP 和健康检查机制是构建高可用系统的基石:

  • VRRP 提供网络层冗余,确保 IP 地址和路由的连续性;

  • VIP 作为无状态服务入口,屏蔽后端节点的物理差异;

  • 健康检查 实现从网络层到应用层的多级监控,保障故障转移的准确性。

通过合理配置和优化,可将服务中断时间控制在秒级以内,满足大多数企业级应用的高可用性需求。在云原生时代,这些技术与容器编排、服务网格等结合,正持续演化出更复杂的弹性架构。

你可能感兴趣的:(map-keepalived,keepalived)