keepalived
keepalived简介
Keepalived 是一款采用 C 语言开发的软件,主要用于解决负载均衡器在运行过程中可能出现的高可用性问题,具备负载均衡、健康状态检测以及高可用性等核心功能。其中,高可用性的实现依赖于 VRRP 协议。
最初,keepalived 的设计目的是用于 LVS(Linux Virtual Server)系统中,专门负责监控集群中的各个服务节点运行状况。一旦某个节点发生故障或出现异常情况,keepalived 能够自动识别并将其从集群中移除;当该节点恢复正常后,系统也会自动将其重新纳入集群之中。这些操作均无需人工干预。这种机制在功能上与 nginx 等反向代理工具所具备的探活机制相似,均可实现后端服务的高可用性。
随后,keepalived 引入了 VRRP(Virtual Router Redundancy Protocol)协议的支持。VRRP 的设计初衷是为了解决静态路由中存在的单点故障问题,并通过其机制确保网络能够持续稳定地运行。因此,keepalived 不仅具备对服务器状态进行检测和故障隔离的能力,还能够构建 HA cluster(高可用集群),从而实现各类中间件系统的高可用性。
keepalived和LVS关系
LVS 是 Linux Virtual Server 的简称,即 Linux 虚拟服务器,在 Linux 2.4 内核版本之后已完全集成其功能模块。它工作于 OSI 模型第四层(传输层),与 Haproxy 等工具有相似之处,主要用于实现对服务器集群的负载均衡处理。
两者都需要使用虚拟 IP 地址来完成相关操作。那么这两者之间究竟存在怎样的联系呢?
根据上述内容可知,在最初的设计中,keepalived 主要用于协助 LVS 对上游应用进行健康状态探测。随后引入了 VRRP 协议后,则实现了对静态路由(即 LVS)的高可用支持。
由此可以得出以下结论:
LVS 通过 ipvsadm 工具配置虚拟服务器以实现反向代理及负载均衡功能;而 keepalived 在此过程中则承担了服务健康检查的任务,并同时实现了 LVS 实例的冗余备份功能。
两者共享相同的虚拟 IP 地址,并且 keepalived 已经内置了 ipvsadm 的管理能力,可以根据配置文件的内容自动完成对 LVS 的相关配置操作。
因此 Keepalived 不仅具备管理 LVS 配置的功能,并且能够对 LVS 下游节点进行健康检查;同时还能实现系统网络服务层面的高可用性保障。
keeplived 实现高可用示意图

VRRP工作原理
在实际的网络运行环境中,主机之间的信息交互通常依赖于静态路由(默认网关)进行配置。然而,一旦连接这些主机的路由器发生故障,通信将无法正常进行。因此,在这种通信机制下,路由器被视作一个关键的单一故障点。为了解决这一问题,VRRP协议被引入;
VRRP协议是一种主备模式的协议,通过该协议可以在网络出现异常时实现设备切换,并且这一过程对主机间的数据传输不会产生任何影响。在此过程中涉及两个核心概念:物理路由器和虚拟路由器。
VRRP能够将两台或更多物理路由器整合为一个虚拟路由器。该虚拟路由器通过虚拟IP对外提供服务,在其内部则由多个物理路由器协同运作。在任意时刻,仅有一台物理路由器负责对外提供服务,这台物理设备 被称作主路由设备(处于MASTER角色)。
通常情况下,MASTER是通过选举算法确定的,并拥有用于对外服务的虚拟IP地址。它通过多种网络功能完成数据转发任务。而其余不具备虚拟IP地址的路由设备则不参与网络服务工作,仅负责接收来自MASTER发送的VRRP状态通告信息。这些设备统称为备份路由设备(处于BACKUP角色)。当主路由设备失效时,处于BACKUP状态的备份路由设备将重新进行选举流程,并产生新的主路由设备进入MASTER角色继续提供服务。整个切换过程对于用户而言是完全不可见的。
每个虚拟路由系统都有一个唯一的识别编号,称为VRID。VRID与一组IP地址共同构成一个完整的虚拟路由系统。在VRRP协议中,所有通信数据均以IP多播的方式进行传输,在同一个虚拟路由系统中只有处于MASTER角色的节点会持续发送VRRP数据包;而处于BACKUP角色的节点只接收来自MASTER的信息内容以监控其运行状况,并不会主动发起抢占行为,除非其优先级高于当前主节点。一旦检测到MASTER无法正常工作,则BACKUP节点将无法接收到相关报文信息并据此判断主节点已失效,在此情况下多个BACKUP节点将启动新的选举流程,并由优先级最高的BACKUP节点成为新的主节点继续承担服务任务;
keepalived体系结构及工作原理
keepalived运行于TCP/IP参考模型中的网络层、传输层以及应用层之中,具备对集群服务器运行状况实施监控并实现故障隔离的能力;其核心运作机制如下:
在网络层 ,涉及四个关键性协议:IP协议、ICMP协议、ARP协议和RARP协议 。keepalived在网络层最常用的工作方式是借助ICMP协议向集群中的每一个成员发送ICMP数据包(类似于Ping操作)。如果某个成员未能返回响应信号,则认为该成员出现了异常情况;此时keepalived将报告该成员失效并将其从集群中移除;
在传输层 ,提供了两个主要通信方式:传输控制协议TCP和用户数据报文协议UDP 。TCP可以确保可靠的数据传输过程,并且每条TCP连接都由特定IP地址及端口号标识出来;为了获取TCP的服务功能需要在发送端与接收端分别建立对应的端口连接关系;而在传输层层面keepalived正是利用了TCP端口连接与扫描技术来评估集群内各成员是否保持正常运行状态;
在**应用层上可支持多种高层通信标准如FTP、SMTP、DNS等不同类型的高级别应用协定, keepalived 的运作机制也变得更加多样化和复杂化, 用户可以根据自身需求自定义 keepalived 的具体执行方式. 例如, 用户可以通过编写程序的方式来启动 keepalived, 并让 keepalived 根据用户的预设条件检测各种应用程序或服务是否正常运作. 如果检测结果与预设条件不符, 则 keepalived 将自动将对应的服务从服务器中剔除;
keepalived的体系结构
keepalived的整体架构分为两个主要层级:即用户空间层级与内核空间层级。

内核空间层由IPVS和NETLINK两个组件构成:
IPVS模块是keepalived引入的一个外部组件,借助该模块可以实现基于IP的负载均衡集群。IPVS作为LVS集群软件的默认组成部分,keepalived最初正是为LVS提供支持而设计的。由于keepalived具备对集群节点状态进行检测的能力,而IPVS则能够实现负载均衡功能,因此通过集成第三方模块IPVS,keepalived可以较为便捷地构建一套负载均衡集群。但这并不意味着keepalived本身就是一个负载均衡软件。
NETLINK模块主要负责处理一些高级路由架构及相关网络功能,用于完成用户空间层Netlink Reflector模块所发出的各种网络请求。
在用户空间层中,keepalived被划分为四个部分:
Scheduler I/O Multiplexer: 一个I/O复用调度器,其职责是分配并管理keepalived内部的所有任务请求;
Memory Management: 一种内存管理机制,该框架提供了一系列通用的内存访问方式;
Control Plane:作为keepalived的控制面板,用于对配置进行编译与解析(需要注意的是,keepalived配置文件并非一次性解析所有模块配置内容,而是仅在需要使用某个模块时才解析对应的配置项);
Core components: keepalived的核心组件集合,其中包含多个功能模块,主要包括WatchDog、Checkers、VRRP stack、IPVS wrapper以及Netlink Reflector;
部分核心模块的功能说明如下:
WatchDog: 为被监控对象设定计数器及阈值,并由WatchDog自身递增该计数值后等待被监控对象周期性地重置。一旦被监控对象出现异常,则无法重置计数器,并触发相应的恢复操作如重启或关闭等。正是通过这一机制,keepalived实现了对Checkers和VRRP进程的监控作用;
Checkers: 作为keepalived最基本且最重要的功能之一,可实现对服务器运行状态的检测及故障隔离操作;
VRRPStack: 能够支持HA(高可用)集群中的故障转移(Failover)功能。通过结合VRRP功能与LVS负载均衡软件,即可部署出高性能的负载均衡集群环境;
IPVS wrapper: 实现了对IPVS功能的支持。该模块能够将已配置好的IPVS规则传递至内核空间并交由IPVS处理以最终完成负载均衡任务;
Netlink Reflector: 主要用于在高可用集群中实现虚拟IP地址的设置与切换操作。所有相关请求最终都会发送至内核空间中的NETLINK模块进行处理。
关于MASTER和BACKUP角色的选择策略
当未使用vrrp_script时,在keepalived集群中并不存在严格意义上的主备节点概念。尽管可以在配置文件中设定MASTER状态,并不表示此节点始终处于主节点状态。节点的角色主要取决于配置文件中的priority值,并非唯一决定因素。另一个影响角色的因素是vrrp_script中定义的weight值。具体而言,在整个集群环境中每个节点的角色将根据priority与weight两者的数值大小来确定;若未在vrrp_script中设置weight值,则优先级的选择完全依赖于配置文件中的priority参数。
使用vrrp_script模块
当weight值为正数时,在vrrp_script指定脚本检测成功的情况下,则主节点权重等于weight值加上priority值;如果检测失败,则权重仍保持为priority值不变。
因此,
切换策略:
当主节点vrrp_script脚本检测失败时,并且此时主节点priority值小于备份节点weight与priority之和,则会触发主备切换;
当主节点vrrp_script脚本检测成功时,并且此时主节点weight与priority之和大于备份节点相应数值之和,则保持当前主从关系不变;
当weight值为负数时,
若在vrrp_script中指定脚本检测成功,则主节点权重仍维持为priority值不变;
如果检测失败,则权重变为priority减去绝对值上的weight差额。
因此,
当主节点vrrp_script脚本检测失败时并且此时其priority减去绝对值得到的结果小于备份端点优先级的话就会发生角色转换;
而如果此时master端点优先级高于backup端点优先级的话则不会发生任何变化
