Keepalived
Keepalived 是一个开源高可用(HA)软件,底层基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 实现。它通过 VIP(虚拟 IP)漂移 来解决集群中的单点故障问题。
VRRP 工作原理
┌─ VRRP 虚拟路由器组 ─────────────┐
│ Master(主) │ ← 定时发送 VRRP 通告
│ 持有 VIP: 192.168.71.200 │
│ │
│ Backup(备1) │ ← 监听通告
│ Backup(备2) │
└──────────────────────────────────┘
- VRRP 将多台服务器组成一个虚拟路由器组
- Master 节点持有 VIP,定期发送 VRRP 协议通告(广播包)
- Backup 节点收到通告则认为 Master 存活
- Backup 收不到通告 → 竞选新 Master → VIP 漂移到新节点
- 所有机器必须在同一个 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,内部切换对用户透明