解锁 Keepalived:高可用集群的秘密武器与实战部署
文章目录
一、什么是Keepalived
1.1 高可用集群
是指通过一组计算机系统(节点)协同工作,以确保关键应用和服务在面临故障或异常情况时仍能持续运行,并保持较高的可用性和可靠性。
类型
名称 | 作用 | 可用技术 |
---|---|---|
LB(负载均衡) | 在正常运行时,可以将工作负载均匀地分配到各个节点上,提高系统的整体性能和资源利用率。 | LVS/HAProxy/nginx(http/upstream, stream/upstream) |
HA(高可用集群) | 确保系统在部分组件出现故障时仍能持续提供服务,减少停机时间。保障关键业务的连续性,避免因故障导致业务中断带来的损失。 | 数据库、Redis |
SPoF(解决单点故障) | 指系统中一个单一的故障点,如果该点出现故障,整个系统将无法正常工作。识别和解决单点故障可以提高系统的可靠性和稳定性。 | 通过冗余设计、备份机制、故障转移等方式来解决单点故障 |
HPC(高性能集群) | 将多个计算节点通过高速网络连接起来,协同工作以实现高性能计算任务。作用:能够处理大规模的数据计算和复杂的科学计算问题,提高计算效率。 | 采用高性能的处理器、高速网络、并行计算框架等,如 MPI |
系统可用性:A=MTBF/(MTBF+MTTR)
- MTBF:平均故障间隔时间(Mean Time Between Failures),指系统或设备在两次故障之间的平均运行时间。
- MTTR:平均修复时间(Mean Time To Repair),指系统或设备从发生故障到恢复正常运行所需要的平均时间。
如果
A
接近 1 ,说明系统在大部分时间内都能正常运行,故障间隔时间长且修复时间短,系统的可用性极好。反之,当
A
的值越小,系统的可用性就越低,意味着系统故障频繁且修复时间长,正常运行的时间占比较小。
1.2 keepalived 的作用
Keepalived 主要用于实现服务器的高可用性(High Availability)。它可以检测服务器的状态,当主服务器出现故障时,自动将服务切换到备份服务器上,以确保服务的连续性和稳定性。
- 工作模式
active/passive 主/备 |
---|
active/active 双主 |
active --> HEARTBEAT --> passive |
active <–> HEARTBEAT <–> active |
1.3 VRRP协议
-
通告
心跳
:心跳是用于检测主备节点是否存活和正常工作的一种机制。Keepalived 会在主备节点之间按照一定的频率发送心跳消息。如果主节点在一段时间内未发送心跳,或者备节点在一段时间内未收到主节点的心跳,就会触发相关的故障切换操作。优先级
:用于决定在多个备份节点中,哪个节点优先成为主节点。数值越大,优先级越高。当主节点故障时,优先级最高的备份节点会接管成为新的主节点。周期性
:是一些操作或检测按照固定的时间间隔进行。比如心跳消息的发送、状态检测的执行等都是周期性的。
-
工作方式
抢占式
:当主节点故障恢复后,会自动将 VIP(虚拟 IP 地址)资源从备份节点抢占回来,重新成为主节点提供服务。非抢占式
:当主节点故障恢复后,不会自动将 VIP 资源从备份节点抢占回来,只有当当前的主节点再次出现故障时,原来的主节点才会重新获取 VIP 成为主节点。
-
安全认证
无认证
:节点之间的通信不进行任何身份验证或安全性检查。简单字符认证
:节点之间通过预先设置的一个固定的字符字符串进行认证。当一个节点向另一个节点发送通信消息时,会包含这个预先设置的字符串。接收方会检查这个字符串是否匹配,如果匹配则认为通信是合法的。MD5
:是一种基于消息摘要算法的认证方式,具有更高的安全性。发送方和接收方通过共享一个密钥,对通信消息进行 MD5 计算生成摘要值,并在通信中传递这个摘要值。接收方接收到消息后,使用相同的密钥和算法计算摘要值,并与接收到的摘要值进行比较,如果一致则认为通信合法。这种方式相对于简单字符认证更加复杂和安全,能够有效防止通信内容被篡改和伪造。
-
工作模式
主/备
:一台主服务器,一台备用服务器主/主
:两台服务器互为主谓服务器
1.4 keepalived配置文件
文件路径
路径名称 | 作用 |
---|---|
主程序文件 | /usr/sbin/keepalived |
主配置文件 | /etc/keepalived/keepalived.conf |
配置文件示例 | /usr/share/doc/keepalived/ |
软件环境配置文件 | /etc/sysconfig/keepalived |
配置文件解析
1.全局变量
! Configuration File for keepalived
global_defs {
notification_email {
___________@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱
#可以按行区分写多个
}
notification_email_from Alexandre.Cassen@firewall.loc #发邮件的地址
smtp_server 192.168.200.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id LVS_DEVEL
vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能
#启用此配置后,如果收到的通告报文和上一个报文是
#同一个路由器,则跳过检查,默认值为全检查
vrrp_strict #强制使用vrrp的
vrrp_garp_interval 0 #报文发送延迟,0表示不延迟
vrrp_gna_interval 0 #消息发送延迟
vrrp_mcast_group4 224.0.0.18 #表示多播组的设置
}
2.虚拟路由器
vrrp_instance VI_1 {
state MASTER #角色状态为主
interface eth0 #绑定为当前虚拟路由器使用的物理接口
virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type PASS #验证方式,PASS为简单
auth_pass 1111 #预共享密钥,仅前8位有效
}
virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址
192.168.200.16 #指定VIP,不指定网卡,默认为eth0
192.168.200.17
192.168.200.18
}
}
二、keepalived 环境部署
2.1 基本实验配置
实验中默认关闭防火墙和Selinux服务
主机名 | IP | 基础服务 |
---|---|---|
Ka01 | 172.25.254.10 | keepalived |
Ka02 | 172.25.254.20 | keepalived |
Rs01 | 172.25.254.110 | http |
Rs02 | 172.25.254.120 | http |
后端服务器
配置
#下载httpd软件包
yum install httpd -y
#给网页写内容
[root@rs01 ~]# echo "RealServer01 - 172.25.254.110" > /var/www/html/index.html
[root@rs02 ~]# echo "RealServer02 - 172.25.254.120" > /var/www/html/index.html
#启动httpd服务
systemctl enable httpd --now
Keepalived
服务器配置(两台)
#下载软件包
yum install keepalived -y
#编辑keepalived配置文件
global_defs {
notification_email {
__________@qq.com #填写自己的邮箱
}
notification_email_from Keepalived@TestKa01.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka01.com
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_ground4 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 dev eth0 label eth0:1 #填写VIP和定义网卡
}
}
#查看当前主机是否有VIP
[root@ks01 selinux]# ifconfig
......
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:94:61:5c txqueuelen 1000 (Ethernet)
#在ka02的服务器的配置文件中仅需修改虚拟路由的模式和优先级即可,如下
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 dev eth0 label eth0:1
}
}
#抓包查看状态,效果如下
[root@ks02 ~]# tcpdump -i eth0 -nn host 224.0.0.18
#在ka01与ka02同时存在且健康时,VIP在172.25.254.10上
18:39:05.214176 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
#关闭ka01,ka02工作时,VIP在172.25.254.20上
18:39:07.217078 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
18:39:07.660581 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 0, authtype simple, intvl 1s, length 20
18:39:08.348817 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
#重新开启ka01,VIP回到172.25.254.10上
18:39:25.361676 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
18:39:25.361998 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
此时搭建成功,keepalived的环境不能ping通。因为keepalived的配置文件中的策略阻止所有发往这些地址的流量。
#查看防火墙的规则列表
[root@ks01 selinux]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
DROP all -- 0.0.0.0/0 0.0.0.0/0 match-set keepalived dst
#修改keepalived配置文件如下两种方法(二选一)
1.将vrrp_strict注释
2.在全局配置中添加 vrrp_iptables
#此时测试可以ping通VIP
[root@rs02 ~]# 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.320 ms
64 bytes from 172.25.254.100: icmp_seq=2 ttl=64 time=0.198 ms
64 bytes from 172.25.254.100: icmp_seq=3 ttl=64 time=0.206 ms
2.2 通信功能及独立日志
#编辑/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
#编辑日志文件 /etc/rsyslog.conf 在这行下加入
# Save boot messages also to boot.log
local6.* /var/log/keepalived.log
#重启keepalived和rsyslog服务
systemctl restart keepalived.service
systemctl restart rsyslog.service
#查看目录是否生成
[root@ks01 selinux]# ll /var/log/keepalived.log
-rw------- 1 root root 3333 8月 14 19:18 /var/log/keepalived.log
2.3 独立子配置文件
#将keepalived配置文件的vrrp_instance VI_1部分注销 并在全局变量的下一行加入内容
include "/etc/keepalived/conf.d/*.conf"
#重启keepalived服务,抓包查看内容。此时10的主机不工作
[root@ks02 ~]# tcpdump -i eth0 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:53:43.236668 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:53:44.238105 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
#在keepalived目录下创建文件夹
[root@ks01 ~]# mkdir -p /etc/keepalived/conf.d
[root@ks01 ~]# vim /etc/keepalived/conf.d/router.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 dev eth0 label eth0:1
}
}
#重启keepalived服务,抓包查看
......
19:59:29.718237 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:59:30.719779 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:59:30.720047 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:59:31.721561 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
......
三、实验
3.1 非抢占模式
#编辑keepalived配置文件如下
###### ka01 ######
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev eth0 label eth0:1
}
}
###### ka02 ######
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev eth0 label eth0:1
}
}
#重启ka01和ka02的keepalived服务
#抓包测试如下
#ka01与ka02服务器存在且健康,VIP在ka01中
20:21:32.857271 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
#关闭ka01,仅让ka02存活,VIP转移到ka02上
20:21:39.219738 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 0, authtype simple, intvl 1s, length 20
20:21:39.908317 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20 simple, intvl 1s, length 20
#打开ka01,此时的VIP仍在ka02上
20:21:39.908317 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
#打开ka01,关闭ka02,此时VIP回到ka01上
20:22:00.162429 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 0, authtype simple, intvl 1s, length 20
20:22:00.772472 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
3.2 延迟抢占模式
#编辑keepalived配置文件如下
###### ka01 ######
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
advert_int 1
preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev eth0 label eth0:1
}
}
###### ka02 ######
vrrp_instance VI_1 {
state BACKUP
interface eth0
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 dev eth0 label eth0:1
}
}
#重启ka01和ka02的keepalived服务
3.3 组播变单播
#编辑keepalived配置文件
###### ka01 ######
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
###### ka02 ######
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 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
#重启keepalived服务
#测试
[root@ks01 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:58:21.306421 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
20:58:22.307387 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
20:58:23.308276 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
[root@ks02 ~]# 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
20:59:06.364179 ARP, Reply 172.25.254.20 is-at 00:0c:29:aa:e6:46, length 28
3.4 邮件通知
在QQ邮箱中打开服务
点击发送短信(血亏0.1巨款)
得到一串字符
#下载mail软件包
dnf install mailx -y
#编辑配置文件
vim /etc/mail.rc
#######mail set##########
set from=__________@qq.com #QQ邮箱
set smtp=smtp.qq.com
set smtp-auth-user=__________@qq.com #QQ邮箱
set smtp-auth-password=_______________ #将邮箱里的字符写到这里
set smtp-auth=login
set ssl-verify=ignore
#测试邮件发送
[root@ks01 ~]# echo test message | mail -s test ________@qq.com #QQ邮箱
[root@ks02 ~]# echo "This is ka02." | mail -s test ________@qq.com #QQ邮箱
#写邮件脚本
vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dst="____________@qq.com"
mail_send()
{
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)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
;;
esac
#修改脚本权限
chmod +x /etc/keepalived/mail.sh
#编写keepalived配置文件如下
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
#测试
/etc/keepalived/mail.sh fault
3.5 双主模式的keepalived服务
#编辑keepalived配置文件
###### ka01 ######
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 200
priority 80
advert_int 1
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
}
}
###### ka02 ######
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 200
priority 100
advert_int 1
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
}
}
#重启keepalived服务
#查看网卡信息
########### ka01 ###########
[root@ks01 ~]# ifconfig
......
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:94:61:5c txqueuelen 1000 (Ethernet)
########### ka02 ###########
[root@ks02 ~]# ifconfig
......
eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.200 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:aa:e6:46 txqueuelen 1000 (Ethernet)
#关闭ka02后查看信息
########### ka01 ###########
[root@ks01 ~]# ifconfig
......
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:94:61:5c txqueuelen 1000 (Ethernet)
eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.200 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:94:61:5c txqueuelen 1000 (Ethernet)
########### ka02 ###########
3. 6 IPVS
配置解释
- 虚拟服务器的定义格式
名称 | 含义 |
---|---|
virtual_server IP port | 定义虚拟主机IP地址及其端口 |
virtual_server fwmark int | ipvs的防火墙打标,实现基于防火墙的负载均衡集群 |
virtual_server group string | 使用虚拟服务器组 |
- 虚拟服务器配置
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 { ... } #定义当前主机健康状态检测方法
}
}
#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错
- 应用层监测
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发出健康状态检测请求时使用的源端口
}
- TCP监测
TCP_CHECK {
connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址
bind_port <PORT> #发出健康状态检测请求时使用的源端口
connect_timeout <INTEGER> #客户端请求的超时时长
#等于haproxy的timeout server
}
配置流程
- 后端服务器配置
#配置环回IP
ip a a 172.25.254.100/32 dev lo
#关闭后端服务器中的arp响应
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
#重启
sysctl --system
- keepalived服务器配置
#安装ipvsadm软件包
yum install ipvsadm -y
#配置keepalived配置文件 ka01与ka02相同
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
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
}
}
}
#重启keepalived服务
#查看策略
[root@ks01 ~]# 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 0
[root@ks02 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#测试
###### 初始的策略
[root@ks01 ~]# watch -n 1 '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 0
TCP 10.10.10.2:1358 rr persistent 50
-> 192.168.200.200:1358 Masq 1 0 0
TCP 10.10.10.3:1358 rr persistent 50
###### 关闭一台后端服务器 在ka01 的服务器上监控策略
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.120:80 Route 1 0 0
TCP 10.10.10.2:1358 rr persistent 50
-> 192.168.200.200:1358 Masq 1 0 0
TCP 10.10.10.3:1358 rr persistent 50
###### 此时测试访问VIP 并不受干扰
[root@Client01 ~]# curl 172.25.254.100
RealServer02 - 172.25.254.120
###### 打开关闭的后端服务器 此时策略更新
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
TCP 10.10.10.2:1358 rr persistent 50
-> 192.168.200.200:1358 Masq 1 0 0
TCP 10.10.10.3:1358 rr persistent 50
###### 此时如果关闭VIP所在的服务器,客户端仍可以保存 ,此时的策略在ka02上执行
3.7 vrrp脚本控制
- 脚本说明
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> #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] #执行监测脚本的用户或组
init_fail #设置默认标记为失败状态,监测成功之后再转换为成功状态
}
3.8 Haproxy + Keepalived
- rs后端服务器配置
#删除环回上的VIP
[root@rs01 ~]# ip a d 172.25.254.100/32 dev lo
#恢复arp响应
[root@rs01 ~]# rm -f /etc/sysctl.d/arp.conf
[root@rs01 ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /usr/lib/sysctl.d/60-libvirtd.conf ...
fs.aio-max-nr = 1048576
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
- keepalived服务器配置(ka01与ka02相同)
#编辑keepalived配置文件
vrrp_script check {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
#nopreempt
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
track_script {
check
}
}
#编写脚本
[root@ks01 ~]# vim /etc/keepalived/watch.sh
#!/bin/bash
killall -0 haproxy
[root@ks01 ~]# chmod +x /etc/keepalived/watch.sh
#测试
[root@Client01 ~]# curl 172.25.254.100
RealServer01 - 172.25.254.110
[root@Client01 ~]# curl 172.25.254.100
RealServer02 - 172.25.254.120
[root@Client01 ~]# curl 172.25.254.100
RealServer01 - 172.25.254.110
[root@Client01 ~]# curl 172.25.254.100
RealServer02 - 172.25.254.120