目录
引言
基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的Keepalive机制是为了解决网络中静态默认网关单点故障的问题。在传统的网络架构中,如果作为默认网关的路由器出现故障,会导致整个子网失去对外通信的能力。而VRRP则通过引入主备模式来提供高可用性。
一、VRRP协议
(一)VRRP概述
1.诞生背景
终端设备访问不同网段设备的时候,必须经过网关。如果只有1个网关,那么网络就存在 单点故障,所以为了避免单点故障导致网络的通信中断, 所以,我们建议在一个网段中,可以同时添加多个网关,从而增加网关的冗余性和网络的可靠性; 但是,多网关的部署会带来其他的问题:
1.网关IP地址冲突
2.终端用户需要频繁的切换网关IP地址
针对上述两个问题,提出了:
在同网段的多个网关之间运行VRRP,形成1个虚拟网关,终端用户都配置和使用虚拟网关就可以了。
其作用为
在同一个网段的多个真实网关之间配置和运用,形成层一个虚拟路由器, 从而实现网关的冗余和负载均衡
2.基本理论
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种网络层的容错协议。它的主要目的是在多个物理路由器之间提供一个虚拟路由器服务,以实现默认网关的高可用性。在传统的网络环境中,如果静态配置的默认网关出现故障,则会导致网络中的所有主机失去对外通信的能力。VRRP通过将多台路由器联合起来形成一个虚拟路由器,并选举出一台主路由器来处理所有的流量转发,而其他的备份路由器则随时待命,一旦主路由器出现故障,备份路由器能够迅速接替工作,从而确保网络连通性的持续性和可靠性。
(二)VRRP工作原理
(1) 虚拟路由器中的路由器根据优先级(priority)选举出Master。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务;
(2) Master路由器周期性发送VRRP报文(心跳线),以公布其配置信息(优先级等)和工作状况;
(3) 如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master;
(4) 虚拟路由器状态切换时,Master路由器由一台设备切换为另外一台设备,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息。网络中的主机感知不到Master路由器已经切换为另外一台设备。
(5) Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式(抢占方式和非抢占方式以及延时抢占)决定是否重新选举Master。
(三)VRRP相关术语
虚拟路由器:Virtual Router 不是真实存在 ,虚构出来的
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
VIP:Virtual IP 192.168.91.100 路由1 路由2
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
物理路由器:
master:主设备
backup:备用设备
priority:优先级
二、keepalive基本理论
Keepalive机制是网络通信中一种重要的保持连接健康状态的方法,有助于优化网络资源使用,提高服务稳定性和响应速度
常见的keepalive版本
VRRP Keepalive:虚拟路由冗余协议(VRRP)中的心跳检测机制,用于选举和维护路由器的主备状态,确保网络高可用性。
**TCP Keepalive:**是一种内置于TCP协议中的功能,用于检测并维持连接的活跃状态。当两个端点间存在一个已建立的TCP连接,但在一段时间内没有数据传输时,启用Keepalive的一方会周期性地发送特殊的探测报文(通常是一个空TCP段)给对方。如果接收方没有回应足够数量的Keepalive探测报文,发送方就会认为连接已经断开,并关闭该连接。
HTTP Keepalive:允许HTTP客户端与服务器之间复用同一TCP连接来发送多个请求和响应,以减少TCP连接建立和销毁带来的开销。
应用程序级Keepalive:许多应用程序和服务也有自己的Keepalive机制,比如MySQL数据库的连接保活、WebSocket的ping/pong消息等。
主要学习VRRP Keepalive
(一)基本性能
keepalive是专门为LVS与HA设计的一款健康检查软件
支持故障自动切换(Failover)
支持节点健康状态检查(Health Checking)判断 LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到backup 节点保证业务正常,当 master故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。
官方网站:Keepalived for Linux
(二)实现原理
实现原理与虚拟路由一致
1.首先根据优先级选出Master提供服务
2.Master默认每间隔1秒向Baskup发送一次VRRP报文,告知Baskup自己处于工作状态,并公布配置信息(优先级等)情况
- 如果Master路由器出现故障,Backup将根据优先级重新选举为新的Master
4.当原Master恢复工作时,将根据抢占模式(抢占方式和非抢占方式以及延时抢占)决定是否重新成为Master
(三)抢占模式
1.抢占式
主服务器宕机,过了一段时间修好了,直接把主权抢过来
2.非抢占式
主服务器宕机,过了一段时间修好了,原来的主就作为备了
3延迟抢占
主修好后,等待一定的时间后再次成为主
三、keepalive服务
keepalive服务可以使用yum安装、以及编译安装
本地yum源自带的版本比较旧
编译安装可以从官网下载较新的安装包进行安装
(一)安装keepalive
使用yum安装:yum install keepalived.x86_64 -y
默认的主配置文件有157行
(二)全局配置
首先看第一部分3-17行,为全局配置
cs
global_defs
#全局配置
notification_email
#定义当VRRP实例状态发生变化时,系统将通过电子邮件发送通知给指定的收件人列表。
acassen@firewall.loc, failover@firewall.loc, sysadmin@firewall.loc
#邮件通知的接收者。
notification_email_from Alexandre.Cassen@firewall.loc
#设置发送邮件通知时显示的发件人地址,这里是 Alexandre.Cassen@firewall.loc。
smtp_server 192.168.200.1
#指定SMTP服务器地址,本例中为 192.168.200.1,该服务器用于发送邮件通知。
smtp_connect_timeout 30
#设置SMTP服务器连接超时时间,单位为秒,这里为30秒。
router_id LVS_DEVEL
#为当前运行的Keepalived实例设置一个唯一的标识符,用在日志和其他网络通信中
vrrp_skip_check_adv_addr
#跳过对通告地址(advertised address)的检查。如果启用此选项,在某些情况下
#可以避免错误,比如通告地址未在任何接口上配置。
vrrp_strict
#启用严格模式,要求配置必须符合RFC文档的标准规范,否则Keepalived服务可能不会启动。
#建议关闭
vrrp_garp_interval 0
#设置发送GARP(即无请求的ARP响应)消息的时间间隔,默认值通常为1秒。设为0表示禁用GARP功能。
vrrp_gna_interval 0
#设置发送GNA(即IPv6下的无请求邻居通告)消息的时间间隔。设为0表示禁用GNA功能
(三)VRRP实例
第二部分:VRRP实例配置(19-34)
cs
vrrp_instance VI_1
'定义VRRP实例名称。'
state MASTER
'设置当前节点在VRRP组中的初始状态为MASTER。这意味着该节点将优先处理请求,
并拥有VIP(虚拟IP地址)的所有权'
'interface eth0'
'指定VRRP通告报文通过哪个网络接口发送,这里使用的是eth0接口。'
virtual_router_id 51
'每个VRRP实例需要一个唯一的标识符,这里用数字51表示。主备需要在同一个标识符内'
priority 100
'设置本节点在VRRP组中的优先级,数值越高代表优先级越高,优先级最高的节点将成为MASTER'
advert_int 1
'设置VRRP通告消息的时间间隔,单位为秒。此处设置为每秒发送一次心跳消息以确认其是否在线'
authentication:
auth_type PASS '设置认证类型为密码认证。'
auth_pass 1111 '设置用于身份验证的共享密码。'
virtual_ipaddress
'列出此VRRP实例要管理的一系列虚拟IP地址'
(四)服务器配置
第三部分为服务器配置(36-60)
cs
'虚拟服务器'
virtual_server 192.168.200.100 443
#定义了一个虚拟服务器,对外提供服务的地址为192.168.200.100,监听端口为443(即HTTPS服务)。
delay_loop 6
#健康检查间隔,每隔6秒对后端服务器执行一次健康检查。
lb_algo rr
#负载均衡算法采用轮询(Round Robin)策略。
lb_kind NAT
#负载均衡方式采用NAT,客户端与真实服务器之间的通信通过NAT进行转发。
#persistence_timeout 50
#会话保持超时时间,同一个客户端在50秒内发起的新请求都会被转发到同一台后端服务器上。
protocol TCP
#明确指出虚拟服务器处理的是TCP流量。
'真实服务器配置'
real_server 192.168.201.100 443
#定义一个真实服务器,其IP地址为192.168.201.100,同样监听443端口
weight 1
#权重值为1,表示该服务器在负载均衡中分配请求的相对权重。
SSL_GET
#使用SSL协议发送GET请求来进行健康检查。
url
#定义了两个需要检查的URL路径及其预期的HTTP响应摘要。一般不适用url,需要更改
connect_timeout 3 #设置连接到真实服务器的超时时间为3秒。
nb_get_retry 3 #如果首次请求未能得到正确的摘要,将重试3次。
delay_before_retry #每次重试前等待3秒。
四、实际操作
LVS + Keepalived 高可用群集
环境设备
|----------|----------------------------|
| LVS1 | 192.168.83.30 (MASTER) |
| LVS2 | 192.168.83.40 (BACKUP) |
| web1 | 192.168.83.50 |
| web2 | 192.168.83.60 |
| 客户端 | 192.168.83.100 |
| VIP | 192.168.83.200 |
(一)web服务器
首先配置web服务
1.下载安装web服务
yum install httpd -y
2.建立虚拟IP
3.调整内核参数
cs
net.ipv4.conf.all.arp_ignore 和 net.ipv4.conf.default.arp_ignore
'设置为1表示节点将更严格地处理ARP请求。在某些情况下,系统不会响应非本地IP地址的ARP请求
这有助于防止IP地址冲突,并且可以用于LVS DR模式下的Director节点,以避免对外直接响应ARP请求'
net.ipv4.conf.all.arp_announce 和 net.ipv4.conf.default.arp_announce
'设置为2表示节点在发送ARP应答时总是使用其主接口上的最具体的地址(即,优先级最高的源IP地址)
这同样对LVS DR模式很有用,确保Director节点在回应ARP请求时只使用VIP,而不是实际的物理接
口地址。'
调整完毕后开启web服务:systemctl start network
在站点目录下构建数据文件
两台web服务器同样操作
(二)LVS集群服务器
1.下载服务
yum install keepalived.x86_64 -y && yum install ipvsadm.x86_64 -y
先启动ipvsadm服务
ipvsadm-save >/etc/sysconfig/ipvsadm #生成配置信息文件
systemctl start ipvsadm.service #启动服务
2.配置文件
在配置文件之前,最好先进行备份
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
删除60行以下的内容
配置全局设置
配置VRRP热备实例
bash
vrrp_instance VI_1 {
'定义实例名称,默认即可,也可以自定义'
state MASTER
'设置为MASTER表示为主'
interface ens33
'指定心跳报文从ens33网卡发送'
virtual_router_id 51
'实例表示符,默认即可,BACKUP与其一致'
priority 100
'设置优先级,其值需要比BACKUP高'
advert_int 1
'每间隔一秒发送一次VRRP报文'
authentication {
auth_type PASS
auth_pass 123123
'定义密码认证方式,并设置密码,BACKUP需要与其一致'
}
virtual_ipaddress {
192.168.83.200
'设置集群VIP地址'
}
}
配置虚拟路由
cs
virtual_server 192.168.83.200 80 {
#定义对外提供服务的IP地址,提供服务为80端口,即http服务
delay_loop 6
#每6秒对后端服务器进行健康检查
lb_algo rr
#设置调度算法为rr(轮询)
lb_kind DR
#负载均衡方式采用DR
persistence_timeout 0
#长连接时间为0秒,为体现操作真实性,真实环境建议调高,默认为50秒
protocol TCP
#虚拟服务器监听TCP协议的流量
real_server 192.168.83.50 80 {
#定义真实服务器,其IP地址为192.168.83.50,监听80端口
weight 1
#轮询权重为1
TCP_CHECK {
#使用TCP_CHECK模块进行真实服务器的健康状态检测
connect_port 80
#通过TCP协议连接到真实服务器的80端口以确认其是否可用
connect_timeout 3
#访问超时时间,超过3秒认为该服务器宕机
nb_get_retry 3
#重复访问3次
delay_before_retry 3
#每次访问间隔3秒
}
}
real_server 192.168.83.60 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
#原理同上
}
}
}
配置完毕后启动服务:systemctl start keepalived.service
查看规则情况
另一台服务器与其基本一致
需要修改12,19,22行信息,其余配置与主服务一致
配置完毕后启动服务
ipvsadm-save >/etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
systemctl start keepalived.service
使用客户端访问进行测试
五、keepalive管理
(一)主从更替
当MASTER关闭后,优先级最高BACKUP会立马变成MASTER继续工作
当主恢复后,立马会变为MASTER,即为抢占模式(默认)
可以通过添加nopreempt参数,设置为非抢占模式
在虚拟服务器段配置
也可以设置延迟抢占,同样在虚拟服务器段配置
(二)单播组播
在Keepalived中,VRRP实例通常通过组播方式来发送心跳和通告消息以实现高可用性和故障切换
组播地址范围为224.0.0.0-239.255.255.255
默认的组播地址为224.0.0.18。如果有多组keepalive服务器,所有的默认心跳线发送路径都为该地址,容易造成混乱,所以需要修改
通过添加vrrp_mcast_group4来指定特定的组播地址,或者改为单播
注意:如果指定组播地址,所有的服务器都要改
1.指定组播地址
当前192.168.83.30为主。可以通过tcpdump抓包来进行查看
可以看到,MASTER发的VRRP包是发往指定的组播地址224.83.83.83
2.设置单播
cs
'MASTER服务器'
unicast_src_ip 192.168.83.30
#该指令指定当前节点作为VRRP通告和心跳消息的发送源地址。
#这意味着所有从这个节点发出的VRRP报文都将使用 192.168.83.30 这个IP地址作为源地址
unicast_peer {
192.168.83.40
}
#这部分定义了单播对等体列表,即指定接收VRRP通告和心跳消息的目标地址。
#在这里,仅指定了一个对等体地址 192.168.83.40,表示此节点将直接向 192.168.83.40
#发送VRRP通信信息,而不是通过组播方式广播到整个网络。
'BACKUP服务器'
#同上
同样抓包查看验证一下
(三)日志功能
因为keepalive服务较为重要,其日志没有独立的文件存在,默认存放在**/var/log/messages**文件中
为便于分析,需要将它的日志位置,单独存放
在/etc/sysconfig/keepalived文件中第14行有一段信息为:KEEPALIVED_OPTIONS="-D"
这是一个环境变量或启动参数的设置,用于指定Keepalived服务在启动时使用的额外选项。
-D:表示Keepalived以守护进程(daemon)模式运行。这意味着Keepalived会在后台运行,并且 脱离终端控制台
添加-S选项设置日志
-S :代表设置syslog日志设备,它通常与一个数字参数(0-7)结合使用,用于指定syslog记录的 日志设施级别
修改日志管理配置文件/etc/rsyslog.conf
修改完毕后重启日志管理服务与keepalive服务
六、keepalive实现高可用
keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能
(一)基本理论
VRRP Script是Keepalived的一个强大特性,其配置等级global_defs一致,与它允许用户自定义检测脚本,当Keepalived运行时会周期性地执行这些脚本。如果脚本返回成功(通常为0),则认为被监控的服务处于正常状态;如果脚本返回失败(非0值),则Keepalived将根据配置更改VRRP实例的状态,可能导致主备节点的角色切换,从而确保服务的高可用性。
VRRP Script技术实现,需要先定义脚本,而后调用脚本
cs
'定义脚本'
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell命令或脚本路径(注意执行权限)
interval <INTEGER> #间隔时间,单位为秒,默认1秒
timeout <INTEGER> #超时时间
weight <INTEGER:-254..254>
#默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低
#本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本
#节点权重,即表示 rise.通常使用负值
fall <INTEGER> #执行脚本连续几次都失败,则转换为失败,建议设为2以上
rise <INTEGER> #执行脚本连续几次都成功,把服务器从失败标记为成功
}
'调用脚本'
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
(二)实现nginx高可用
1.下载安装nginx服务
yum install epel-release.noarch -y #下载epel源
yum install nginx -y #下载nginx
systemctl stop ipvsadm.service #关闭ipvsamd服务
定义一个简单的脚本
脚本表示使用killall -0,这是Linux命令行中用于检查指定进程名是否存在且至少有一个实例在运行的命令。这里的参数 -0 具有特殊含义,它不会发送任何信号给进程,而是仅仅测试这些进程是否存在
修改nginx配置文件,添加反向代理及负载均衡
修改keepalive配置文件,只保留全局配置与实例配置,删除虚拟服务器与真实服务器配置
在全局配置语句块外添加vrrp_script服务
cs
vrrp_script keep
#定义名为 "keep" 的VRRP检查脚本。
script "/data/keep.sh"
#指定要执行的shell脚本路径为 /data/keep.sh。这个脚本应该返回0表示成功,非零值表示失败。
interval 1
#设置每隔1秒执行一次该脚本以检查服务状态。
timeout 30
#如果脚本在30秒内没有响应(即超时),则认为它执行失败。
weight -50
#当脚本执行成功时,VRRP实例的优先级权重减50。
fall 3
#当连续3次检查失败后,将触发VRRP实例状态变更,可能导致主备切换。
rise 3
#当连续3次检查成功后,恢复VRRP实例到正常状态。
配置完毕后重启keepalive服与nginx服务
systemctl restart keepalived.service
systemctl start nginx
另一台keepalive配置与其一致
配置完毕后重启服务,使用客户端访问