- Keepalived是一款高可用软件,它通过实现VRRP协议并集成健康检查模块,来解决负载均衡器或关键业务的单点故障问题
- keepalived高可用是基于VRRP原理来实现的
1 VRRP原理
- VRRP是一种简单而高效的网关冗余协议。它通过将多台路由器逻辑组合成一个虚拟路由器,实现了默认网关的高可用性。当主路由器宕机时,备份路由器可以在极短时间内接管业务,整个过程对终端用户是透明的,极大地提升了网络的健壮性
- 虚拟路由器(Virtual Router):由多台物理路由器组成的一个逻辑组,对外表现为一台具有唯一IP地址(虚拟IP)和MAC地址(虚拟MAC)的路由器
- 虚拟IP地址(Virtual IP,VIP):终端设备配置的网关地址。这是整个虚拟路由器的“脸面”,数据包都发往这个IP
- 虚拟MAC地址(Virtual MAC,VMAC):根据协议标准(RFC 5798),通常格式为
00-00-5E-00-01-{VRID}(IPv4)或 00-00-5E-00-02-{VRID}(IPv6)。当Master路由器响应ARP请求时,会返回这个虚拟MAC地址,而不是它自己的物理MAC地址
1.1 路由器角色
- 主路由器
- 负责转发发送到虚拟IP地址的数据包
- 定期发送VRRP通告报文(通常是组播,目的IP为224.0.0.18),告知组内的其他路由器自己处于健康状态
- 响应针对虚拟IP地址的ARP请求
- 备份路由器
- 监控Master发送的通告报文
- 如果连续一段时间没有收到Master的通告,Backup会认为Master出现故障,并触发新一轮的选举,其中一台Backup将切换为新的Master
- 不转发发往虚拟IP的数据包
- 初始化
1.2 工作原理
- 选举机制:
- 组中的路由器通过比较优先级来选举Master
- 优先级范围是1-254(数值越高越优先)
- 如果优先级相同,则拥有最高接口IP地址的路由器成为Master(或根据具体实现可能比较IP)
- 抢占模式:
- 默认情况下,VRRP启用抢占模式。这意味着,如果一台优先级更高的Backup路由器上线,它会抢占当前Master的角色,接管虚拟IP
- 也可以禁用抢占模式,避免因网络不稳定导致的频繁角色切换
- 故障切换:
- Master定期(默认为1秒)发送VRRP通告报文
- Backup设置一个定时器(通常是3倍的通告时间,即Master Down间隔)
- 如果Backup在定时器超时后仍未收到Master的通告,则宣布Master宕机,并将自己的状态切换为Master,开始转发数据包。这个过程通常只需几秒钟
- 健康检查与 VRRP 的联动:
- Keepalived 的健康检查模块会定时检测本机业务(如 Nginx)。如果检测失败,它会降低本机在 VRRP 组中的优先级。优先级降低后,备机的优先级相对变高,从而触发新一轮 VRRP 选举,实现 VIP 漂移。这就是“业务故障导致 IP 切换”的原理
2 TCP、HTTP Keepalive和Keepalived高可用的区别
- 由于这几个看起来就很容易搞混,这里做一下区分
- TCP Keepalive(传输层)
- 核心作用是在两端没有数据交换时,发送探测包来确认链接是否依旧存活
- 系统内核在连接空闲一段时间后,自动发送空的ACK探测包,多次无回复就关闭连接,释放资源
- 默认是关闭的,通常应用层会自己实现心跳而不是依赖这个
- 使用场景:客户端拔掉网线,突然断电,而不是正常关闭程序
- HTTP Keepalive(应用层)
- 复用同一个TCP连接发送多个HTTP请求/响应,而不是每请求一次就重新建立和断开连接
- 代价:服务器需要维持大量空闲连接,占用资源,因此通常会有超时时间限制
- Keepalived高可用
- Keepalived 的核心价值在于:它将 VRRP 的“机器级高可用”升级为“业务级高可用”。 单纯依靠 VRRP 只能保证机器活着,但 Keepalived 通过健康检查,确保只有业务正常的机器才能持有 VIP。
- 健康检查:针对的是本机的业务进程(可能是负载均衡器,也可能是数据库、Web服务、磁盘等),通过访问等来检测是否正常
- 工作原理:
- 通过VRRP协议制定一套VIP争夺机制
- 通过健康检查来检测并选择是否降低优先级
| 类型 |
层级 |
作用 |
是否 Keepalived |
| TCP Keepalive |
传输层 |
检测连接是否存活 |
❌ |
| HTTP Keepalive |
应用层 |
复用 TCP 连接,减少建立开销 |
❌ |
| Keepalived |
应用层 |
实现高可用,基于 VRRP + 健康检查 |
✅ |
3 Keepalived健康检查和Nginx健康检查的区别
| 对比项 |
Keepalived 健康检查 |
Nginx 健康检查 |
| 检查对象 |
本机业务(Nginx/MySQL/磁盘等) |
上游后端服务器 |
| 失败后果 |
降低 VRRP 优先级,触发 VIP 漂移 |
将故障后端从负载均衡组中踢出 |
| 恢复机制 |
业务恢复后优先级回升,可能抢回 VIP |
定时重检,自动加回对比项 |
4 keepalived高可用的简单运用
- 本实验采用两台安装nginx并搭建网络服务的服务端和keepalived软件,不存在负载均衡
- 安装并配置服务端
#安装
[root@web01 ~]# yum -y install keepalived
[root@web02 ~]# yum -y install keepalived
#找到配置文件存储的位置
[root@web01 ~]# rpm -qc keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived
#修改web01的配置
[root@web01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置参数,对整个keepalived的配置文件生效
global_defs {
#当前服务器的路由器ID
router_id web01
}
#定义一个VRRP实例,VI_1是这个实例的名称,可自定义
vrrp_instance VI_1 {
#节点状态
state MASTER
#VRRP通信使用的网络接口
interface ens160
#虚拟路由器ID,同一个VRRP组内的所有节点必须一致,范围0-255
virtual_router_id 50
#节点优先级
priority 100
#MASTER发送心跳包的频率
advert_int 1
#认证配置块,用于VRRP协议通信的简单认证
authentication {
#认证类型,PASS标识简单密码认证
auth_type PASS
#认证密码,同一组VRRP组内的节点必须一致
auth_pass 1111
}
#虚拟IP地址配置块
virtual_ipaddress {
192.168.140.177
}
}
#修改web02的配置
[root@web02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id web02
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.140.177
}
}