keepalive简介
keepalive为LVS应用延伸的高可用服务。lvs的调度器无法做高可用。但keepalive不是为lvs专门集群服务的,也可以为其他的的代理服务器做高可用。
keepalive在lvs的高可用集群,主调度器和备调度器(可以有多个) 一主两备或一主一备。
VRRP: keepalived是基于vrrp协议实现Ivs服务的高可用。解决了调度器单节点的故障问题。
VRRP协议:提高网络路由器的可靠性开发的一种协议。
vrrp工作原理
·选举出主和备,预先设定主备的优先级。主的优先级较高,备的优先级低,一旦开启服务器,优先级高的,会自定抢占主的位置。
·VRRP组播通信: 224.0.0.18 VRRP协议当中的主备服务器通过组播地进行通信,交换主备服务器之间的运行状态。主服务会周期性的发送vrrp协议报文,告诉备:主的当前状态。
·主备切换:主服务器发生故障,或者不可达,VRRP协议会把请求转义到备服务器。通过组播地址,VRRP可以迅速的通知其他服务器发生了主备切换,确保新的主服务器可以正常处理客户端的请求。
·故障恢复: 一旦主服务器恢复通信,由组播地址进行通信,发现在恢复的主服务器优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接受请求。
keepalive工作原理
主调度器能够正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器处于冗余状态。
不参与集群的运转。主调度器故障无法运行,备调度器才会承担主调度器的工作。
一旦主调度恢复工作,继续由主调度器进行处理,备调度器又成了冗余。
一、高可用集群
1.1 集群类型
Keep-alive高可用集群通常是指通过一些机制保持服务可用性的分布式系统,常见的集群类型包括:
-
负载均衡(LB):这种类型的集群主要用于分发用户请求到一组服务器,以平均负载并防止单台服务器过载。LB可以是硬件设备(如F5 BIG-IP)或软件解决方案(如Nginx,HAProxy)。它根据预设策略将流量分配给各个节点,提高整个系统的可用性和性能。
-
高可用集群(HA):设计目的是确保即使某个组件故障也能继续运行。这通常涉及到冗余配置、自动故障检测和恢复机制。比如,通过主备模式或多副本数据库来避免单点故障。常见于关键业务系统,如数据库、Web服务器等。
-
单点故障(Spof) 解决方案:Spof通常指系统中的某个单一元素,一旦这个元素宕机,整个系统就会失效。解决办法可能是采用高可用设计,例如前面提到的主备结构,或者是使用分布式系统来分散风险。
-
高性能计算集群(HPC):这类集群专为需要大量计算资源的任务设计,如科学模拟、数据分析或大规模机器学习。HPC集群通常包含大量的高性能服务器和优化的硬件配置,以及专门的调度和文件存储系统,如Slurm、SGE等。
1.2系统可用性
系统可用性是指系统在特定条件下,能够正常执行其预定功能的能力。它通常通过一系列指标来衡量,如系统的稳定性、响应时间、故障恢复能力等。高可用性的系统能够确保在面临各种故障或挑战时,仍然能够持续提供服务,从而满足用户的需求。
SLA(服务等级协议)
SLA是提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约。它明确规定了服务提供商必须达到的服务标准,以及未达到这些标准时应承担的责任。SLA的核心目的是确保服务提供商和客户
1.3 系统故障
硬件故障:设计缺陷、 wear out (损耗)、非人为不可抗拒因素
软件故障:设计缺陷 bug
1.4 实现高可用
- 提升系统高用性的解决方案:降低 MTTR- Mean Time To Repair( 平均故障时间 )
- 解决方案:建立冗余机制
-
active/passive 主/备
active/active 双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active
二、Keepalived配置
1.1环境搭建
k1:172.25.254.10
k2:172.25.254.20
client:172.25.254.200
webserver1:172.25.254.110
webserver2:172.25.254.120
(1).webserver1和webserver2上都装httpd、写入测试文字、开启http服务
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd.service
(2).k1和k2上测试
[root@k1 ~]# curl 172.25.254.110
172.25.254.110
[root@k1 ~]# curl 172.25.254.120
172.25.254.120
2.1配置虚拟路由器
(1).开启服务,进入k1主配置文件编写代码
[root@k1 ~]# systemctl start keepalived.service
[root@k1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
2815074063@qq.com
}
notification_email_from keepalived@rhel7.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id k1.rhel7.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
(2).开启服务,进入k2主配置文件编写代码
[root@k2 ~]# systemctl start keepalived.service
[root@k2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
3283085081@qq.com
}
notification_email_from keepalived@rhel7.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id k2.rhel7.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
(3).重启服务
[root@k2 ~]# systemctl restart keepalived.service
(4).测试
[root@k1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.10 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::20c:29ff:fe5d:d389 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5d:d3:89 txqueuelen 1000 (Ethernet)
RX packets 5024 bytes 399854 (390.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6216 bytes 508605 (496.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:5d:d3:89 txqueuelen 1000 (Ethernet)
3.1开启通信功能及独立日志
(1).进入配置文件编写策略并重启
vrrp_strict添加此选项无法访问 vip ,可以用 nft list ruleset 查看
[root@k1 ~]# vim /etc/keepalived/keepalived.conf
(2).开启日志功能
[root@k1 ~]# vim /etc/sysconfig/keepalived
-D:这个选项使得 Keepalived 守护进程在前台运行,并且会打印日志到标准输出(stdout)和错误输出(stderr)。
-S 6:这个选项用于设置 Keepalived 的日志级别。Keepalived 的日志级别范围从 0 到 7,其中 0 表示最少量的日志信息(仅错误信息),而 7 表示最详细的日志信息(包括调试信息)
[root@k1 ~]# systemctl restart keepalived.service
(3).测试:此时vip通信开启
[root@k1 ~]# ping 172.25.254.100
PING 172.25.254.100 (172.25.254.100) 56(84) bytes of data.
64 bytes from 172.25.254.100: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 172.25.254.100: icmp_seq=2 ttl=64 time=0.093 ms
64 bytes from 172.25.254.100: icmp_seq=3 ttl=64 time=0.066 ms
64 bytes from 172.25.254.100: icmp_seq=4 ttl=64 time=0.067 ms
(4).进入rsyslog.conf配置文件写日志路径并重启
[root@k1 ~]# vim /etc/rsyslog.conf
[root@k1 ~]# systemctl restart rsyslog.service
(5).测试:可以看到有日志生成
[root@k1 ~]# ll /var/log/keepalived.log
-rw------- 1 root root 12086 8月 12 13:29 /var/log/keepalived.log
[root@k1 ~]# tail -3 /var/log/keepalived.log
Aug 12 13:29:12 k1 Keepalived_healthcheckers[5809]: Lost quorum 1-0=1 > 0 for VS [192.168.200.100]:443
Aug 12 13:29:12 k1 Keepalived_healthcheckers[5809]: Remote SMTP server [127.0.0.1]:25 connected.
Aug 12 13:29:12 k1 Keepalived_healthcheckers[5809]: SMTP alert successfully sent.
4.1独立子配置文件
当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理。将不同集群的配置,比如:不同集群的 VIP 配置放在独立的子配置文件中利用 include 指令可以实现包含 子配置文件。
(1).创建子文件并写策略,记得将主配置文件的策略注释掉并写入子配置文件的路径
[root@k1 ~]# mkdir -p /etc/keepalived/conf.d
[root@k1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
(2).重启服务
[root@k1 ~]# systemctl restart keepalived.service
(3).测试:可以看到子配置文件生效了
[root@k1 ~]# ll /etc/keepalived/conf.d/172.25.254.100.conf
-rw-r--r-- 1 root root 271 8月 12 13:27 /etc/keepalived/conf.d/172.25.254.100.conf
三、应用示例
1.非抢占模式 nopreempt
默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色, 这样会使vip在KA主机中来回漂移,造成网络抖动。
建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色 非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机。
注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP
(1).ka1主机配置
编辑keepalived.conf配置:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev en33 label en33:1
}
}
(2).ka2主机配置
编辑keepalived.conf配置:
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
(3).重启服务并进行测试
systemctl restart Keepalived.service
先重启ka1服务,再重启ka2服务:
(4).关闭ka1服务:
systemctl stop Keepalived.service
(5).再重启ka1服务:
抓包还是ka2,vip还在ka2,因为非抢占模式,即使优先级高的主机恢复,也不会抢占优先级低的主机,如果原来的主机down机,vip迁移至新的主机,后续也发生down机时,会将vip迁移会源主机。
2.1抢占延迟模式 preempt_delay
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回 VIP。
注意:需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict
(1).ka1主机配置
编辑keepalived.conf配置:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 100 #优先级高
preempt_delay 5s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
(2).ka2主机配置
编辑keepalived.conf配置:
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 80 #优先级低
advert_int 1
preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
(3).测试结果
先重启ka2的服务,再重启ka1的服务:
等延迟时间过了才会抢占ka2的vip
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回VIP
3.1VIP单播配置
默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络。注意:启用 vrrp_strict 时,不能启用单播。
(1).k1配置:
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
(2).k2配置:
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
(3).测试单播效果:
[root@k1 ~]# tcpdump -i eth0 -nn src host 172.25.254.20 and dst 172.25.254.10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:04:39.790162 IP 172.25.254.20 > 172.25.254.10: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
15:04:40.791608 IP 172.25.254.20 > 172.25.254.10: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
15:04:41.792787 IP 172.25.254.20 > 172.25.254.10: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
4.1通知脚本配置
当 keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户,默认以用户 keepalived_script 身份执行脚本, 如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份。
(1).K1和K2上安装邮件发送工具:
[root@k1 ~]# yum install mailx -y
(2).修改mail.rc配置文件:
[root@k2 ~]# vim /etc/mail.rc
(3).创建通知脚本,并添加可执行权限:
[root@K1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dst="3283085081@qq.com"
send_message()
{
mail_sub="$HOSTNAME to be $1 vip move"
mail_msg="`date +%F\ %T`: vrrp move $HOSTNAME chage $1"
echo $mail_msg | mail -s "$mail_sub" $mail_dst
}
case $1 in
master)
send_message master
;;
backup)
send_message backup
;;
fault)
send_message fault
;;
*)
;;
esac
[root@K1 ~]# chmod +x /etc/keepalived/mail.sh
(4).在 vrrp_instance VI_1语句块的末尾加下面三行,重启服务:
[root@k1 ~]# vim /etc/keepalived/keepalived.conf
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
(5).测试:
5.1实现master/slave的keepalived双主架构:
master/slave 的单主架构,同一时间只有一个 Keepalived 对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用 master/master 的双主架构,解决此问题。
master/master 的双主架构:即将两个或以上 VIP 分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高 服务器资源利用率 。
(1).k1配置:
vrrp_instance VI_2 {
state BACKUP #备
interface eth0
virtual_router_id 200
priority 80
advert_int 1
#nopreempt
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
(2).k2配置:
vrrp_instance VI_2 {
state MASTER #主 ,
interface eth0
virtual_router_id 200
priority 100
advert_int 1
#nopreempt
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
(3).测试:可以看到两台服务器各有一个vip
6.1实现IPVS的高可用性
(1).准备web服务器并使用脚本绑定VIP至web服务器lo网卡
[root@webserver1 ~]# ip a a 172.25.254.100/32 dev lo
(2).使vip不对外响应,重载生效查看
[root@webserver1 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@webserver1 ~]# sysctl -p
[root@webserver1 ~]# sysctl --system
(3).k1和k2上安装ipvsadm软件
[root@k1 ~]# yum install ipvsadm -y
(4).修改k1和k2配置文件并重启服务
[root@k1 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 172.25.254.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
real_server 172.25.254.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
(5).查看是否自动生成lvs策略,如果没有检查配置文件
[root@k1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 172.25.254.110:80 Route 1 0 0
-> 172.25.254.120:80 Route 1 0 1
(6).测试:客户端访问,当K1故障时自动切换到k2,不会影响客户的体验
[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
7.1 利用脚本实现主从角色切换
keepalived 利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能 。
vrrp_script :自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,定 义在 vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对 MASTER 节点的权重减至低于 SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点。
track_script :调用 vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的 vrrp_script。
(1).定义脚本并添加可执行权限
[root@k1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/liu ]
(2).修改配置文件并重启服务
[root@k1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_file {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
track_script {
check_file
}
(3).测试:
此时k1上有vipv
创建脚本,可以看到vip漂到了k2上
[root@k1 ~]# touch /mnt/liu
[root@k1 ~]# ls /mnt/
liu
8.1实现haproxy的高可用性
(1).k1和k2上安装haproxy服务
[root@k1 ~]# yum install haproxy -y
(2).开启k1和k2内核路由器功能
[root@k2 ~]# vim /etc/sysctl.conf
[root@k1 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
(3).编写haproxy.cfg配置文件并重启服务
[root@k1 ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
server web2 172.25.254.120:80 check inter 3 fall 2 rise 5
[root@k1 ~]# systemctl restart haproxy.service
(4).编写监测脚本
[root@k1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@k1 ~]# vim /etc/keepalived/keepalived.conf
(5).修改配置文件并重启服务
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
track_script {
check_haproxy
}
(6).测试:客户端访问,当一台服务器故障时自动切换到另一台服务器,不会影响客户的体验
[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
抓大放小