Keepalived 介绍

概述

参考:

Keepalived 特点:

  • Active/passive 模式
  • Keepalived 是 vrrp 协议在 Linux 主机上以守护进程方式的实现
  • 能够根据配置文件自动生成 ipvs 规则
  • 对各 RS 做健康状态检测

万字长文带你从 0 学习 Keepalived

负载均衡器(Load Balancer, LB )是一组能够将 IP 数据流以负载均衡形式转发到多台物理服务器的集成软件。有硬件负载均衡器和软件负载均衡器之分,硬件负载均衡器主要是在访问网络和服务器之间配置物理负载均衡设备,客户端对物理服务器的访问请求首先会抵达负载均衡设备,然后再由负载均衡设备根据一定的负载算法转发到后端服务器。相比而言,软件负载均衡器不需要特定的物理设备,只需在相应的操作系统上部署具有负载均衡功能的软件即可。

在 Openstack 高可用集群部署中,服务的负载均衡和高可用主要有两种主流的实现方案,即 HAProxy+ Keepalived 和 Pacemaker+HAProxy 方案。由于 OpenStack 服务组件多样,不同服务均需要进行特定的高可用设计,并且从集群资源统一调度和集群稳定性的角度考虑,后一种方案是多数 OpenStack 厂商的高可用部署方案首选,但是选用后一方案并不意味着 Keepalived 在 OpenStack 高可用集群部署中不被使用。由于 Keepalived 的主要作用之一是进行虚拟路由的故障切换,其在 Neutron 的 L3 高可用设计与实现中起着举足轻重的作用。

1.1 keepalived 及 LVS 概述

Keepalived 的项目实现的主要目标是简化 LVS 项目的配置并增强其稳定性,即 Keepalived 是对 LVS 项目的扩展增强。

Keepalived 为 Linux 系统和基于 Linux 的架构提供了负载均衡和高可用能力,其负载均衡功能主要源自集成在 Linux 内核中的 LVS 项目模块 IPVS( IP Virtual Server ),基于 IPVS 提供的 4 层 TCP/IP 协议负载均衡, Keepalived 也具备负载均衡的功能,此外, Keepalived 还实现了基于多层 TCP/IP 协议( 3 层、4 层、5/7 层)的健康检查机制,因此, Keepalived 在 LVS 负载均衡功能的基础上,还提供了 LVS 集群物理服务器池健康检查和故障节点隔离的功能。

除了扩展 LVS 的负载均衡服务器健康检查能力, Keepalived 还基于虚拟路由冗余协议( Virtual Route Redundancy Protocol, VRRP )实现了 LVS 负载均衡服务器的故障切换转移,即 Keepalived 还实现了 LVS 负载均衡器的高可用性。Keepalived 就是为 LVS 集群节点提供健康检查和为 LVS 负载均衡服务器提供故障切换的用户空间进程。

图为 Keepalived 的原理架构图,从图中可以看到, Keepalived 的多数核心功能模块均位于用户空间,而仅有 IPVS 和 NETLINK 模块位于内核空间,但是这两个内核模块正是 Keepalived 实现负载均衡和路由高可用的核心模块,其中的 NETLINK 主要用于提供高级路由及其相关的网络功能。Keepalived 的大部分功能模块位于用户空间,其中几个核心功能模块的介绍如下。

  • WatchDog :其主要负责监控 Checkers 和 VRRP 子进程的运行状况。
  • Checkers :此功能模块主要负责真实服务器的健康检查( HealthChecking ),是 Keepalived 最主要的功能之一,因为 HealthChecking 是负载均衡功能稳定运行的基础, LVS 集群节点的故障隔离和重新加入均依赖于 HealthChecking 的结果。
  • VRRPStack :此功能模块主要负责负载均衡器之间的故障切换,如果集群架构中仅使用一个 LVS 负载均衡器,由于本身不具备故障切换的条件,则 VRRPStack 不是必须的。
  • IPVS Wrapper :此模块主要用来发送设定的规则到内核 IPVS 代码。Keepalived 的设计目标是构建高可用的 LVS 负载均衡群集, Keepalived 在运行中将会通过 IPVSWrapper 模块调用 IPVSAdmin 工具来创建虚拟服务器,检查和管理 LVS 集群物理服务器池。
  • Netlink Reflector :此功能模块主要用来设定 VRRP 的 VIP 地址并提供相关的网络功能,该模块通过与内核中的 NETLINK 模块交互,从而为 Keepalived 提供路由高可用功能。

从 Keepalived 的实现原理和功能来看, Keepalived 是开源负载均衡项目 LVS 的增强和虚拟路由协议 VRRP 实现的集合,即 Keepalived 通过整合和增强 LVS 与 VRRP 来提供高可用的负载均衡系统架构。

1.2 KeepAlived 工作原理

Keepalived 本质上是提供数据流转发与服务器健康检查并具备故障切换的高可用路由,而数据转发与健康检查是对 LVS 功能的扩展和增强,因此也可以认为 Keepalived 是运行在用户空间的 LVS 路由(LVS Router) 进程。在实际应用中, Keepalived 通常部署在两台主备或一主多备的服务器上,即 Keepalived 进程既运行在 Active/Master 状态的 LVS Router 中,也运行在 Passive/Slave 状态的 LVS Router 中,而所有运行 Keepalived 进程的 LVS Router 都遵循虚拟路由冗余协议 VRRP。在 VRRP 的协议框架下,作为 Master 的 Router 将会处理两个主要任务,即转发客户端访问请求到后端物理服务器以进行负载均衡和周期性的发送 VRRP 协议报文,而作为 Slave 的 Routers 则负责接收 VRRP 报文,如果某一时刻作为 Slave 的 Routers 接收 VRRP 报文失败,则认为 Master Router 故障, 并从 Slave Routers 中重新选举产生一个新的 Master Router 。

Keepalived 是一个与 LVS Router 相关的控制进程,在 RHEL7 /Centos7 系统中,Keepalived 由 Systemctl 命令通过读取/etc/keepalived/keepalived.conf 配置文件来启动。在遵循 VRRP 协议的 Master Router 中, Keepalived 进程会启动内核中的 LVS 服务以创建虚拟服务器,并根据配置拓扑对服务运行状况进行监控。此外,Master Router 还会向 Slave Routers 发送周期性的 VRRP 广播报文,而 Master Router 运行状态的正常与否是由 Slave Routers 上的 VRRP 实例决定的。如果在用户预置的时间段内 Slave Router 不能接收到 VRRP 报文,则 Keepalived 认为 Master Router 故障,同时触发 LVS Router 的 Failover 操作。

在 Failover 的过程中, Keepalived 创建的虚拟服务器会被清除,新的 Master Router 将接管 VIP 发送 ARP 信息、设置 IPVS Table 记录条目(Virtual Server)以及物理服务器的健康检查和发送 VRRP 广播报文。Keepalived 的 Failover 操作针对的是四层 TCP/ IP 协议,即传输层,因为 TCP 在传输层上进行的是基于链路连接的数据传输。所以,当服务器在响应 TCP 请求时,如果出现设置时间段的 Timeout,则 Keepalived 的健康检查机制将会监测到该情况并认为该服务器故障,然后将其从服务器池中移除(故障服务器隔离) 。图 3-4 是基于 Keepalived 设计的具有二层拓扑的负载均衡架构,该架构分为两个层次。第一层为负载均衡层,由一个 Active 和多个 Backup 的 LVS Routers 组成,其中,每个 LVS Router 都配置有两个网络接口,一个接入 Internet 网络,另一个接入内部私有网络, Active 的 LVS Router 在这两个网络接口间进行数据转发。在图 3-4 的负载均衡架构中,位于第一层的 LVS Routers 和第二层的物理服务器通过私网接口接人相同的局域网中, Active 的 LVSRouter 通过 NAT 技术将 Internet 数据流转发到私网物理服务器上,而这些位于第二层的物理服务器运行着最终响应请求的服务。

位于二层私网中的服务器在与 Internet 交互时必须经过主 LVS Router 的 NAT 转发, 并且对于外部网络中的客户端而言,访问二层私网中的物理服务器就如访问同处 Internet 网络中的服务,因为从客户端的角度来看,访问请求的目的地址正是位于主 LVS Router 上的 VIP 地址,而该 VIP 与客户端地址处于相同网络中, VIP 还可以是管理员指定的互联网域名,如www.example.com 。VIP 在 Keepalived 的配置中通常被指定到一个或者多个虚拟服务器上,而虚拟服务器的主要任务便是监昕 VIP 及相应端口上的请求,当主 LVS Router 进行 Failover 操作的时候, VIP 会从一个 LVS Router 转移到另一个 LVS(因此 VIP 也称为浮动 IP)。

在 Keepalived 负载均衡架构的 VIP 配置中,每个将 LVS Router 连接到 Internet 的物理网卡接口均可配置多个 VIP ,并且每个 VIP 对应着不同的 Virtual Server ,即多个 VirtualServers 可以同时监听相同物理网卡上的不同 VIP ,其中每个 VIP 都对应着不同的服务。例如, Linux 系统中的接口 eth0 将 LVS Router 连接到 Internet 中,则可以在 eth0 上配置一个地址为 192.168.115.100 的 VIP 以用于响应 HTTP 服务请求,同时还可以在 eth0 上配置另一个地址为 192.168.115.200 的 VIP 以用于响应 FTP 服务请求。在这里, HTTP 服务和 FTP 服务均对应着监听不同 VIP 的 Virtual Server 。在由一个 Active Router 和一个 Backup Router 组成的 Keepalived 负载均衡架构中, Active Router 的主要任务就是将 VIP 上的请求转发到选中的某个后端服务器上,具体服务器的选举机制则由 Keepalived 所支持的负载均衡算法来决定。

此外, Active Router 还负责动态监控后端服务器上特定服务的健康状况,监控方式主要是 Keepalived 自带的三种健康检测机制,即简单 TCP 连接、HTTP 和 HTTPS。就简单 TCP 连接检测方式, Active Router 会周期性地对服务器上某个特定端口进行 TCP 连接,如果 TCP 连接超时或者中断则认为服务不可用,而对于 HTTP 和 HTTPS 检测方式, ActiveRouter 通过周期性地抓取( Fetch )请求 URL 并验证其内容来判断服务的可用性。与此同时, Backup Router 一直处于 Standby 状态, LVS router 的 Failover 由 VRRP 来处理。

在 Keepalived 进程启动的时候,所有 LVS Routers 会加人一个用来接收和发送 VRRP 广播的多播组, 由于 VRRP 是一种基于优先级的协议,因此在启动之初优先级高的 LVS Router 会被选举为 Master Router ,而 Master Router 将会周期性地向多播组中的成员发送 VRRP 广播。如果多播组中的 Backup Routers 在一定时间内接收 VRRP 广播失败,则重新选举新的 Master Router ,新的 Master Router 将会接管 VIP 并广播地址解析协议( Address ResolutionProtocol, ARP )信息。而当故障 Router 重新恢复后,根据该 Router 的优先级情况,其可能恢复到 Master 状态也可能保持为 Backup 状态。

图中的两层负载均衡架构是最常见的部署环境,主要用于很多数据源变化不是很频繁的数据请求服务中,如静态 Web 页面站点,因为后端独立服务器(Real Severs )之间不会自动进行数据同步。图 3-5 为基于 Keepalived 的三层负载均衡架构,在三层负载均衡架构中,前端的 LVS Router 负责将访问请求转发到物理服务器( Real Servers )中,然后 Real Server 再通过网络形式访问可共享的数据源。

对于数据请求比较繁忙的 FTP 站点,三层架构是最为理想的负载均衡架构,在这种架构下,可供访问的数据源集中存储在高可用的集群服务器上, Real Servers 通过 NFS 共享目录或者 Samba 文件共享等网络文件系统形式来访问数据。此外,类似的三层负载均衡架构在需要提供中心化及数据库事务处理高可用的 Web 站点中也被普遍使用,如果将 Keepalived 负载均衡器配置为 Active/Active 双活模式,则还可以将三层负载均衡架构同时用于提供 FTP 和 Web 数据库服务。

1.3 KeepAlived 的负载均衡算法

Keepalived 所使用的负载均调度机制由集成到内核中的 IPVS 模块提供, IPVS 是 LVS 项目的核心功能模块,其设计的主要目的之一就是解决单 IP 多服务器的工作环境,IPVS 模块使得基于 TCP/IP 传输层( 第 4 层)的数据交换成为可能。在实际使用中, IPVS 会在内核中创建一个名为 IPVS Table 的表,该表记录了后端服务器的地址及服务运行状态,通过 IPVS Table, Keepalived 便可跟踪并将请求路由到后端物理服务器中, 即 LVS Router 利用此表将来自 Keepalived 虚拟服务器地址的请求转发到后端服务器池中,同时将后端服务器的处理结果转发给客户端。此外, IPVS table 的表结构主要取决于管理员对指定的虚拟服务器所设置的负载均衡算法, Keepalived 支持以下几种负载均衡算法。

( 1 ) Round-Robin

即所谓的轮询负载均衡,在这种算法中,服务请求会被依次转发到服务器池中的每一个服务器上,而不去评估服务器的当前负载或者处理能力,服务器池中的每一个服务器都被平等对待。如果使用 Round-Robin 负载均衡算法,每台后端服务器会轮询依次处理服务请求。

( 2 ) Weighted Round-Robin

即加权 Round-Robin 算法,是对 Round-Robin 算法的一种扩展。在这种算法中,请求被依次转发到每一台服务器上,但是当前负载较轻或者计算能力较大的服务器会被转发更多的请求,服务器的处理能力通过用户指定的权重因子来决定,权重因子可以根据负载信息动态上调或者下调。如果服务器的配置差别较大,导致不同服务器的处理能力相差较大,则加权的 Round-Robin 算法会是不错的选择,但是如果请求负载频繁变动,则权重较大的服务器可能会超负荷工作。

( 3 ) Least-Connection

即最少连接算法,在这种算法中,请求被转发到活动连接较少的服务器上。在 Keepalived 的实际使用中, LVS Router 一直在利用内核中的 IPVS Table 来记录后端服务器的活动连接,从而动态跟踪每个服务器的活动连接数。最少连接数算法是一种动态决策算法,它比较适合服务器池中每个成员的处理能力都大致相当,同时负载请求又频繁变化的场景, 如果不同服务器有不同的处理能力,则下面的加权最少连接数算法较为合适。

( 4 ) Weighted Least-Connections

即加权最少连接数算法,在这种算法中,路由会根据服务器的权重,转发更多的请求到连接数较少的服务器上。服务器的处理能力通过用户指定的权重因子来决定,权重因子可以根据负载信息动态上调或者下调。一般来说,服务器加权算法主要用于集群存在不同类型服务器,而服务器配置和处理能力相差较大的场景中。

( 5) Destination Hash ScheduIing

即目标地址哈希算法,通过在静态 Hash 表中查询目的 IP 地址来确定请求要转发的服务器,这类算法主要用于缓存代理服务器集群中。

( 6 ) Source Hash Scheduling

即源地址哈希算法,通过在静态 Hash 表中查询源 IP 地址来确定请求要转发的服务器,这类算法主要应用于存在多防火墙的 LVS Router 中。

( 7 ) Shortest Expected Delay

即最小延时算法,在这种算法中,请求被转发到具有最小连接响应延时的服务器上。

1.4 Keepalived 路由方式

(1) NAT

图 3-6 为基于 NAT 路由实现的 Keepalived 负载均衡器,在 NAT 机制下,每个 LVS Router 需要两个网络接口。假设 eth0 为接人 Internet 的网络接口,则 eth0 上配置有一个真实的 IP 地址,同时还配置了一个浮动 IP 地址(Floating IP )假设 eth1 为接入后端私有网络的接口, 则 eth1 上也配置有一个真实 IP 地址和一个浮动 IP 地址。在出现故障切换 Failover 的时候, 接人 Internet 的虚拟接口和接入私有网络的虚拟接口会同时切换到 Backup 的 LVSRouter 上,而为了不影响对 Internet 客户端的请求响应,位于私有网络中的后端服务器均使用 NAT 路由的浮动 IP 作为与主 LVS Router 通信的默认路由。

对外提供服务的公有 VIP(Public Virtual IP Address )和私有 NAT VIP(NAT Virtual IP Address)均被配置在物理网卡上而最佳的配置方式是将两个 VIP 各自配置到不同的物理网卡上,即在这种配置下,每个 LVS Router 节点最多只需两个物理网卡。在 NAT 路由转发中,主 LVS Router 负责接收请求,并将请求的目的地址替换成 LVS Router 的 NAT Virtual IP 地址,再将其转发到选中的后端服务器上,同时服务器处理后的应答数据也通过 LVS Router 将其地址替换成 LVS Router 的 Public Virtual IP 地址,然后再转发给 Internet 客户端,这个过程也称为 IP 伪装,因为对客户端而言,服务器的真实 IP 地址已被隐藏。

在 NAT 路由实现的负载均衡中,后端服务器上可以运行各种操作系统,即后端服务器上的操作系统类型并不影响 LVS Router 的 NAT 路由功能,但是,使用 NAT 路由方式存在的一个缺点是, LVS Router 在大规模集群部署中可能会是一个瓶颈,因为 LVS Router 要同时负责进出双向数据流的 IP 地址替换。

(2) DR

相对于其他的负载均衡网络拓扑, DR(Direct Routing)路由方式为基于 Keepalived 的负载均衡系统提供了更高的网络性能, DR 路由方式允许后端服务器直接将处理后的应答数据返回给客户端,而无需经过 LVS Router 的处理操作,DR 路由方案极大降低了 LVS Router 造成网络瓶颈的可能性。如图 3-7 所示。在基于 Keepalived 的负载均衡架构中, Keepalived 的最佳路由方式是 DR 路由,即在配置 Keepalived 的路由方式时,优先将其设置为 DR 。


最后修改 October 4, 2023: 合并 commit (98ba273b)