Keepalived 高可用全解析
1. HA 集群的适用性
能解决的问题
- 为未自带故障转移(Failover)或负载均衡(LB)的服务提供高可用,如 RabbitMQ、Galera、Nginx 等。
- 自动剔除故障节点,无需人工干预。
不能解决的问题
- 应用自身 bug 导致的 crash(集群内所有节点都存在相同 bug)。
- 端到端的网络故障(集群正常但网络不可达,客户端仍无法访问)。
- 对于 DNS、LDAP 等自带多节点冗余的服务,放入 HA 集群收益不大。
2. Keepalived 概述
- 定位:用 C 语言编写的路由软件,为 Linux 提供负载均衡(LB)和高可用(HA)。
- 最初:专为 LVS 设计,检测后端服务节点状态(基于 TCP/IP 第 3/4/7 层),故障时自动剔除。
- 后来:引入 VRRP 协议,实现 HA 集群功能(主备切换、VIP 漂移)。
3. VRRP 核心原理
3.1 背景
- 单网关(默认网关)故障导致整个子网断网。
- VRRP 通过将多台路由器虚拟为一台"虚拟路由器",使用虚拟 IP(VIP)和虚拟 MAC,实现网关冗余。
3.2 基本概念
| 概念 | 说明 |
|---|---|
| VRRP 路由器 | 运行 VRRP 的物理设备(接口) |
| VRID | 虚拟路由器标识符(1~255),同一组内相同 |
| 虚拟路由器 | 逻辑设备,拥有 VIP 和虚拟 MAC(格式 00-00-5E-00-01-XX,XX 为 VRID) |
| Master 路由器 | 承担转发任务,响应 VIP 的 ARP,周期性发送 VRRP 通告 |
| Backup 路由器 | 监听 Master 通告,准备接管 |
| Priority | 优先级(0~255),越大越优;255 为 IP 地址拥有者(自动) |
3.3 VRRP 报文
- 只有一种 Advertisement 报文,组播地址
224.0.0.18,仅在同一广播域内传递。 - 关键字段:Ver(版本)、VRID、Priority、Auth Type(0/1/2)、Adver Int(默认 1s)、IP Address 列表。
3.4 定时器
- ADVER_INTERVAL:Master 发送通告的周期(默认 1s)。
- MASTER_DOWN :Backup 等待超时后切换为 Master。
计算公式:MASTER_DOWN = (3 × ADVER_INTERVAL) + Skew_time
Skew_time = (256 - Priority) / 256
3.5 状态行为
| Master 状态 | Backup 状态 |
|---|---|
| 定期发送 VRRP 通告 | 接收并检查 Master 通告 |
| 响应 VIP 的 ARP 请求 | 不响应 VIP 的 ARP |
| 转发目的 MAC 为虚拟 MAC 的 IP 报文 | 丢弃目的 MAC 为虚拟 MAC 的 IP 报文 |
| 允许 ping 通 VIP | 丢弃目的 IP 为 VIP 的 IP 报文 |
| 收到更高优先级通告时可能降级为 Backup | 收到相同或更高优先级通告时重置 MASTER_DOWN 定时器 |
3.6 主备选举过程
- 优先级不相等:高优先级先切换至 Master,低优先级收到高优先级通告后保持 Backup。若低优先级先启动成为 Master,高优先级后启动会抢回 Master。
- 优先级相等:同时切换至 Master,比较接口 IP 地址,大者胜出。
- IP 地址拥有者(接口 IP 等于 VIP):优先级自动为 255,无条件立即成为 Master(无需等待定时器)。
- Master 主动退出:发送优先级为 0 的通告,Backup 快速切换(节省 Skew_time)。
4. 脑裂(Split-Brain)
4.1 定义
主从节点因心跳中断,各自认为对方故障,同时抢占 VIP,导致状态混乱。
4.2 常见原因
- 网络问题(心跳线路故障、断网、延迟)
- 防火墙屏蔽 VRRP 协议(UDP 112 端口)
- 节点资源耗尽(CPU/内存/负载过高)
- 配置不一致(
state、priority、authentication等)
4.3 危害
- 双节点同时持有 VIP,客户端请求混乱。
- 数据库/存储可能产生双写冲突,数据不一致。
- 集群失去高可用意义。
4.4 预防与应对
- 多重心跳线路 :配置多个网卡(
track_interface)或独立心跳网络。 - 启用认证 :
auth_type PASS+auth_pass(长度≤8 位)。 - 防火墙放行 :
firewall-cmd --add-protocol=vrrp(或开放 UDP 112)。 - 第三方隔离(fence) :通过
notify_master脚本检测对方存活,若脑裂则强制 kill/reboot 对方。 - 业务层设计:数据库主从+读写分离,分布式锁控制资源。
- 监控告警:Zabbix/Prometheus 监控 VIP 状态,发现双主立即告警。
5. 实践配置(Nginx HA 示例)
5.1 环境拓扑
| 主机名 | IP | 角色 |
|---|---|---|
| client1 | 10.1.8.21 | 客户端 |
| web1 | 10.1.8.11 | Nginx + Keepalived(主) |
| web2 | 10.1.8.12 | Nginx + Keepalived(备) |
| VIP | 10.1.8.100 | 浮动虚拟 IP |
5.2 基础部署
- 设置主机名、IP、网关(略)。
- 安装 Nginx,创建测试首页(显示 hostname)。
- 客户端验证各后端正常访问。
5.3 Keepalived 配置
web2(备)
keepalived
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 1aogao@123 # 密码仅取前8位
}
virtual_ipaddress {
10.1.8.100/24
}
}
web1(主)
- 相同配置,但
state MASTER,priority 110,router_id web1。
5.4 高可用验证
- 启动 Keepalived 后 VIP 在 web1 上。
- 访问 VIP 返回 web1 页面。
- 停止 web1 的 Keepalived,VIP 漂移至 web2,访问返回 web2 页面。
- 重新启动 web1,VIP 抢占回 web1(默认抢占模式)。
6. 配置文件结构(/etc/keepalived/keepalived.conf)
分三大部分:
6.1 全局配置(global_defs)
notification_email/notification_email_from/smtp_server:邮件告警。router_id:本机标识(必须唯一)。vrrp_skip_check_adv_addr、vrrp_strict、vrrp_garp_interval等高级选项。
6.2 VRRP 实例配置(vrrp_instance)
state:MASTER/BACKUP(仅初始状态,实际以 priority 为准)。interface:VIP 绑定的网卡。virtual_router_id:同一集群内相同。priority:越高越优先。advert_int:通告间隔(秒)。authentication:认证方式及密码。virtual_ipaddress:可列出多个 VIP。track_interface:监控网卡状态。mcast_src_ip:关键:多网卡环境下指定心跳报文的源 IP,防止错发导致脑裂。
6.3 LVS 配置(virtual_server)
- 用于 LVS 负载均衡,定义后端 Real Server 的 IP、端口、调度算法(lb_algo)、转发模式(lb_kind)等,与 HA 功能解耦。
7. 日志与心跳
7.1 日志独立
- 修改
/etc/sysconfig/keepalived:KEEPALIVED_OPTIONS="-D -d -S 0"(-d为 debug,生产慎用)。 - 配置 rsyslog:
local0.* /var/log/keepalived.log,重启 rsyslog 和 keepalived 后日志单独输出。
7.2 心跳配置
mcast_src_ip指定 VRRP 通告报文的源 IP,必须与interface网卡 IP 一致。- 多网卡环境下,若不指定,Keepalived 可能从非预期网卡发送心跳,导致对端收不到,引发脑裂。
8. 生产实践:不抢占模式(Nopreempt)
场景 :避免主节点恢复后频繁切换,维持稳定性。
配置要点:
- 所有节点
state均设为BACKUP。 - 在
vrrp_instance中添加nopreempt(仅 BACKUP 状态有效)。 - 通过
priority区分主备(高者优先成为 Master)。 - 当高优先级节点故障恢复后,不会自动抢占,仅当当前 Master 故障时才会重新选举。
示例(web1 和 web2 均配置):
keepalived
vrrp_instance nginx {
state BACKUP
nopreempt
priority 110 # web1 高,web2 低
...
}
9. 总结
- 核心:Keepalived 基于 VRRP,通过 VIP 漂移实现主备切换,解决单点故障。
- 关键机制:优先级选举、通告定时器、状态机、脑裂防御。
- 生产建议 :
- 使用不抢占模式 + 多心跳线路 + VRRP 认证。
- 配合健康检查脚本(
vrrp_script)监测后端服务,实现服务级高可用。 - 日志独立、监控告警必不可少。
- 适用场景:常与 LVS、Nginx、HAProxy 等结合,为 Web、数据库、消息队列等提供可靠的高可用架构。