1. Keepalived高可用软件
1.1 Keepalived介绍
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(如Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP的出现就是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
1.2 Keepalived服务的3个重要功能
1.2.1 管理LVS负载均衡软件
早期的LVS软件需要通过命令行或脚本实现管理,并且没有针对LVS节点的健康检查功能。为了解决LVS的这些使用不便的问题,Keepalived就诞生了。可以说,Keepalived软件起初是专为解决LVS问题而诞生的。因此,Keepalived和LVS的感情很深,它们可以紧密地结合在一起工作。Keepalived可以通过读取自身的配置文件实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止等功能,这使得LVS的应用更加简单方便了。
1.2.2 实现对LVS集群节点健康的检查功能
Keepalived可以通过在自身的keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除,并转换到其他正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把它们加入到正常转发队列中,对客户提供服务。
1.2.3 作为系统网络服务的高可用功能
Keepalived可以实现任意两台主机之间,如MASTER和BACKUP主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。
Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为MASTER的主机获得所有资源并对用户提供服务,角色为BACKUP的主机作为MASTER主机的热备;当角色为MASTER的主机失效或出现故障时,角色为BACKUP的主机将自动接管MASTER主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为MASTER的主机故障修复后,又会自动接管它原来处理的工作,角色为BACKUP的主机则同时释放MASTER主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
1.3 Keepalived高可用服务对之间的故障切换转移原理
Keepalived高可用服务对之间的故障切换转移,是通过VRRP协议来实现的。
在Keepalived服务正常工作时,主MASTER节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备BACKUP节点自己还活着,当主MASTER节点发生故障时,就无法发送心跳消息了,备节点也就因此无法继续检测到来自主MASTER节点的心跳了,进而调用自身的接管程序,接管主MASTER节点的IP资源及服务。而当主MASTER节点恢复时,备BACKUP节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
VRRP协议是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
VRRP协议早期是用来解决交换机、路由器等设备单点故障的,下面是交换、路由的MASTER和BACKUP切换原理描述,同样适用于Keepalived的工作原理。
在一组VRRP路由器集群中有多台物理VRRP路由器,但是这多台物理的机器并不是同时工作的,而是由一台称为MASTER的机器负责路由工作,其他的机器都是BACKUP。MASTER角色并非一成不变,VRRP协议会让每个VRRP路由参与竞选,最终获胜的就是MASTER。获胜的MASTER有一些特权,比如拥有虚拟路由器的IP地址等,拥有系统资源的MASTER负责转发发送给网关地址的包和响应ARP请求。
VRRP协议通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0~255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是MASTER,对外部都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因MASTER的改变而修改自己的路由配置。对它们来说,这种切换是透明的。
在一组虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广播包(VRRP Advertisement messages),此时,BACKUP不会抢占MASTER。当MASTER不可用时,BACKUP就收不到来自MASTER的广播包了,此时多台BACKUP中优先级最高的路由器会抢占为MASTER。这种抢占是非常快速的(可能只有1秒甚至更短时间),以保证服务的连续性。出于安全性考虑,VRRP数据包使用加密协议进行了加密。
面试时讲解Keepalived的工作原理:
Keepalived高可用服务对之间是通过VRRP协议通信的,因此,我从VRRP协议介绍开始讲起:
1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现时为了解决静态路由的单点故障。
2)VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
3)VRRP是通过IP多播的方式(默认多播地址224.0.0.18)实现高可用对之间通信的。
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
介绍完了VRRP协议,接下来再介绍一下Keepalived服务的工作原理:
Keepalived高可用服务对之间是通过VRRP协议进行通信的,VRRP协议是通过竞选机制来确定主备的,主节点的优先级高于备节点,因此,工作时主节点会优先获得所有的资源,备节点处于等待状态,当主节点出故障的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在Keepalived服务对之间,只有作为主节点的服务器会一直发送VRRP广播包,告诉备节点它还活着,此时备节点不会抢占主节点,当主节点不可用时,即备节点监听不到主节点发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
2. Keepalived高可用服务搭建准备
2.1 安装Keepalived环境
这里建议使用前面用的Nginx负载均衡的系统环境来安装Keepalived服务,因为后面的实战案例是实现Nginx反向代理的高可用案例。
(1)硬件环境准备
准备4台物理服务器或4台VM虚拟机,两台用来做Keepalived服务,另外两台做测试的Web节点。
(2)CentOS系统及Nginx代理环境
下面是CentOS系统及Nginx代理环境:
[root@lb01 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@lb01 ~]# uname -r
3.10.0-957.el7.x86_64
[root@lb01 ~]# uname -m
x86_64
2.2 开始安装Keepalived软件
说明:下面有关Keepalived安装、启动服务的操作都是同时处理lb01、lb02两台机器。
可以通过官方地址获取Keepalived源码软件包进行编译安装,也可以使用yum的安装方式直接安装,这里选择更为简单的后者——yum安装方式。
[root@lb01 ~]# yum install keepalived -y
[root@lb01 ~]# rpm -qa keepalived
keepalived-1.3.5-16.el7.x86_64
2.3 启动Keepalived服务并检查
启动及检查Keepalived服务的命令如下:
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ps -ef | grep keepalived | grep -v grep
root 7437 1 0 14:22 ? 00:00:00 /usr/sbin/keepalived -D
root 7438 7437 0 14:22 ? 00:00:00 /usr/sbin/keepalived -D
root 7439 7437 0 14:22 ? 00:00:00 /usr/sbin/keepalived -D
---启动后有3个Keepalived进程表示安装正确
[root@lb01 ~]# ip addr|grep 192.168
inet 192.168.9.81/24 brd 192.168.9.255 scope global noprefixroute dynamic eth0
inet 192.168.200.16/32 scope global eth0
inet 192.168.200.17/32 scope global eth0
inet 192.168.200.18/32 scope global eth0
---提示:默认情况下会启动3个VIP地址
[root@lb01 ~]# systemctl stop keepalived
---测试完毕后关闭服务
2.4 Keepalived配置文件说明
和其他使用yum安装的软件一样,Keepalived软件的配置文件默认路径及配置文件名如下:
[root@lb01 ~]# ls -l /etc/keepalived/keepalived.conf
-rw-r--r--. 1 root root 3598 Aug 13 2019 /etc/keepalived/keepalived.conf
Keepalived软件有3个主要功能,这里主要讲解其高可用功能,因此,下面会默认去掉非高可用功能的相关参数。
这里的具备高可用功能的keepalived.conf配置文件包含了两个重要区块。
(1)全局定义(global definition)部分
这部分主要用来设置Keepalived的故障通知机制和Router ID标识。
[root@lb01 ~]# head -12 /etc/keepalived/keepalived.conf|cat -n
1 ! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 [email protected]
6 [email protected]
7 [email protected]
8 }
9 notification_email_from [email protected]
10 smtp_server 192.168.200.1
11 smtp_connect_timeout 30
12 router_id LVS_DEVEL
基础参数说明如下:
第1行是注释,!开头和#开头一样,都是注释。
第2行是空行。
第3~8行是定义服务故障报警的Email地址。作用是当服务发生切换或RS节点等有故障时发报警邮件。这几行是可选配置,notification_email指定在Keepalived发生事件时,需要发送的Email地址,可以有多个,每行一个,一般不设置,后期用监控软件实现监控。
第9行是指定发送邮件的发送人,即发件人地址,也是可选的配置。
第10行smtp_server指定发送邮件的SMTP服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。
第11行smtp_connect_timeout是连接SMTP的超时时间,也是可选配置。
注意:第4~11行所有和邮件报警相关的参数均可以不配,在实际工作中会将监控的任务交给更加擅长监控报警的Nagios或Zabbix软件。
第12行是Keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。
大括号“{}”用来分隔区块,要成对出现。如果漏写了半个大括号,Keepalived运行时不会报错,但也不会得到预期的结果。特别提示:由于区块间存在多层嵌套关系,因此很容易遗漏区块结尾处的大括号,要特别注意。
(2)VRRP实例定义区块部分
这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和IP信息等。示例代码如下:
19 vrrp_instance VI_1 {
20 state MASTER
21 interface eth0
22 virtual_router_id 51
23 priority 100
24 advert_int 1
25 authentication {
26 auth_type PASS
27 auth_pass 1111
28 }
29 virtual_ipaddress {
30 192.168.200.16
31 192.168.200.17
32 192.168.200.18
33 }
34 }
参数说明如下:
第19行表示定义一个vrrp_instance实例,名字是VI_1,每个vrrp_instance实例可以认为是Keepalived服务的一个实例或者作为一个业务服务,在Keepalived服务配置中,这样的vrrp_instance实例可以有多个。注意,存在于主节点中的vrrp_instance实例在备节点也要存在,这样才能实现故障切换接管。
第20行state MASTER表示当前实例VI_1的角色状态,当前角色为MASTER,这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符。其中MASTER为正式工作的状态,BACKUP为备用的状态。当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。
第21行interface为网络通信接口。对外提供服务的网络接口,如eth0、eth1。当前主流的服务器都有2~4个网络接口,在选择服务接口时要搞清楚。
第22行virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例的virtual_router_id又必须是一致的,否则将出现脑裂问题。
第23行priority为优先级,其后面的数值也是一个数字,数字越大,表示实例优先级越高。在同一个vrrp_instance实例里,MASTER的优先级配置要高于BACKUP。若MASTER的priority值为150,那么BACKUP的priority值必须小于150,一般建议间隔50以上为佳,例如:设置BACKUP的priority为100或更小的数值。
第24行advert_int为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1。
第25~28行authentication为权限认证配置,包含认证类型(auth_type)和认证密码(auth_pass)。认证类型有PASS(Simple Passwd(suggested))、AH(IPSEC(not recommended))两种,官方推荐使用的类型为PASS。验证密码为明文方式,最好长度不要超过8个字符,建议用4位数字,同一VRRP实例的MASTER与BACKUP使用相同的密码才能正常通信。
第29~33行virtual_ipaddress为虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码默认是32位,绑定的接口和前面的interface参数配置一致。注意:这里的虚拟IP就是我们工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致。