解锁 Keepalived:高可用集群的秘密武器与实战部署

解锁 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基础服务
Ka01172.25.254.10keepalived
Ka02172.25.254.20keepalived
Rs01172.25.254.110http
Rs02172.25.254.120http
  • 后端服务器 配置
#下载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 814 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 intipvs的防火墙打标,实现基于防火墙的负载均衡集群
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
  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值