在实现的网络环境中,主机之间的通信都是通过配置静态路由(默认网管)完成的,而主机之间的路由器一旦出现故障,通信就会失败,因此,在这种通信模式中,路由器就成了一个单点故障,为了解决这个问题,就引入了VRRP协议。
熟悉网络的读者对VRRP协议应该不陌生。它是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换而不影响主机间的数据通信,这其中涉及两个概念:物理路由器和虚拟路由器。
VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个ie或多个)对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作。同一时间只有一台物理路由器对外提供服务,这台服务路由器称为i主路由器(处于MASTER角色)。一般情况下MASTER由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如ARP请求、ICMP、数据转发等。而其它物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为备份路由器(处于BACKUP角色)。当主路由器失效时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色继续提供对外服务iq,整个切换过程对用户来说完全透明。
每个虚拟路由器都有一个唯一标示,称为VRID,一个VRID与一组IP地址构成了一个虚拟路由器。在VRRP协议中,所有的报文都是通过IP多播形式发送的,而在一个虚拟路由器中,只有处于MASTER角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只接收MASTER发过来的报文信息,用来监控MASTER运行状态,因此,不会发生BACKUP抢占的现象,除非它的优先级更高。而当MASTER不可用的时候,BACKUP也就无法收到MASTER发过来的报文信息,于是就认定MASTER出现故障,接着多台BACKUP就会iu进行选举,优先级最高的BACKUP将成为新的MASTER,这种选举并进行角色切换的过程非常快,因而保证了服务的持续可用性。
Keepalived工作原理
上面介绍了Keepalived通过VRRP实现高可用功能的工作原理,而Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控及故障隔离。下面继续介绍Keepalived对服务器运行状态监控和监测的工作原理。
Keepalived工作在TCP/IP参考模型的第三、第四和第五层,也就是网络层、传输层和应用层。根据TCP/IP参考模型各层所能实现的功能,Keepalived运行机制如下:
在网络层,运行着4个重要的协议:互联网协议IP、互联网控制报文协议ICMP、地址转换协议ARP以及反向地址转换协议RARP。Keepalived在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似与Ping命令的实现),如果某个节点服务器没有返回响应数据包,那么认为此节点发生了故障,Keepalived将报告此节点失效,并从服务器集群中剔除故障节点。
在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议TCP可以提供可靠的数据传输服务、IP地址和端口、代表TCP的一个连接端。要获得TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接,而Keepalived在传输层就是利用TCP协议的端口连接扫描技术来判断集群节点是否正常,比如常见的Web服务默认的80端口、ssh服务默认的22端口等,Keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群中移除。
在应用层,可以运行FTP、TELNET、SMTP、DNS等各种不同协议的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式,例如,用户可通过编写程序来运行Keepalived,而Keepalived将根据用户的设定监测各种程序或服务是否允许正常,如果Keepalived的监测结果与用户设定的不一致,Keepalived将把对应的服务从服务器中移除。
Keepalived体系结构
Keepalived是一个高度模块化的软件,结构简单,但扩展性很强,感兴趣的可以阅读Keepalived源码。下图是官方给出的keepalived体系结构图:
从图可以看出Keepalived的体系结构从整体上分为两层,分别是用户空间层(User Space)和内核空间层(Kernel Sapce)。下面介绍Keepalived两层结构的详细组成及实现的功能。
内核空间层位于最底层,它包括IPVS和NETLINK两个模块。IPVS模块是Keepalived引入的第三方模块,通过IPVS可以实现基于IP的负载均衡集群。IPVS默认包含在LVS集群软件中。而对于LVS集群软件,相信做运维的读者并不陌生:在LVS集群中IPVS安装在一台叫做Director server的服务器上,同时在Director Server 上虚拟一个IP地址对外提供服务,而用户必须通过这个虚拟IP地址才能访问服务。这个虚拟IP一般称为LVS的VIP,即virtual IP, 访问的请求首先经过VIP到达Director Server,然后由Director Server从服务器集群节点中选取一个节点响应用户的请求。
Keepalived最初就是为LVS提供服务的,由于Keepalived可以实现对集群节点的状态监测,而IPVS可以实现负载均衡功能,因此,Keepalived借助与第三方模块IPVS就可以很方便地搭建一套负载均衡系统。这里有个误区,由于Keepalived可以和IPVS一起很好的工作,因此很多初学者都以为Keepalived就是一个负载均衡软件,这种理解是错误的。
在Keepalived中,IPVS模块是可以配置的,如果需要负载均衡功能,可以爱编译Keepalived时打开负载均衡功能,也可以通过配置编译参数关闭。
NETLINK模块主要用于实现一些高级路由框架和一些相关的网络功能,完成用户空间Netlink Reflector模块发来的各种网络请求。
用户空间层位于内核空间层之上,Keepalived的所具有具体功能都是从这里实现,下面介绍几个重要部分所实现的功能。
在用户层,Keepalived又分为4个部分,分别时Scheduler I/O Multiplexer、Memory Management、 Control Plane和Core components。其中Scheduler I/O Multiplexer是一个I/O复用分发调度器,它负责安排Keepalived所有内部的任务请求。Memory Management是一个内存管理机制,这个框架提供了访问内存的一些通用方法。Control Plane是Keepalived的控制面板,可以实现对配置文件进行编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某个模块的时才解析相应的配置。最后详细说一下Core components,这个部分是keepalived的核心组件,包含了一系列功能模块,主要有WatchDog、Checkers、VRRP Stack、IPVS wrapper 和Netlink Reflector,面介绍每个模块所实现的功能如下:
(1)WatchDog
WatchDog是计算机可靠性领域中极为简单又非常有效的监测工具,它的工作原理是针对被监视的目标设置一个计数器和一个阀值,WatchDog会自己增加此计数值,然后等待监视的目标周期性重置该计数值。一旦监控目标发生错误,就无法重置此计数值,WatchDog就会监测到,于是采取对应的恢复措施,例如重启或关闭。
在Linux中很早就引入WatchDog功能,而Keepalived正是通过WatchDog的运行机制俩监控Checkers和VRRP进程的。
(2)Checkers
这是Keepalived最基础的功能,也是最主要的功能,可实现对服务器运行状态检测和故障隔离。
(3)VRRP stack
这是Keepalived最基本的功能,也是最主要的功能,可实现HA集群中失败切换(Failover)功能。Keepalived通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能负载均衡集群系统。
(4)IPVS wrapper
这是IPVS功能的一个实现。IPVS wrapper模块可以将配置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现IPVS模块的负载均衡功能。
(5)Netlink Reflector
用来实现高可用集群中Failover时虚拟IP(VIP)的设置和切换。Netlink Reflector的所有请求最后都发送到内核空间层的NET