• 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的数据包
  • 初始化
    • 路由器刚启动或配置VRRP时的状态。等待启动事件

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
    }
}