关注上方 浩道Linux ,回复 资料 ,即可获取海量 L inux 、 Python 、 网络通信、网络安全 等学习资料!
前言
大家好,这里是 浩道Linux ,主要给大家分享 L inux 、 P ython 、 网络通信、网络安全等 相关的IT知识平台。
最近浩道的一位读者咨询我Keepalived+Mysql实现高可用相关的配置,他所用的环境是在Docker环境下进行的。而我为了查找他相关问题,自己也在虚拟机中搭建了一套环境进行验证。原理都差不多,我这里主要是跟大家捋一捋Keepalived这个知识点相关的一些概念总结,以及Keepalived配置过程中存在的一些坑。全文较长,但是实用性很高,大家感兴趣,可以收藏,以便随时查看学习。
通过本文,大家将学习到以下相关知识内容:
1、什么是高可用服务
2、Keepalived简介
3、Keepalived常见应用场景
4、 Keepalived高可用故障切换原理介绍
5、 VRRP协议介绍
6、配置实现Keepalived监控Mysql
7、 Keepalived配置文件介绍
8、
Keepalived常见问题列举
一、什么是高可用服务
高可用服务 是指服务器系统保持正常工作的能力和稳定性,即无论在何种条件下,服务器都能够始终保持正常运行,并且不会中断或崩溃。高可用服务的目标是保证业务的连续性,提高用户体验,以及提升企业形象。
高可用服务的实现需要硬件和软件两个方面的支持。硬件方面,可以通过冗余设计来避免单点故障,例如双电源、双网卡、多RAID阵列等技术。软件方面,可以使用负载均衡、热备份、冷备份等技术。
此外,数据同步也是高可用服务的关键技术之一,通过将不同服务器中的数据实时同步到其他服务器上,可以保证数据的一致性和完整性。系统监控也是保证高可用服务的重要手段,可以实时监测系统的运行状态和资源使用情况,及时发现异常情况并采取相应的措施。
为了提高服务器的稳定性和可靠性,可以采取一些措施,例如对硬件进行冗余配置、合理规划服务架构、及时备份和还原服务器数据等。
二、Keepalived简介
Keepalived(保持在线) 诞生的开始是为LVS负载均衡软件设计的,用来管理并且监控LVS集群系统中各个服务节点的状态。随着后面新增加入可以实现高可用的VRRP功能。让它除了能够管理LVS负载均衡外,还可以作为其它服务(如Haproxy,Nginx,Mysql等)的高可用解决方案软件。
Keepalived在基于VRRP协议实现的LVS服务高可用方案中,它通过检测服务器的状态来避免单点故障的发生。一个LVS服务可能会有2台服务器运行Keepalived,一台为主机服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剥除, 同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。
(一)Keepalived进程
Keepalived启动后会有三个进程,分别为:
1、父进程: 内存管理,对其它子进程管理
2、 子进程: VRRP子进程,实现vrrp协议
3、子进程: healthchecker子进程,实现健康检查,检测服务状态;如果服务不可用,则通知vrrp子进程,发降级通告。
两个子进程都被系统WatchDog看管,两个子进程各自负责自己的事,healthchecker子进程负责检查各自服务器的健康程度,例如HTTP,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
(二)Keepalived模块化设计
Keepalived采用模块化设计,主要包括下面五个模块:
1、core:核心模块,负责主进程的启动和维护,全局配置文件的加载解析等;
2、check:检查模块,负责healthchecker;
3、vrrp:vrrp模块,负责实现vrrp协议;
4、libipfwc:iptables库,在LVS会用到;
5、libipvs:配置LVS会用到;
三、 Keepalived常见应用场景
(一)Web服务器高可用:
Keepalived可以与Web服务器软件如Nginx或HAProxy配合使用,以实现Web服务的高可用性。当Web服务器出现故障时,Keepalived可以自动将请求切换到备用服务器,从而保证服务的连续性和稳定性。
(二)数据库服务高可用: 数据库服务是非常重要的后端服务之一,Keepalived可以与数据库软件如MySQL配合使用,实现数据库服务的高可用性。当主数据库出现故障时,Keepalived可以自动将请求切换到备用数据库,保证服务的连续性和稳定性。
(三)邮件服务器高可用: 邮件服务器是常见的后端服务之一,Keepalived可以与邮件服务器软件如Postfix或Sendmail配合使用,实现邮件服务的高可用性。当邮件服务器出现故障时,Keepalived可以自动将请求切换到备用服务器,保证服务的连续性和稳定性。
(四)文件服务器高可用: 文件服务器是常见的后端服务之一,Keepalived可以与文件服务器软件如NFS配合使用,实现文件服务的高可用性。当文件服务器出现故障时,Keepalived可以自动将请求切换到备用服务器,保证服务的连续性和稳定性。
(五)云服务平台的高可用:
在云服务平台中,Keepalived可以与云服务提供商的负载均衡器或其他高可用解决方案配合使用,实现云服务的高可用性。这样可以保证云服务的连续性和稳定性,提高用户的体验和满意度。
总之,Keepalived服务常见的应用场景主要涉及Web服务器、数据库、邮件服务器、文件服务器以及云服务平台等。这些场景都可以通过Keepalived来实现服务的高可用性和负载均衡,从而保证服务的连续性和稳定性。
四、 Keepalived高可用故障切换原理介绍
Keepalived高可用服务之间的故障切换原理是基于VRRP实现的,Keepalived服务正常时,主Master节点会不断地向备节点发送心跳报文(组播形式),以此来告诉备节点自己还存活着。当主Master节点发生故障时,就无法发送心跳报文了,此时备节点也无法继续检测到来自主Master节点的心跳报文,于是调用自身来接管程序,接管主Master节点的IP资源及相关服务,以此来保证业务的连续性,一般接管速度可以小于1秒钟。而当主Master节点恢复服务时,备节点又将会释放主节点故障时自身接管的IP资源及相关服务,恢复到原来的备用节点模式。
五、 VRRP协议介绍
VRRP 即 Virtual Router Redundancy Protoco l 的缩写,中文名为 虚拟路由器冗余协议。
(一)VRRP出现背景
现实的局域网中,通常采用配置一个默认网关的形式让用户访问外部网络,但是如果默认网关设备发生故障,那么所有用户终端将无法访问外部网络,即出现单点故障了。
此时工程师们就想到了通过部署多个网关的方式来解决单点故障,但是多个网关之间是会存在冲突问题。因此就出现了VRRP协议。
VRRP的出现既能实现网关的备份,又能解决多个网关之间互相冲突的问题,从而提升网络的整体可靠性。
总之VRRP出现的目的就是为解决静态路由单点故障问题的痛点,它能够保证当个别节点路由器宕机时,整个网络还可以不间断提供服务运行。
(二)VRRP工作原理
1、VRRP组网架构如下图所示:
(1)如上图,VRRP为每一个路由器组抽象出一台虚拟路由器(Virtual Router),这台虚拟路由器并非真实存在的物理设备,而是由VRRP虚拟出来的逻辑设备。如图Router A和Router B组成一个虚拟路由器。一个VRRP组只会产生一台虚拟路由器,虚拟路由器拥有自己的IP地址以及MAC地址;
(2)虚拟路由器使用虚拟IP与外网交互通信的(如图中VIP),虚拟MAC与内网交互通信(如图中VMAC);
(3)所有设备开始都是initialize状态,当接口UP后,如果优先级(0-255)为255,则直接进入master状态;如果小于255,则先进入backup状态,待MasterDownInterval定时器超时后才进入master状态。
获得VIP的路由器为主路由器(Master状态),其他路由器为备份路由器(Backup状态);
(4)主路由器每隔 advertisement_intervl 秒(对应图中配置项 advert_int),向组内其他路由器发送通告消息(即心跳),告知本路由器的优先级等信息;
(5)组播的方式发送心跳,组播地址为224.0.0.18;
(6)只有主路由器会响应针对虚拟IP地址的ARP请求,组内其他路由器会丢弃ARP请求。
(三)VRRP协议报文
1、VRRP报文结构如下:
2、VRRP协议字段信息
上述标红的几个字段是关键字段,都会出现在 keepalive 的配置文件中。
(1)Version : VRRP协议版本号,RFC3768定义了版本2。
(2)Type: 该字段指明了VRRP报文的类型,RFC3768只定义了一种VRRP报文,那就是VRRP通告报文,所以该字段总是置为1,若收到的VRRP通告报文拥有非1的类型值,那么会被丢弃。
(3)Virtual Rtr ID: 也就是我们上面介绍过的VRID,一个VRID唯一地标识了一个虚拟路由器,取值范围是[1,255],所以一台路由器的接口可以同时运行最多255个VRRP实例,此字段没有缺省值,必须人为设定。
(4)Priority: 优先级,在一个虚拟路由器中用来选取Master路由器和Backup路由器,值越大表明优先级越高,此字段共有8个bit,取值范围[1,254],若没有人为指定,缺省值是100。其中,VRRP协议会将IP地址拥有者路由器的该字段永远设置为255,若人为指定为其它值,也不会影响VRRP协议的默认行为,即IP地址拥有者路由器的该字段总是255。另外,此字段设置为0会出现在下面这种情形中,当Master路由器出现故障后,它会立刻发送一个Priority置0的VRRP通告报文,当Backup路由器收到此通告报文后,会等待Skew time时间,然后将自己切换为Master路由器,其中Skew time=(256-Backup路由器的优先级)/256,单位为秒,例如若Backup路由器的优先级为100,那么Skew time=156/256=0.609秒,对于主路由器来说,Skew time并没有实际意义,虽然cisco的路由器也会计算并显示出来。
(5)Count IP Addrs(Addr Count) :VRRP通告报文中包含的IP地址数量,这个字段其实就是为一个VRRP虚拟路由器所分配的IP地址的数量。
(6)Auth Type: 认证类型字段,是一个8位的无符号整数,一个虚拟路由器只能使用一种认证类型,如果Backup路由器收到的通告报文中认证类型字段是未知的或和本地配置的不匹配,那么它将丢弃该数据包。目前支持3种认证方式:无认证,简单字符,和MD5认证。
(7)Adver Int: 此字段规定了Mater路由器向外发送VRRP通告报文的时间间隔,以秒为单位,取值范围是[1,255],若没有人工配置,缺省为1秒。
(8)Checksum: 整个VRRP报文的校验和,计算过程中,将Checksum字段置为0,计算完成后将结果填入此字段。若希望进一步了解Checksum的计算,可以查看RFC1071(CKSM)。
(9)IP Address:
此字段存放VRRP虚拟路由器的虚拟IP地址,配置了几个就封装几个。
(10)Authentication Data: RFC3768中规定,此字段只是为了向RFC2338兼容,在实际的封装时,全置为0.,接收方也会忽略此字段。
3、虚拟MAC地址
组成方式是00-00-5E-00-01-{VRID},前三个字节00-00-5E是IANA组织分配的,接下来的两个字节00-01是为VRRP协议指定的,最后的VRID是虚拟路由器标识,取值范围[1,255]。
4、虚拟路由器标识VRID
虚拟路由器标识,在同一个VRRP组内的路由器必须有相同的VRID。
六、 配置实现Keepalived监控Mysql
以下实验主要是想通过Keepalived来监控Mysql服务,即通过监控Mysql端口或进程,如果监测到端口或进程不存在了,即认为Mysql服务已经挂死,此时通过关闭Keepalived服务,实现Keepalived切换到备服务器,继续提供高可用的Mysql服务。当然这里仅仅是实现简单的切换流程,具体细节还是靠大家自己去实验摸索。
其中这里通过在Keepalived配置文件中定义一个shell脚本用来实现检测如果 Mysql服务已经挂死,此时通过关闭Keepalived服务,实现Keepalived切换到备服务器,继续提供高可用的Mysql服务。
该脚本路径及内容如下所示:
[root@haodaolinux01 ~]# cat /opt/check_mysql.sh
#!/bin/bash
/database/mysql/bin/mysql -uroot -p123456 -e "show status" &>/dev/null
if [ $? -ne 0 ] ;then
systemctl stop keepalived
fi
当然,Mysql实际安装路径得结合你们自己实验的环境来对应修改脚本内容。以上仅是参考。
(一)实验组网环境如下所示:
为了实验顺利进行,以上 两台Centos7服务器均关闭SELINUX及防火墙后进行
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
(二)安装Keepalived服务
以上两台服务器均安装上 Kee pal ived服务
yum install -y keepalived
(三)修改Keepalived配置文件
执行步骤三完成keepalived安装,默认情况下配置文件路径为 /etc/keepalived/keepalived.conf
养成好习惯,修改前先备份配置文件。大家对配置文件不熟悉的话,可以先看后边章节内容再回过头来修改配置文件。
1、 haodaolinux01主机上修改配置文件
主要修改配置如下:
global_defs{
router_idkeepalived-01
script_userroot
enable_script_security
}
vrrp_scriptcheck_mysql {
script"/opt/check_mysql.sh"
interval2
}
vrrp_instancehaodaolinux_01 {
stateMASTER
interfaceens33
virtual_router_id51
priority100
advert_int1
authentication{
auth_typePASS
auth_pass1111
}
track_script{
check_mysql
}
virtual_ipaddress{
192.168.20.211/24dev ens33 label ens33:1
}
}
2、haodaolinux02主机上修改配置文件
主要修改配置如下:
global_defs {
router_id keepalived-02
script_user root
enable_script_security
}
vrrp_script check_mysql {
script "/opt/check_mysql.sh"
interval 2
}
vrrp_instance haodaolinux_02 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.20.211/24 dev ens33 label ens33:1
}
}
(四)启动Keepalived服务
在haodaolinux01和haodaolinux02主机上执行以下命令
systemctl start keepalived
(五)抓包测试验证VRRP功能
我这里的虚拟机是采用NAT方式连接,所以可以在宿主机上进行抓包,可以看到主为192.168.20.231的主机通过组播宣告自己还存活,通过报文可以看到如配置文件中那样携带对应信息。
此时haodaolinux01是主节点,查看VIP是在haodaolinux01上,通过查看网卡接口信息可以看到,如下图所示:
(六)模拟故障发生
这里通过在haodaolinux01手动停止mysql服务,触发脚本停止keepalived服务,抓包验证haodaolinux02是否会接管,自动切过去
通过抓包看到,随着haodaolinux01上的Mysql服务挂掉,一秒不到时间完成Keepalived切换。此时已由haodaolinux02发出组播报文。
haodaolinux02上查看网络接口,VIP也已经漂移过来。
(七)模拟主节点故障恢复
现在在haodaolinux01上手动重新启动Mysql及Keepalived,通过抓包查看到报文,haodaolinux01会发出ARP广播包刷新ARP表,通知后端节点VIP已经漂移回haodaolinux01主机上,查看haodaolinux01网络接口也验证这个结论。
七、 Keepalived配置文件介绍
执行yum命令完成keepalived服务的安装,默认情况下配置文件路径为 /etc/keepalived/keepalived.conf
Keepalived配置文件可以分为三个部分内容:
全局配置(全局定义和静态路由配置)
VRRP配置(VRRP同步组合、VRRP实例和VRRP脚本)
LVS配置
以下针对
Keepalived配置文件相关部分内容做一个说明。
(一)全局配置(全局定义和静态路由配置)
该配置主要用来设置Keepalived的故障通知机制和Router ID标识的。
如下面的配置内容所示:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
1、第一行是注释部分,!开头和#开头一样的效果,表示注释;
2、第2行是空行;
3、第4到第8行是用来定义服务故障时报警的邮箱地址。即当服务发生切换或节点有故障时,发邮件进行报警。属于可选配置项, notification_email指定在keepalived服务发生事件时,需要发送的Email地址,可以有多个,每一行定义一个地址;
4、第9行是指定发送邮件的发送人,即发件人地址,也是可选的配置项;
5、第10行smtp_server用于指定发送邮件的smtp服务器,如果本机服务器开启了sendmail或postfix服务,就可以使用默认的配置实现邮件发送,这个也是属于可选配置项;
6、第11行smtp_connect_timeout表示连接smtp的超时时间,也是属于可选配置项;
7、第12行是keepalived服务器的路由标识(router_id),在一个局域网内,这个router_id应该是唯一的;
8、第13行是 用于跳过检查收到的VRRP通告中的所有地址。默认情况下,检查收到的VRRP通告中的所有地址可能会比较耗时,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查,以跳过检查,从而提高效率。
9、第14行表示该参数的目的是为了增加VRRP的安全性。在某些情况下,可能希望限制VRRP报文的传播范围,以防止未经授权的设备或网络监听这些报文。
10、第15行表示 当 vrrp_garp_interval 设置为 0 时,这意味着 GARP 请求不会被发送。这可能是出于安全考虑或特定的部署需求,例如在某些情况下,你可能不希望 VRRP 组中的设备之间频繁地交换 GARP 请求。
11、第16行表示当 vrrp_gna_interval 设置为 0 时,这意味着 GNA 请求不会被发送。这可能是出于安全考虑或特定的部署需求,例如在某些情况下,你可能不希望 VRRP 组中的设备之间频繁地交换 GNA 请求。
(二)
VRRP配置(VRRP同步组合、VRRP实例和VRRP脚本)
如下面的配置内容所示:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
1、第一行表示定义一个vrrp_instance 实例,对应名字为VI_1,每个 VRRP 实例可以看作是 Keepalived 中的一个业务,用于实现路由器的高可用性。在Keepalived服务配置中,vrrp_instance 实例可以有多个存在。但是注意,存在于主节点中的vrrp_instance 实例,在备节点中也要对应存在,这样才能在发生故障时实现切换接管;
2、第16行表示当前vrrp_instance实例的的角色状态,并且当前角色配置为MASTER,这里的状态配置只能选择MASTER和BACKUP两种,字符写成大写状态;
3、第3行表示定义对外提供服务的网络接口,如配置eth0,可以根据实际配置对应网络接口;
4、第4行virtual_router_id表示定义虚拟路由ID标识,这个标识最好定义成数字,并且在一个keepalived.conf配置文件中要唯一,同时MASTER和BACKUP角色中配置相同的实例时,virtual_router_id要求又是唯一的,以免出现脑裂问题;
5、第5行priority表示优先级,其后面跟一个数字,数字越大,表示该实例的优先级就越高。在同一个vrrp_instance实例中,MASTER的优先级配置要高于BACKUP;
6、第6行advert_int表示同步通知间隔,MASTER和BACKUP之间通信检查的时间间隔,单位为秒,默认配置1秒;
7、第7行大括号中authentication 部分用于设置 VRRP 实例的认证类型和密码。这是为了确保同一 VRRP 实例的主节点和备节点之间能够进行正确的通信和验证。,包含auth_type和auth_pass,分别表示认证类型及认证密码,认证类型通常有PASS,AH两种,推荐用PASS,密码采用明文方式;
8、第11行virtual_ipaddress大括号中定义虚拟地址,可以定义多个虚拟地址,每一个地址占一行,配置时最好指定子网掩码、虚拟地址绑定的网络接口,不然子网掩码就是默认32位,同时绑定的网络接口也是跟前面的interface参数配置保持一致。
(三)
LVS配置
在Keepalived的配置文件中,LVS管理部分的配置主要用来实现负载均衡和服务的高可用性。
具体来说,Keepalived可以用来监控LVS调度器的状态,并在发生故障时自动切换到备用调度器,以保证服务的高可用性。同时,Keepalived还可以管理LVS负载均衡软件,通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止等功能,使LVS的应用更加简单方便。此外,Keepalived还具有对LVS下面节点进行健康检查的功能,能够自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响。因此,Keepalived配置文件中LVS管理部分的配置主要用来实现负载均衡和服务的高可用性。
本文实验没有涉及到该部分内容,这里不做说明了。
八、 Keepalived常见问题列举
以下罗列一些在Keepalived使用过程中常见的一些问题,希望大家引起重视,能够避坑!!!
(一)脑裂问题
1、什么是脑裂问题
Keepalived使用过程中的脑裂问题是指在一个高可用(HA)集群中,当关联着的两个节点互相之间断开通信时,本来为一个整体的集群系统分裂为两个独立的节点。这时两个节点会争抢共享资源,结果会导致系统混乱和数据损坏。脑裂问题常见于有状态服务(如MySQL)的HA集群,必须要严格防止脑裂的发生。
2、出现脑裂问题的原因有哪些
(1)心跳线故障,导致最终高可用服务器之间无法正常通信了;
(2)心跳网卡地址配置不正确,冲突等问题;
(3)心跳线之间的组网设备发生故障,如交换机坏了;
(4)防火墙配置策略问题等导致设备间的心跳通信不正常了;
(二)主备切换问题
在正常情况下,只有主机拥有VIP,备机不拥有VIP。但是出现脑裂的时候,备机上会出现VIP,从而出现两个结点同时拥有VIP的情况。
(三)防火墙问题
防火墙可能会阻断主备机器之间的通信,导致备机无法接收到主机的VRRP协议心跳包,从而出现脑裂问题。
(四)配置文件问题
Keepalived的配置文件中如果存在错误或不合理的配置,可能会导致Keepalived服务无法正常启动或运行,从而影响LVS集群的正常工作。
(五)依赖服务问题
Keepalived作为LVS的高可用性解决方案软件,需要依赖其他服务(例如:Nginx、Haproxy、MySQL等)的正常运行。如果这些服务出现问题,可能会导致Keepalived服务无法正常工作。
(六)针对以上问题解决方法
为了解决这些问题,需要仔细检查Keepalived的配置文件,确保配置文件中的各项参数设置正确,同时需要检查防火墙设置,确保主备机器之间的通信不会被阻断。此外,还需要对Keepalived服务进行监控和测试,确保其能够正常地提供高可用性和负载均衡功能。
九、总结
Keepalived本身使用很广泛,以上实验仅仅带大家入门,工作中具体使用,还需要大家自己去消化才能转化为自己的知识技能。
更多精彩
关注公众号 「 浩道Linux 」
浩道Linux ,专注于 Linux系统 的相关知识、 网络通信 、 网络安全 、 Python相关 知识以及涵盖IT行业相关技能的学习, 理论与实战结合,真正让你在学习工作中真正去用到所学。同时也会分享一些面试经验,助你找到高薪offer,让我们一起去学习,一起去进步,一起去涨薪!期待您的加入~~~ 关注回复「资料」可 免费获取学习资料 (含有电子书籍、视频等)。
喜欢的话,记得 点「赞」 和 「在看」 哦