1 Keepalived 基础概述
1.1 简介
Keepalived是C语言开发的高可用软件,最初为LVS负载均衡配套开发,核心依托VRRP虚拟路由冗余协议实现故障自动转移,同时支持3/4/7层服务健康检测,解决网关、负载均衡器单点故障问题。
1.2 HA集群适用场景
适合无自带故障转移能力的服务(Nginx、LVS、RabbitMQ等);
不适合自带主从/多节点冗余的服务(DNS、LDAP);
局限:无法解决程序代码BUG、全网链路故障问题。
2 VRRP 核心协议原理
2.1 解决的痛点
单网关一旦宕机,内网所有主机断网;VRRP将多台物理路由器虚拟成一台逻辑路由器,共用同一个VIP作为网关,实现故障自动切换。
2.2 VRRP基础术语
- VRRP组 :同一局域网内一组协同工作的节点,由唯一
VRID标识(1~255),同组VRID、认证密码必须完全一致; - 虚拟IP(VIP):对外统一访问地址,集群共用;
- 虚拟MAC :固定格式
0000-5e-00-01-XX,XX为VRID; - Master主节点:持有VIP,定期发送心跳报文,响应VIP的ARP请求;
- Backup备节点:监听心跳,主故障后自动升级接管VIP;
- 优先级priority:0~255,数值越大优先;接口IP等于VIP时自动为255,永久主。
2.3 VRRP报文规则
- 报文名称:Advertisement通告报文;
- 传输方式:组播,目标地址
224.0.0.18,协议号112; - 默认心跳间隔
advert_int=1s; - 认证模式:无认证、明文PASS、MD5加密。
2.4 核心定时器
- ADVER_INTERVAL:Master发心跳间隔,默认1秒;
- MASTER_DOWN定时器:备节点等待主失效超时时间
计算公式:3*心跳间隔 + 偏移时间
偏移时间 =(255 - 优先级)/256
Master主动下线会发送优先级0报文,备机无需等待完整超时,快速切换。
2.5 主备选举逻辑
- 初始化所有节点先进入Backup;
- 优先级高更快成为Master,定期发心跳;
- 优先级相同,对比节点物理IP,IP更大者为主;
- 节点IP等于VIP,直接强制Master,不参与竞争。
2.6 主备切换两种场景
- Master正常停止:发送优先级0心跳,备机瞬间切换;
- Master故障断网:备机等待MASTER_DOWN超时后接管VIP。
3 VRRP脑裂(Split-Brain)
3.1 定义
主备节点心跳通信中断,但两台服务器均正常运行,双方都判定对方宕机,同时绑定VIP,造成流量混乱、数据冲突。
3.2 产生原因
- 防火墙拦截112号VRRP协议;
- 主备间网络/网卡故障,组播报文不通;
- 集群VRID、认证密码配置不一致;
- 服务器CPU/内存耗尽,无法发送心跳。
3.3 危害
客户端请求随机分发至两台主机,数据库、存储场景会出现双写冲突,服务直接崩溃。
3.4 脑裂规避方案
- 放行防火墙VRRP协议;
- 多网卡心跳检测(track_interface);
- 开启VRRP密码认证;
- 多线路冗余心跳;
- 故障隔离脚本(notify脚本,脑裂时关机/杀死对方服务);
- 业务层加分布式锁、主从读写分离兜底;
- 监控告警双主状态。
4 Keepalived三层健康检测机制
- 网络层(ICMP):ping探测主机存活;
- 传输层(TCP端口):检测80、22等端口是否监听;
- 应用层(自定义脚本):执行自定义脚本,检测Nginx、数据库等业务服务状态。
5 Keepalived配置详解
5.1 配置文件路径
/etc/keepalived/keepalived.conf,分为三大块:
- global_defs 全局配置
- vrrp_instance VRRP主备配置
- virtual_server LVS负载均衡联动配置
5.2 基础双主备标准配置
web1(MASTER,优先级110)
ini
global_defs {
router_id web1
}
vrrp_instance nginx {
state MASTER
interface ens33
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass laogao@123
}
virtual_ipaddress {
10.1.8.100/24
}
}
web2(BACKUP,优先级100)
ini
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 laogao@123
}
virtual_ipaddress {
10.1.8.100/24
}
}
5.3 非抢占模式(生产稳定推荐 nopreempt)
所有节点统一写state BACKUP,增加nopreempt;
主节点故障恢复后,不会抢回VIP,避免频繁切换抖动。
5.4 多网卡心跳指定 mcast_src_ip
多网卡服务器,手动指定心跳报文出口IP,防止跨网卡收不到心跳,引发脑裂。
6 Keepalived 日志配置
6.1 修改系统参数文件
/etc/sysconfig/keepalived
ini
KEEPALIVED_OPTIONS="-D -S 7"
- -D:后台守护进程;
- -d:调试日志(生产关闭);
- -S 7:指定日志设备local7。
6.2 rsyslog分离日志
/etc/rsyslog.d/keepalived.conf
conf
local7.* /var/log/keepalived.log
& stop
重载服务生效:
bash
systemctl restart rsyslog
systemctl restart keepalived
# 实时查看日志
tail -f /var/log/keepalived.log
# 系统日志替代方案(无需配置)
journalctl -u keepalived -f
7 实操验证流程
- 两台服务器安装Nginx,区分首页标识;
- 分别部署Keepalived主备配置;
- 正常状态:VIP绑定web1,访问返回web1页面;
- 停止web1 keepalived:VIP漂移至web2,访问切换页面;
- 重启web1 keepalived:默认抢占模式VIP切回,nopreempt模式保持web2持有。
8 高频故障汇总
- 备机看不到VIP:主节点正常运行,VRRP机制备机不持有;
- 双主机同时拥有VIP(脑裂):防火墙拦截VRRP、密码/VRID不一致、心跳网卡错误;
- 主恢复后频繁切换:未配置nopreempt抢占关闭;
- 日志文件不存在:syslog设备与rsyslog配置不匹配;
- VIP切换后访问异常:后端网关、路由未同步调整。
9 Keepalived 典型搭配架构
- Keepalived + LVS-DR:四层高可用负载均衡;
- Keepalived + Nginx:七层Web服务高可用;
- Keepalived + MySQL/Redis:数据库缓存主备故障转移。