Keepalived

Keepalived 是一个开源高可用(HA)软件,底层基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 实现。它通过 VIP(虚拟 IP)漂移 来解决集群中的单点故障问题。

VRRP 工作原理

┌─ VRRP 虚拟路由器组 ─────────────┐
│  Master(主)                    │  ← 定时发送 VRRP 通告
│    持有 VIP: 192.168.71.200      │
│                                  │
│  Backup(备1)                   │  ← 监听通告
│  Backup(备2)                   │
└──────────────────────────────────┘
  1. VRRP 将多台服务器组成一个虚拟路由器组
  2. Master 节点持有 VIP,定期发送 VRRP 协议通告(广播包)
  3. Backup 节点收到通告则认为 Master 存活
  4. Backup 收不到通告 → 竞选新 Master → VIP 漂移到新节点
  5. 所有机器必须在同一个 LAN 内(VRRP 依赖多播/广播)

核心配置

配置文件:/etc/keepalived/keepalived.conf

三大组成部分

global_defs { ... }           # 全局配置
 
vrrp_instance VI_1 {          # VRRP 实例
    state MASTER              # 初始角色(MASTER / BACKUP)
    interface eth0            # 绑定网卡
    virtual_router_id 51      # 虚拟路由 ID(同一组内一致)
    priority 100              # 优先级(越大越优先)
    advert_int 1              # 通告间隔(秒)
    
    authentication { ... }    # 认证
    virtual_ipaddress {       # VIP 列表
        192.168.71.200
    }
    track_script { ... }      # 健康检查脚本
}

抢占式 vs 非抢占式

模式机制推荐
抢占式(默认)高优先级恢复后抢回 VIP❌ 频繁切换不稳定
非抢占式nopreempt当前 Master 不退位生产推荐

三种典型使用场景

场景组合解决的问题
LVS 高可用LVS + Keepalived四层负载均衡器单点故障
Nginx 高可用Nginx + Keepalived七层负载均衡器单点故障
Haproxy 高可用Haproxy + Keepalived四/七层负载均衡器单点故障
NFS 高可用NFS + Keepalived + Rsync文件服务器单点故障

健康检查

通过 vrrp_script 定义检测逻辑:

vrrp_script chk_nginx {
    script "/usr/bin/check_nginx.sh"
    interval 2        # 每 2 秒检测一次
    fall 2            # 连续 2 次失败触发降级
    rise 2            # 连续 2 次成功恢复
}

检测失败 → 降低本机优先级 → 触发 VIP 漂移到 Backup

脑裂问题

原因

心跳线断开,两台机器都认为自己 Master,同时持有 VIP。

影响

  • 同一个 VIP 在两台机器上同时生效
  • 后端请求混乱,网络冲突

处理方案

方案说明
冗余心跳线多网卡/多路径保障心跳通信
第三方仲裁ping 网关或对端,检测失败则释放 VIP
防火墙规则检测到脑裂时自动封锁 VIP

VIP 说明

  • VIP 一定是私网 IP,配置在内部私有设备上
  • 公网用户访问 → DNAT 将公网 IP 映射到内网 VIP
  • 集群外部看到的始终是 VIP,内部切换对用户透明

相关页面