Keepalived是Linux下的一个免费的、轻量级的高可用解决方案。是一个由C语言编写的路由软件,主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设。Keepalived实现了一组检查器,以根据其健康状况动态地和自适应地维护和管理负载平衡的服务器池。另一方面,VRRP实现了高可用性协议。VRRP是路由器故障转移的基础。此外,Keepalived为VRRP有限状态机实现了一组挂钩,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived实现了BFD协议。VRRP状态转换可以考虑BFD提示来驱动快速状态转换。
Keepalived框架可以单独使用,也可以与其他软件一起使用。 Keepalived最开始是为LVS设计的,主要用来监控集群中各个服务节点的运行状态。 当服务节点出现故障被检测到,则会被Keepalived从集群中剔除,待恢复后再重新加入集群,期间的工作自动完成,不需要人工干预,需要人工完成的部分仅限于修复出现故障的服务节点。 VRRP协议,全称:Virtual Router Redundancy Protocol(虚拟路由器冗余协议)。它是一种选择协议、路由备份协议,是Keepalived最重要的一个功能。可以将多个路由器组成一个虚拟路由器(一主多备),在网络发生故障时,可以实现透明切换。 通过VRRP协议组成的虚拟路由器,通过一个或多个虚拟IP对外提供服务,在内部则是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,被称为主路由器。其工作过程大致如下:
1.启用VRRP功能后,根据优先级确定自己的在虚拟路由器中的角色,优先级高的为主路由器,其他的为备用路由器。主路由器定期向其他备用路由器发送VRRP报文,通告自己的工作状态正常,备用路由器则会定时接收。
2.VRRP根据不同的抢占方式,确定是否替换主备状态: ● 抢占方式:备用路由器收到报文后,会对比优先级,若大于通告报文中的优先级,则切换为主路由器,否则报持状态不变; ● 非抢占方式:主路由器在没有出现故障的情交下,主路由器与备用路由器将一直保持原有的状态。
3.若备用路由器在一定时间内没有收到主路由器发送的VRRP报文,则认为主路由器无法正常工作,此时备用路由器将会选举出优先级高的作为主路由器并发送VRRP报文,替代原有主路由器持续工作。 了解了VRRP如何工作,下面将介绍Keepalived是如何工作的。但在介绍之前,还需要了解一下它的设计架构及健康检查机制。Keepalived大致分两层结构:用户空间和内核空间。其大多数核心功能均在用户空间,而内核空间中的两个模块,IPVS主要实现负载均衡,NETLINK则主要提供高级路由及其他相关的网络功能。图9-27是官方给出的Keepalived体系结构拓扑图。
Keepalived提供了三个守护进程,分别负责不同的功能: ● 父进程:负责fork子进程并对其进行监控。 ● VRRP子进程:负责VRRP框架。 ● 键康检查子进程:负责健康检查。 Keepalived依赖于VRRP协议实现高可用,同时还实现基于TCP/IP协议栈的多层(3层、4层、5/7层)的健康检查机制,能够提供服务节点检查及故障隔离的功能。其运行机制大致如下: ● 网络层:主要通过ICMP协议,向服务节点发送ICMP数据包(类似ping命令的方式),若无响应,则判定为故障节点并将其从集群中移除。 ● 传输层:主要通过TCP协议,向后端发起一个TCP连接请求,若无响应,则判定为故障节点并将其从集群中移除。 ● 应用层:主要根据用户的一些设定来判断节点是否正常,若不正常,则判定为故障节点并将其从集群中移除。常用的方式即使用脚本进行检测。
Keepalived一般会同时运行在两台或更多服务器上,同时提供服务且存在主从之分。实际提供服务的只有主服务节点。其工作原理与VRRP类似。Keepalived会根据配置文件中定义的优先级或节点的主从标记,确定哪一台服务器中运行的服务可以成为主节点并使用VIP(虚拟IP)对外提供服务,其他的则成为从节点。若Keepalived的主节点出现故障停止提供服务或所在的服务器宕机时,会将主节点移除并在从节点中选举出优先级较高的节点作为新的主节点并接管VIP继续提供服务,保证服务的不间断。待故障节点恢复后,再重新加入并重新确定是否需要切换主从关系。
1.Keepalived安装比较简单,安装的方式主要分为两种: ● 可以使用YUM源直接进行安装。如下所示。
[root@keepalive-master ~]# yum install -y keepalived
如果出现图中这种重复的语句就使用rm -F /var/run/yum.pid命令强制关闭yum再重新安装,下图所示。
2. 如果需要使用最新版本, 也可以在官网:http://www.keepalived.org/下载最新的版本编译安装。 安装(此处使用YUM源进行安装)过程,Keepalived的配置(/etc/keepalived/keepalived.conf)主要分为以下七个部分,也可以在/usr/share/doc/keepalived-<版本号>/samples目录下查看官方提供的配置文件示例或使用命令“man keepalived.conf”查看相关参数及说明。由于参数较多且限于篇幅,下面将简单介绍其主要功能及常用的配置参数:
3.101 global_defs
定义全局设置,包括如发送消息的邮件地址、SMTP服务器的IP、SMTP服务器的超时时间、 主机识别字符串、VRRP多播地址等。 ● notification_email:故障时接收邮件的地址,可以多个,每行一个; ● notification_email_from:邮件发送地址; ● smtp_server:SMTP服务器地址; ● smtp_connect_timeout:SMTP连接超时时间; ● router_id:主机识别标志。出现故障需要发送邮件时,通知邮件会使用到它。 ● vrrp_skip_check_adv_addr:跳过报文检查。当收到的报文与上一个报文来自同一个路由器时有效; ● vrrp_strict:vrrp协议严格模式,严格遵守vrrp协议; ● vrrp_garp_interval:网卡上APR消息之间的延迟; ● vrrp_gna_interval:网卡上发送的未经请求的NA消息之间的延迟。
3.2static_ipaddress 和static_routes
定义静态IP地址和路由。如果服务器上已经定义且这些服务器具有网络连接,则不需要此部分。
3.3vrrp_sync_group
定义一起故障转移的VRRP备份VRRP同步组。 ● group:vrrp_instance实例名,可以多个,每行一个; ● notify_master:状态转为MASTER时,执行的脚本; ● notify_backup:状态转为BACKUP时,执行的脚本; ● notify_fault:状态转为FAULT时,执行的脚本; ● notify:当出现状态转换时,即会执行的脚本。在 notify_* 脚本之后执行。 ● smtp_alert:状态发生转换时,触发邮件发送。相关的信息在 global_defs 中定义; ● global_tracking:所有VRRP共享相同的跟踪配置。
3.4vrrp_instance
为VRRP同步组的内部或外部网络接口的成员定义可移动的虚拟IP地址,在状态切换时会漂移到其他节点上继续提供服务。每个VRRP实例必须具有唯一的“virtual_router_id”值,标志着哪些主/备服务器可以使用同一个虚拟IP地址提供服务。即同一“vrrp_instance”中,此值在MASTER或BACKUP节点上必须一致。还可以指定状态在切换为MASTER、BACKUP和 FAULT时,是否触发SMTP警报。 ● state:节点的状态。可为:MASTER、BACKUP。单节点时,默认为MASTER,当有多个节点时,选举出优先级最高的成为MASTER。 ● interface:发送vrrp报文的网卡。 ● virtual_router_id:虚拟路由器标识。全局唯一且范围在0-255之间的整数数字。同一个实例中,主从节点中的此值必须一致。 ● priority:优先级数值。值越大,优先级越高。若为MASTER,建议值设置比其他节点高出至少50。 ● advert_int:VRRP广告时间间隔(以秒为单位)(例如0.92)(默认使用)。 ● authentication:设置认证信息。 ● virtual_ipaddress:虚拟IP地址,可以多个,每行一个。当状态在MASTER和BACKUP之间切换时,添加或删除的IP地址。
3.5vrrp_script
定义跟踪脚本。主要用于健康检查。当需要根据业务进程的运行状态决定是否需要进行主备切换时,可以通过编写脚本对业务进程进行检测监控。主要用于 vrrp_instance 和 vrrp_sync_group 部分。 ● script:执行脚本的路径; ● interval:每两次调用执行脚本的时间间隔; ● timeout:脚本执行的超时时间; ● weight:权重值。按此权重调整优先级,默认为0。
3.6virtual_server_group
定义虚拟服务器组,允许真实服务器成为多个虚拟服务器组的成员,每行一个。成员格式为:IP地址或范围和端口号,以空格分隔。
3.7 virtual_server
定义用于负载平衡的虚拟服务器,该服务器由多个真实服务器组成。后接虚拟IP地址和端口号,以空格分隔。 ● delay_loop:轮询的延迟时间; ● lb_algo:LVS负载均衡调度算法。官方给出的可选项为:rr、wrr、lc、wlc、lblc、sh、dh; ● lb_kind:LVS转发模式。官方给出的可选项为:NAT、DR、TUN; ● persistence_timeout:LVS会话超时时间,默认6分钟; ● protocol:第四层网络协议,默认为TCP。官方给出的可选项为:TCP、UDP、SCTP; ● real_server:定义LVS真实服务器节点。有多少个真实服务器节点,则需要多少段; ● weight:real_server中使用。权重值,默认为1; ● inhibit_on_failure:real_server中使用。当键康检查失败时,权重值会被重置为0; ● notify_up:real_server中使用。当健康检查认为服务为UP状态时,执行的脚本; ● notify_down:real_server中使用。当健康检查认为服务为DOWN状态时,执行的脚本; ● HTTP_GET:real_server中使用。健康检查定义,官方给出的可选项为: HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、DNS_CHECK、MISC_CHECK
将演示如何配置Keepalived的非抢占模式,同时会涉及到LVS的相关内容。演示中使用了四台服务器,两台作为Keepalived及ipvsadm节点,两台做为后端的真实服务器。ipvsadm在演示中主要用于查看LVS集群的相关信息,而具体的配置则是通过Keepalived配置文件直接进行配置管理的。即实际的演示内容是Keepalived+LVS的集群,关于LVS后端真实服务器的配置,由于在前面的章节中已经有过详细步骤,因此本小节将不再进行演示。同时所有服务器已完成了一些常用的初始化内容,如设置主机名、关闭SELinux、测试域名解析等,后续不再进行说明。 Keepalived在运行过程中,可以配置抢占和非抢占模式。两者的区别如下: ● 抢占模式:即在一个Keepalived集群中同时存在MASTER和BACKUP节点,且MASTER节点的优先级比BACKUP节点高, 当MASTER节点故障时,在BACKUP节点中选举出优先级最高的节点作为新的MASTER继续提供服务并抢占VIP, 但是当原来的MASTER恢复后,会将VIP抢回。
非抢占模式:即在一个Keepalived集群中只存在BACKUP节点,选举出优先级最高的成为MASTER提供服务,当作为MASTER节点故的服务器障时,在其他BACKUP节点中选举出优先级最高的节点作为新的MASTER继续提供服务并抢占VIP,但是在原来作为MASTER节点的服务器恢复后,不会抢回VIP,而是作为一个BACKUP节点加入到集群中。可以通过两种方式设置非抢占模式,第一种即在优先级高的节点的配置文件中添加参数:nopreempt;第二种则是将所有BACKUP节点的优先级设置为相同的值。 了解了抢占与非抢占模式的区别,在Keepalived的运行中,还有一种被称为“脑裂”的问题,它是由于配置不当或MASTER/BACKUP节点之间的检测出现异常,导致VIP同时在MASTER节点与BACKUP节点出现引起的,会导致出现资源争抢、同时读写、数据损坏等问题。 Keepalived+LVS的集群主要分为两部分:后端的真实服务器(Real Server)和前端的负载调度节点(Load Balancer)。演示所需的服务器信息,如表9-5所示。
HOSTNAME | IP ADDRESS | ROLES |
keepalived-backup1 | VIP: 192.168.122.200, DIP: 192.168.122.128 | Keepalived,ipvsadm |
keepalived-backup2 | VIP: 192.168.122.200, RIP: 192.168.122.204 | Keepalived,ipvsadm |
keepalived-nginx1 | VIP: 192.168.122.200, RIP: 192.168.122.205 | Nginx |
keepalived-nginx2 | VIP: 192.168.122.200, RIP: 192.168.122.217 | Nginx |
以上服务器对应的架构图,如图9-28所示。
1.配置后端真实服务器 对Nginx1服务器配置如下: 1)登录keepalived-nginx1,安装Nginx服务并进行简单配置(使用默认站点即可),方便演示过程中查看具体的效果。需要执行的命令如下。
[root@keepalived-nginx1 ~]# yum install -y nginx
[root@keepalived-nginx1 ~]# systemctl enable nginx.service
[root@keepalived-nginx1 ~]# systemctl start nginx.service
[root@keepalived-nginx1 ~]# firewall-cmd --add-port=80/tcp
[root@keepalived-nginx1 ~]# echo "keepalived-nginx1 192.168.122.205" > /usr/share/nginx/html/index.html
安装并配置完成后,在浏览器中访问,若出现如图9-29所示的内容,则说明Nginx服务已安装成功并能正常提供服务。
2)登录keepalived-nginx1,由于涉及到LVS,因此还需要配置虚拟IP地址及路由规则、抑制ARP设置等,命令如下所示(具体的演示步骤,可以参考前面相关小节)。
[root@keepalived-nginx1 ~]# ifconfig lo:0 192.168.122.200 broadcast 192.168.122.200 netmask 255.255.255.255 up
[root@keepalived-nginx1 ~]# route add -host 192.168.122.200 dev lo:0
[root@keepalived-nginx1 ~]# echo "1" > /proc/sys/net/ip.>v4/conf/lo/arp_ignore
[root@keepalived-nginx1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@keepalived-nginx1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@keepalived-nginx1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
3)配置永久生效的防火墙规则,允许Nginx服务持续对外提供服务。命令如下所示。
[root@keepalived-nginx1 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@keepalived-nginx1 ~]# firewall-cmd --reload
若能通过“firewall-cmd --list-all”查看到如图9-30所示的内容,则说明防火墙规则已生效。
4)登录keepalived-nginx2,安装Nginx服务并做简单配置(使用默认站点即可),方便演示过程中查看具体的效果。需要执行的命令如下。
[root@keepalived-nginx2 ~]# yum install -y nginx
[root@keepalived-nginx2 ~]# systemctl enable nginx.service
[root@keepalived-nginx2 ~]# systemctl start nginx.service
[root@keepalived-nginx2 ~]# firewall-cmd --add-port=80/tcp
[root@keepalived-nginx2 ~]# echo "keepalived-nginx2 192.168.122.217" > /usr/share/nginx/html/index.html
安装并配置完成后,在浏览器中访问,若出现如图9-31所示的内容,则说明Nginx服务已安装成功并能正常提供服务。
5)登录keepalived-nginx2,由于涉及到LVS,因此还需要配置虚拟IP地址及路由规则、抑制ARP设置等,命令如下所示(具体的演示步骤,可以参考前面相关小节)。
[root@keepalived-nginx2 ~]# ifconfig lo:0 192.168.122.200 broadcast 192.168.122.200 netmask 255.255.255.255 up
[root@keepalived-nginx2 ~]# route add -host 192.168.122.200 dev lo:0
[root@keepalived-nginx2 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@keepalived-nginx2 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@keepalived-nginx2 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@keepalived-nginx2 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
若能通过“firewall-cmd --list-all”查看到如图9-32所示的内容,则说明防火墙规则已生效。
6)配置永久生效的防火墙规则,允许Nginx服务持续对外提供服务。命令如下所示。
[root@keepalived-nginx2 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@keepalived-nginx2 ~]# firewall-cmd --reload
若能通过“firewall-cmd --list-all”查看到如图9-32所示的内容,则说明防火墙规则已生效。
1)登录keepalived-backup1,分别安装keepalived和ipvsadm。命令如下。
[root@keepalived-backup1 ~]# yum install -y keepalived ipvsadm
[root@keepalived-backup1 ~]# systemctl enable keepalived.service
[root@keepalived-backup1 ~]# systemctl start keepalived.service
若通过“keepalived -v”与“ipvsadm -L -n”命令可查看到如图9-33所示的内容,则说明安装成功(此时由于未修改keepalived的配置文件,ipvsadm显示的信息为默认配置的信息)
2)登录keepalived-backup1,先ifconfig查看网卡名称:
修改配置文件:/etc/keepalived/keepalived.conf,将其中的内容修改为如下所示的内容(建议根据实际情况进行修改)。
! Configuration File for keepalivedglobal_defs {notification_email {notification_emal@tang.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 100nopreemp
advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.122.200}
}
virtual_server 192.168.122.200 80 {delay_loop 1lb_algo rrlb_kind DRpersistence_timeout 0protocol TCPreal_server 192.168.122.205 80 {weight 1HTTP_GET {url {path /}connect_timeout 3nb_get_retry 3delay_before_retry 3}}
real_server 192.168.122.217 80 {weight 1HTTP_GET {url {path /}connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}
3)登录keepalived-backup1,配置永久生效的防火墙规则,允许各节点间通过VRRP协议通信,以实现Keepalived各节点之间通信及允许其他主机可以通过该服务器的80端口访问后端Nginx服务,命令如下所示。
[root@keepalived-backup1 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
[root@keepalived-backup1 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
[root@keepalived-backup1 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@keepalived-backup1 ~]# firewall-cmd --reload
此时,若通过“firewall-cmd --list-all”命令,只能是看到关于80端口的信息,若需要查看通过“--direct”参数添加的规则,则需要使用“firewall-cmd --direct --get-all-rules”命令。如图9-34所示。
4)登录keepalived-backup1,重启keepalived服务即可。
[root@keepalived-backup1 ~]# systemctl restart keepalived.service
重启成后,再次使用“ipvsadm -L -n”命令,可以查看到其中的信息已经发生了变更,如图9-35所示。
5)登录keepalived-backup2,分别安装keepalived和ipvsadm。命令如下。
[root@keepalived-backup2 ~]# yum install -y keepalived ipvsadm
[root@keepalived-backup2 ~]# systemctl enable keepalived.service
[root@keepalived-backup2 ~]# systemctl start keepalived.service
若通过“keepalived -v”与“ipvsadm -L -n”命令,若可以查看到如图9-33所示同样的内容,则说明安装成功(此时由于未修改keepalived的配置文件,ipvsadm显示的信息为默认配置的信息)。
6)登录keepalived-backup2,修改配置文件:/etc/keepalived/keepalived.conf。文件内容与keepalived-backup1节点的配置文件一致即可(建议根据实际情况进行修改),此处不再赘述,详细内容可参考第2步骤。 7)登录keepalived-backup2,配置永久生效的防火墙规则,允许各节点间通过VRRP协议通信,以实现Keepalived各节点之间通信及允许其他主机可以通过该服务器的80端口访问后端Nginx服务。命令如下所示。
[root@keepalived-backup2 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
[root@keepalived-backup2 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
[root@keepalived-backup2 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@keepalived-backup2 ~]# firewall-cmd --reload
此时,若通过“firewall-cmd --list-all”命令,只能是看到关于80端口的信息,若需要查看通过“--direct”参数添加的规则,则需要使用“firewall-cmd --direct --get-all-rules”命令。同样的可以查看到如图9-34所示的内容。
8)登录keepalived-backup2,重启keepalived服务即可。
[root@keepalived-backup2 ~]# systemctl restart keepalived.service
重启成后,再次使用“ipvsadm -L -n”命令,可以查看到其中的信息已经发生了变更,同样的可以查看到如图9-35所示的内容。 至此,Keepalived+LVS的集群就配置完成了。通过浏览器访问虚拟IP地址,若刷新页面(必要时请使用强制刷新,消除缓存影响)能查看到如图9-36所示的内容,则说明配置已经生效。
也可以使用“curl”命令在命令行进行访问,若出现如图9-37所示的内容,则同样表示配置已经生效。