keepalived:
Keepalived是一个基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)协议实现的LVS(Linux Virtual Server)服务高可用方案。它的主要作用是进行虚拟路由的故障切换,确保服务的持续可用性。Keepalived通过监控LVS集群系统中各个服务节点的状态,实现高可用性。它不仅可以管理LVS软件,还可以作为其他服务(如Nginx、Haproxy、MySQL等)的高可用解决方案软件。Keepalived为Linux系统和基于Linux的架构提供了负载均衡和高可用能力,其负载均衡功能主要源自集成在Linux内核中的LVS项目模块IPVS(IP Virtual Server)。此外,Keepalived还实现了基于多层TCP/IP协议的健康检查机制,包括4层TCP/IP协议负载均衡和多层TCP/IP协议的健康检查机制。Keepalived的作用是为LVS集群节点提供健康检查和为LVS负载均衡服务器提供故障切换的用户空间进程。
Keepalived采用模块化设计,主要包含core、check和vrrp三个模块,分别负责不同的功能。它支持两台服务器运行,一台作为主机服务器(MASTER),另一台作为备份服务器(BACKUP),共同对外表现为一个虚拟IP。当主机服务器出现问题时,备份服务器能够接管虚拟IP,继续提供服务,从而保证了高可用性。
1.keepalived的优点
Keepalived的特点包括自动完成不需人工干涉、开源、参与故障转移群集节点不受限制、避免单节点故障、可靠性强。
- 自动完成不需人工干涉:Keepalived是一个类似于layer3, 4 & 5交换机制的软件,能够自动检测服务器的状态并进行相应的操作,无需人工干预。
- 开源:Keepalived是一个开源软件,这意味着它可以被广泛使用和修改,以满足不同的需求。
- 参与故障转移群集节点不受限制:Keepalived支持在群集节点中进行故障转移,且群集节点的数量不受限制。
- 避免单节点故障:通过健康状态检查和发现活跃设备故障进行转换到备份设备,Keepalived能够避免单节点故障。
- 可靠性强:Keepalived的可靠性强,因为它通过VRRP协议实现主备模式,当主设备故障时,备份设备可以迅速接管服务,确保服务的持续可用性。
此外,Keepalived是基于VRRP协议的,所有报文通过IP多播方式发送,只有主路由器(Master角色)会发送VRRP数据包,而备份路由器(BACKUP角色)只接收主路由器的报文信息,用于监控主路由器的运行状态。当主路由器不可用时,备份路由器会进行选举,优先级最高的备份路由器将成为新的主路由器,继续提供对外服务。这种选举角色切换非常快,保证了服务的持续可用性。
2.高可用集群
1.1 集群类型
1.2 系统可用性
1.3 系统故障
1.4 实现高可用
1.5.VRRP:Virtual Router Redundancy Protocol
3.keepalived环境部署
3.1
Keepalived 相关文件
软件包名:keepalived
主程序文件:/usr/sbin/keepalived
主配置文件:/etc/keepalived/keepalived.conf
配置文件示例:/usr/share/doc/keepalived/
Unit File:/lib/systemd/system/keepalived.service
安装keepalived(rhel7.9):yum install keepalived -y
注意:每台服务器均需要关闭防火墙和SELINUX
3.2 配置文件组成部分
3.3全局配置
3.31配置虚拟路由
KA1:
KA2:
测试
[root@KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.18
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:48:23.294894 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:24.084793 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
22:48:24.295075 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:25.085256 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
22:48:25.296296 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:26.085843 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
关闭KA1后再看组播信息
3.4Keepalived日志功能
[root@ka1 ~]# cat /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
[root@ka1 ~]#cat /etc/rsyslog.conf
local6.* /var/log/keepalived.log
[root@ka1 ~]#systemctl restart keepalived.service rsyslog.service #重启服务生效\
4.企业应用实例
4.1 实现master/slave的 Keepalived 单主架构
ka2:
抓包观察
tcpdump -i ens160 -nn host 224.0.0.18
4.2 抢占模式和非抢占模式
ka1:
ka2:
4.2.2 抢占延迟模式 preempt_delay
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回VIP
4.3 VIP单播配置
4.4 Keepalived 通知脚本配置
4.4.2 脚本的调用方法
在 vrrp_instance VI_1 语句块的末尾加下面行
创建通知脚本
QQ邮箱配置
在etc下的mail.rc文件里最低加入
安装邮件发送工具:yum install mailx -y
测试:echo test message |mail -s test 1301654293@qq.com
4.4.3 实战案例:实现 Keepalived 状态切换的通知脚本
chmod +x /etc/keepalived/mail.sh
#模拟master故障
-
[root@ka1 ~]#killall keepalived
4.5 实现 master/master 的 Keepalived 双主架构
master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率
ka1:
ka2:
4.6. IPVS相关配置
4.6.1. 虚拟服务器配置结构
virtual_server IP port {
...
real_server {
...
}
real_server {
...
}
...
}
4.6.2 virtual server (虚拟服务器)的定义格式
virtual_server IP port #定义虚拟主机IP地址及其端口
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string #使用虚拟服务器组
4.6.3 虚拟服务器配置
virtual_server IP port { #VIP和PORT
delay_loop <INT> #检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法
lb_kind NAT|DR|TUN #集群的类型,注意要大写
persistence_timeout <INT> #持久连接时长
protocol TCP|UDP|SCTP #指定服务协议,一般为TCP
sorry_server <IPADDR> <PORT> #所有RS故障时,备用服务器地址
real_server <IPADDR> <PORT> { #RS的IP和PORT
weight <INT> #RS权重
notify_up <STRING>|<QUOTED-STRING> #RS上线通知脚本
notify_down <STRING>|<QUOTED-STRING> #RS下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定义当前主机健康状态检测方法
}
}
#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错
4.6.4 应用层监测
应用层检测:HTTP_GET|SSL_GET
HTTP_GET|SSL_GET {
url {
path <URL_PATH> #定义要监控的URL
status_code <INT> #判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout <INTEGER> #客户端请求的超时时长, 相当于haproxy的timeout server
nb_get_retry <INT> #重试次数
delay_before_retry <INT> #重试之前的延迟时长
connect_ip <IP ADDRESS> #向当前RS哪个IP地址发起健康状态检测请求
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> #向当前RS发出健康状态检测请求时使用的源地址
bind_port <PORT> #向当前RS发出健康状态检测请求时使用的源端口
}
5. 实战案例
实战案例1:实现单主的 LVS-DR 模式
准备web服务器并使用脚本绑定VIP至web服务器lo网卡
#准备两台后端RS主机 [root@rs1 ~]# yum install httpd -y [root@rs1 ~]# echo RS1 - 172.25.250.110 > /var/www/html/index.html [root@rs1 ~]# ip addr add 172.25.250.100/32 dev lo [root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@rs2 ~]# yum install httpd -y [root@rs2 ~]# echo RS2 - 172.25.250.120 > /var/www/html/index.html [root@rs2 ~]# ip addr add 172.25.250.100/32 dev lo [root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
配置keepalived
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
@@@@ 省略内容 @@@@
virtual_server 172.25.250.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 172.25.250.10
real_server 172.25.250.110 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.25.250.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
#ka2节点的配置,配置和ka1基本相同,只需修改三行
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
@@@@ 省略内容 @@@@
virtual_server 172.25.250.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 172.25.254.30
real_server 172.25.250.110 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.25.250.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
访问测试结果
[root@client ~]# for i in {1..6}; do curl 172.25.250.100; done
RS1 - 172.25.250.110
RS2 - 172.25.250.120
RS1 - 172.25.250.110
RS2 - 172.25.250.120
RS1 - 172.25.250.110
RS2 - 172.25.250.120
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=5993)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.204.100:80 wrr
-> 172.25.254.110:80 Route 1 0 6
-> 172.25.254.120:80 Route 1 0 6
实战案例:实现HAProxy高可用
#在两个ka1和ka2先实现haproxy的配置
[root@ka1 & ka2 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.250.100:80
server web1 172.25.250.110:80 check
server web2 172.25.250.120:80 check
#在两个ka1和ka2两个节点启用内核参数
[root@ka1 & ka2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
[root@ka1 & ka2 ~]# sysctl -p
#在ka1中编写检测脚本
[root@ka1 ~]# vim /etc/keepalived/scripts/haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
[root@ka1 ~]# chmod +X /etc/keepalived/scripts/haproxy.sh
#在ka1中配置keepalived
[root@ka1 ~]#cat /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
script "/etc/keepalived/scripts/haproxy.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance web {
state MASTER
interface ens160
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.250.100 dev ens160 label ens160:0
}
track_script {
check_haproxy
}
}
#测试
root@ka1 ~]# systemctl stop haproxy.service