Keepalived 基本原理
本文分享自天翼云开发者社区《Keepalived基本原理》,作者:Ujnrfc
Keepalived 简介
Keepalived 是 Linux 下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
它与 HeartBeat 实现类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat 是一个专业的、功能完善的高可用软件,它提供 HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享 IP 地址的所有者等等。HeartBeat 功能强大,但是部署和使用相对比较麻烦,与 HeartBeat 相比,Keepalived 主要是通过虚拟路由冗余来实现高可用功能,虽然它没有 HeartBeat 功能强大,但是 Keepalived 部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。
Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,它根据 TCP/IP 参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived 将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
Keepalived 又加入了 VRRP 的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过 VRRP 可以实现网络不间断稳定运行,因此 Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有 HAcluster 功能。
目前健康检查和失败切换是 keepalived 的两大核心功能。所谓的健康检查,就是采用 tcp 三次握手,icmp 请求,http 请求,udp echo 请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用 VRRP 维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
VRRP 协议与工作原理
在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协议。
VRRP 协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过 VRRP 可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。
虚拟路由器:虚拟路由器是 VRRP 备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个 一样,可以理解为在一个组中:主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的 IP 地址和 MAC 地址。主机将虚拟路由器当作默认网关。虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应 ARP 请求使用的是虚拟 MAC 地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实 MAC 地址。
主路由器(MASTER):虚拟路由器通过虚拟 IP 对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下 Master 是由选举算法产生,它拥有对外服务的虚拟 IP,提供各种网络功能,如:ARP 请求,ICMP 数据转发等。
备份路由器(BACKUP):虚拟路由器中的其他物理路由器不拥有对外的虚拟 IP,也不对外提供网络功能,仅接受 MASTER 的 VRRP 状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于 BACKUP 角色的备份路由器将重新进行选举,产生一个新的主路由器进入 MASTER 角色,继续提供对外服务,整个切换对用户来说是完全透明的。
VRRP 选举机制
VRRP 路由器在运行过程中有三种状态:Initialize、Master、Backup。一般主路由器处于 Master 状态,备份路由器处于 Backup 状态。
VRRP 使用选举机制来确定路由器的状态,优先级如下:
1.VRRP 组中 IP 拥有者。如果虚拟 IP 地址与 VRRP 组中的某台 VRRP 路由器 IP 地址相同,则此路由器为 IP 地址拥有者,这台路由器将被定位主路由器。
2.比较优先级。如果没有 IP 地址拥有者,则比较路由器的优先级,优先级的范围是 0~255,优先级大的作为主路由器
3.比较 IP 地址。在没有 Ip 地址拥有者和优先级相同的情况下,IP 地址大的作为主路由器。
如下图所示,虚拟 IP 为 10.1.1.254,在 VRRP 组中没有 IP 地址拥有者,则比较优先级,很明显 router_a 和 router_b 的优先级要大于 router_c,则比较 router_a 和 router_b 的 IP 地址,router_a 的 IP 地址大。所以 router_a 为组中的主路由器。
VRRP 工作过程
路由器使用 VRRP 功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为 Master 路由器,优先级低的成为 Backup 路由器。Master 拥有对外服务的虚拟 IP,提供各种网络功能,并定期发送 VRRP 报文,通知备份组内的其他设备自己工作正常;Backup 路由器只接收 Master 发来的报文信息,用来监控 Master 的运行状态。当 Master 失效时,Backup 路由器进行选举,优先级高的 Backup 将成为新的 Master 。
主备切换逻辑如下:在抢占方式下,当 Backup 路由器收到 VRRP 报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为 Master 路由器;否则将保持 Backup 状态;在非抢占方式下,只要 Master 路由器没有出现故障,备份组中的路由器始终保持 Master 或 Backup 状态,Backup 路由器即使随后被配置了更高的优先级也不会成为 Master 路由器;如果 Backup 路由器的定时器超时后仍未收到 Master 路由器发送来的 VRRP 报文,则认为 Master 路由器已经无法正常工作,此时 Backup 路由器会认为自己是 Master 路由器,并对外发送 VRRP 报文。备份组内的路由器根据优先级选举出 Master 路由器,承担报文的转发功能。
Keepalvied 的工作原理
Keepalived 包含以下组件:
core:是 keepalived 的核心,复杂主进程的启动和维护,全局配置文件的加载解析等
check:负责 healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括 LVS 的配置解析
vrrp:vrrpd 子进程,VRRPD 子进程就是来实现 VRRP 协议的
libipfwc:iptables(ipchains)库,配置 LVS
libipvs:配置 LVS
Keepalived 启动后会 通过 healthchecker 组件负责检查各自服务器的健康状态,如果 MASTER 节点上服务不可用就会通过 vrrpd 组件切换到 BACKUP 状态。
Keepalived 工作在 TCP/IP 参考模型的三层、四层、五层(物理层,链路层):
网络层(3):Keepalived 通过 ICMP 协议向服务器集群中的每一个节点发送一个 ICMP 数据包(有点类似与 Ping 的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived 将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(4):Keepalived 在传输层里利用了 TCP 协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的 WEB 服务器 80 端口。或者 SSH 服务 22 端口,Keepalived 一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(5):Keepalived 的运行方式也更加全面化和复杂化,用户可以通过自定义 Keepalived 工作方式,例如:可以通过编写程序或者脚本来运行 Keepalived,而 Keepalived 将根据用户的设定参数检测各种程序或者服务是否允许正常,如果 Keepalived 的检测结果和用户设定的不一致时,Keepalived 将把对应的服务器从服务器集群中剔除。
评论