服务状态监测之Keepalived
2010-09-20 14:32:24 阿炯

Keepalived是VRRP(虚拟路由器冗余协议)的一个很好的软件实现。类似于layer3、4、5交换机制的软件,也就是平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web 服务器加入到服务器群中。这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。采用C语言开发并在GPLv2协议下授权。



 


The main goal of the keepalived is to add a strong & robust keepalive facility to the Linux Virtual Server project. This project is written in C with multilayer TCP/IP stack checks. Keepalived implements a framework based on three family checks : Layer3, Layer4 & Layer5/7. This framework gives the daemon the ability of checking a LVS server pool states. When one of the server of the LVS server pool is down, keepalived informs the linux kernel via a setsockopt call to remove this server entrie from the LVS topology. In addition keepalived implements an independent VRRPv2 stack to handle director failover. So in short keepalived is a userspace daemon for LVS cluster nodes healthchecks and LVS directors failover.

Keepalived provides a strong and robust health checking for LVS clusters. It implements a framework of health checking on multiple layers for server failover, and VRRPv2 stack to handle director failover. If your are using a LVS director to loadbalance a server pool in a production environnement, you may want to have a robust solution for healthcheck & failover.

[核心组件]

VRRP Stack:VRRP 协议的实现
IPVS Wrapper:为 RS 集群中的服务器都生成 IPVS 规则
Checkers:对 IPVS 集群的 RS 做健康检查
控制组件:配置文件分析器,用来实现配置文件的分析和加载
I/O 复用器:管理 I/O 复用功能
内存管理组件:用来管理 Keepalived 高可用的内存管理

[VRRP(虚拟路由冗余协议)]

在现实网络环境,经常需要使用路由协议来完成主机定位,使用路由协议的方法常见有两种:
动态路由协议(如RIP、OSPF)
在主机上配置静态路由

显然在主机上配置静态路由是更多用户可以使用的方式,用户可以在自己的机器上配置一个或多个网关条目。不过使用静态路由存在一个问题,因为大家都依赖于路由器的动态路由协议,所以当路由器处于单点状态并发生故障时,所有人的网络都会受到牵连。VRRP 协议的目的就是为了解决静态路由单点故障问题。

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议),该协议会对共享多存取访问介质(如以太网)上的主机设备的默认网关(Default Gateway)进行冗余备份,从而当其中一台路由设备宕机时,备份路由设备也能够及时接管路由转发任务。为用户提供了透明、可靠的网络服务质量。

[VRRP 的工作机制]

VRRP 协议的基本对象概念:VRRP 路由器和虚拟路由器,Master 路由器和 Backup 路由器。

VRRP 路由器:指运行 VRRP 协议的路由器,是物理实体。

虚拟路由器:指由 VRRP 协议创建的、虚拟的逻辑路由器,一组 VRRP 路由器协同工作,共同构成一台虚拟路由器。虚拟路由器对外表现为一个固定的 VIP 和 MAC 地址,

Backup 路由器:VRRP 路由器组中起到备份作用的路由器,可以存在任意个 Backup。

Master 路由器:为了保证高可用,VRRP 路由器通常存在多个,其中有且仅有一个是实际工作的,称为 Master 路由器。主要负责转发网关上的 IP 数据包以及响应 ARP 请求等路由工作,Master 并非是一成不变的,VRRP 通过竞选(Election)协议来动态的从 VRRP 路由器组中决策出 Master。Master 拥有一些特权,比如:拥有虚拟路由器的 VIP 和 MAC,客户端都是使用这个 VIP 地址来配置静态路由。

Backup 路由器:作为 Master 路由器的冗余,当 Master 出现故障或需要切换时替换成为新的 Master。


[健康检查原理]

Keepalived 同样支持后端服务器集群的健康状态,如果有 Real Server 出现故障,Keepalived 会及时的检测到并将其从集群剔除。当故障的 Real Server 恢复后,Keepalived 又会自动将其加入集群。这些工作由其自动完成,无需人工干涉,运维人员需要做的只是修复发生故障的 Real Server。

Keepalived 支持 L3, L4 及 L5 层网络的健康检查:
L3:Keepalived 定期向 backend 发送 ICMP 数据包(PING)如果发现某台 Real Server 的 IP 地址没有激活,Keepalived 就会报告该 Server 失效,并将它从 backend 中剔除。L3 的工作就是通过 IP 地址是否有效来判断 Real Server 是否正常工作。

L4:主要以 TCP 端口状态来判断 Real Server 是否正常工作。例如:apache service 的端口一般是 80,如果 Keepalived 检测到 80 端口没有启用,则判断该 Real Server 失效,将其从 backend 中剔除。

L5:工作在应用层,比 L3、L4 要复杂一些,占用的带宽也更大。Keepalived 根据用户预设的业务服务应用程序运行是否正常判断 Real Server 是否正常工作,如果应用程序的运行状态与预设的不符,则将其从 backend 中剔除。


Layer3、4、5工作在IP/TCP协议栈的IP层、TCP层、应用层,原理分别如下:

Layer3:Keepalived 使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping包),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

Layer5:Layer5 就是工作在具体的应用层了,比Layer3和Layer4要复杂一点,在网络上占用的带宽也要大一些。它将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

[关于高可用(HA)]
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可以实现web前端服务的高可用。

Keepalived实现的基础是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的。

VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。该备援协议有版权(专利)争议,具体细节可参考《CARP(共享地址冗余协议)》。


[高可用原理]

每个 VRRP 路由器至少有一个 vrrp_instance,每个 vrrp_instance 都拥有 VRID 作为唯一标识。VRID 范围在 [0-255] 之间。VRRP 路由器的虚拟 MAC 地址由 VRID 组成,格式为 00-00-5E-00-01-[VRID]。

当 Master 激活时,由 Master 负责使用自己的 MAC 来应答 ARP 请求;当 Master 失效时,选举出一个 Backup 负责响应 ARP 请求(把 VIP 绑定到自己的网卡上)并暂时升级为 Master。当 Master 恢复激活时又会重新接管 VIP, 实现了自动化的故障转移。这样的话,无论 Master 如何在 VRRP 路由器中切换,都能保证 ARP 响应给客户端的 VIP 地址对应的 MAC 地址的拥有者始终是激活的。而且客户端不需要因为 Master 的切换而修改自己的静态路由配置,对于客户端主机而言,这种主从切换是透明的。

VRRP 控制报文只有 VRRP 通告(Advertisement)一种。它使用 IP 多播数据包进行封装,组地址为 224.0.0.18,只限于同一 LAN 内发布,保证 VRID 在不同 LAN 中可以重用。为了减少网络带宽消耗,所以只有 Master 可以周期性的发送 VRRP 通告报文。如果 Backup 在连续三个通告间隔内依旧收不到 VRRP 通告,或者收到优先级为 0 的通告后,就是启动新的一轮 Master 选举。

高可用模式

主从模式:单虚拟路由器,只有一个 VIP,当 Master 出现故障时,VIP 漂移到 Backup 上。

主主模式:多虚拟路由器,两个 VIP,一个 VRRP 路由器拥有两个 vrrp_instance。当其中一个 Master 故障时,它的 VIP 就漂移到另一台 Master 上(此时有两个 VIP);当故障恢复后,再将 VIP 重新漂移过来。


最新版本:1.2
修复了 VRRP 单播 TTL
支持新版的  libnl.
更多 IPv6 支持
修复扩展了 VRRP gratuitous ARP 处理
支持基础 VMAC 接口的 xmit VRRP 包
调整了 VRRP 多播组
修复了非故障状态下的 VRRP socket 同步
代码整理与优化

最新版本:2.10
更新内容:
使 vmac_xmit_base 适用于 IPv6 实例
在重新创建接口时处理 vmac_xmit_base
新增 -t config-test 选项

各项详情可查阅修改日志

项目主页:http://www.keepalived.org/

该文章最后由 阿炯 于 2022-03-12 06:47:18 更新,目前是第 4 版。