在当今高度依赖信息技术的企业环境中,服务的高可用性和可靠性至关重要。无论是内部应用程序还是面向客户的在线服务,任何中断都可能对企业造成严重的经济损失和声誉损害。因此,构建稳健的高可用性架构成为现代 IT 架构师的一项重要任务。在这个背景下,Keepalived 成为了众多企业的首选解决方案之一,特别是在实现基于 VRRP 协议的高可用性集群方面。
本文将通过一系列具体的案例研究,深入探讨 Keepalived 如何被应用于企业级环境中,以实现关键业务服务的高可用性和故障切换。我们将重点介绍 Keepalived 的配置方法、健康检查机制以及如何应对不同场景下的挑战。
1.master/slave的keepalived单主架构
1.1 master配置
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
#错误报告邮箱
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.timinglee.org
vrrp_skip_check_adv_addr
#vrrp_strict #添加此选项无法访问vip,可以用nft list ruleset查看
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 20
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
1.2 backup配置
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA2.timinglee.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 20 #相同id管理同一个虚拟路由
priority 80 #比主服务器低的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
1.3 重新启动 Keepalived 服务
sudo systemctl start keepalived
sudo systemctl enable keepalived
示例:
2.Keepalived 的抢占与非抢占模式
在 Keepalived 的配置中,有一个重要的概念是抢占模式(Preemptive Mode)与非抢占模式(Non-Preemptive Mode),这两种模式决定了当主服务器(Master)恢复时,虚拟 IP(VIP)的接管行为。
2.1. 抢占模式
2.1.1 概念
在抢占模式下,当主服务器(Master)发生故障时,备份服务器(Backup)会接管虚拟 IP 地址并开始提供服务。一旦主服务器恢复,它会重新获得虚拟 IP 地址,从而恢复为主服务器角色,即使此时备份服务器正在正常提供服务。
2.1.2 配置
在 Keepalived 的配置文件中,默认情况下是开启抢占模式的。这意味着不需要额外配置抢占模式,除非明确配置非抢占模式。
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
2.1.3 优点
- 高可用性:主服务器恢复后可以立即接管 VIP,保证服务的连续性。
- 快速恢复:无需人工干预,系统自动恢复。
2.1.4 缺点
- VIP切换:当主服务器恢复时,可能会导致短暂的服务中断,因为 VIP 会从备份服务器切换回主服务器。
- 负载波动:VIP 切换可能导致短暂的负载波动,影响用户体验。
2.2. 非抢占模式
2.2.1 概念
在非抢占模式下,当主服务器发生故障并恢复后,它不会从备份服务器那里抢回虚拟 IP 地址。这意味着即使主服务器恢复了,也会继续保持备份状态,直到备份服务器也发生故障。
2.2.2 配置
要在 Keepalived 中启用非抢占模式,需要在配置文件中添加 nopreempt
标志。
vrrp_instance VI_1 {
state MASTER
nopreempt #非抢占模式标签
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
2.2.3 优点
- 避免频繁切换:当主服务器恢复时,不会导致 VIP 的切换,从而减少了服务中断的可能性。
- 减少负载波动:避免了因 VIP 切换而导致的负载波动。
2.2.4 缺点
- 主服务器冗余:即使主服务器恢复,也可能保持备份状态,这可能导致资源浪费。
- 手动干预:在某些情况下,可能需要手动干预来恢复主服务器的角色。
2.3. 选择模式
选择使用抢占模式还是非抢占模式取决于具体的应用场景和业务需求:
- 抢占模式适用于:对服务连续性要求极高的场景,例如金融交易系统或关键业务系统。
- 非抢占模式适用于:对服务稳定性要求较高,希望减少 VIP 切换次数的场景,例如大规模在线服务或用户敏感的应用。
3.Keepalived 中的单播模式
在 Keepalived 中,除了常用的多播(Multicast)和广播(Broadcast)模式外,还有一种称为单播(Unicast)的模式。单播模式允许 Keepalived 实例之间通过特定的 IP 地址进行直接通信,而不是使用默认的多播地址。这种模式特别适合于那些不支持多播或广播的网络环境。
3.1. 单播模式的概念
单播模式是指 Keepalived 实例之间的通信通过直接向对方发送单播报文的方式进行。这种方式不需要网络中的其他设备支持多播功能,只需要配置好单播地址即可。单播模式下的 VRRP 报文只发送给指定的目标 IP 地址,而非向整个子网广播。
3.2. 为什么使用单播模式
- 隔离网络:在一些严格控制广播和多播流量的网络环境中,单播模式可以绕过这些限制。
- 安全增强:单播模式可以减少不必要的网络流量,提高安全性。
- 兼容性:对于不支持多播的网络设备,单播模式是一种可行的替代方案。
- 网络复杂性:在复杂的网络环境中,单播模式可以帮助避免多播带来的潜在问题。
3.3. 单播模式的配置
在 Keepalived 的配置文件中,启用单播模式非常简单。您需要在 vrrp_instance
配置块中添加 unicast_src_ip
和 unicast_peer
选项来指定单播源 IP 和目标 IP。
3.3.1 单播源 IP (unicast_src_ip)
unicast_src_ip
选项用来指定发送单播 VRRP 报文时使用的源 IP 地址。这个 IP 地址必须是 Keepalived 运行所在主机上的有效 IP 地址。
3.3.2 单播目标 IP (unicast_peer)
unicast_peer
选项用来指定接收单播 VRRP 报文的目标 IP 地址。通常,您需要为每个备份服务器配置一个 unicast_peer
。
3.3.3 配置示例
下面是一个简单的单播模式配置示例,假设我们有两个服务器 ServerA 和 ServerB,它们都连接在同一子网上。
ServerA (主服务器) 配置
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
unicast_src_ip 172.25.254.10
unicast_peer 172.25.254.20
}
ServerB (备份服务器) 配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
unicast_src_ip 172.25.254.20
unicast_peer 172.25.254.10
}
- unicast_src_ip:指定发送单播 VRRP 报文时使用的源 IP 地址。
- unicast_peer:指定接收单播 VRRP 报文的目标 IP 地址。
测试示例
示例:
测试:
3.4. 单播模式的优势
- 网络隔离:在隔离的网络环境中仍然可以使用 VRRP 协议。
- 安全性:单播模式可以减少网络中的广播和多播流量,提高安全性。
- 灵活性:可以轻松地在网络中添加或移除 Keepalived 实例,而无需担心多播或广播的问题。
3.5. 注意事项
- 网络配置:确保单播 IP 地址之间可以互相通信,且路由正确配置。
- 多播支持:如果网络支持多播,通常建议使用多播模式,因为它更易于配置和管理。
- 性能考量:单播模式可能会产生更多的网络流量,尤其是在大型集群中。
4. keepalived通知脚本
当keepalived的状态发生变化时,能够自动触发脚本的执行→比如自动发送邮件通知用户。
4.1 通知脚本类型
当前节点成为主节点时触发
notify_master <STRING>|<QUOTED-STRING>
当前节点成为备节点时触发
notify_backup <STRING>|<QUOTED-STRING>
当前节点错误时触发
notify_fault <STRING>|<QUOTED-STRING>
通用格式的触发,任何状态变化都发送邮件
notify <STRING>|<QUOTED-STRING>
4.2 脚本的调用办法
在 vrrp_instance VI_1 语句块的末尾加下面行
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
示例:
4.3 创建通知脚本
[root@KA1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='*****@**.com' #目标邮箱地址
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
4.4 配置linux系统邮件
如果使用QQ邮箱则在QQ邮箱的安全中能够找到授权码
[root@KA1 ~]# vim /etc/mail.rc
#######mail set##########
set from=来源邮箱
set smtp=smtp.qq.com
set smtp-auth-user=用户邮箱
set smtp-auth-password=获得的授权码
set smtp-auth=login
set ssl-verify=ignore
示例:
发送测试邮件
[root@KA1 ~]# echo test message |mail -s test ***@.com
测试示例
5. keepalived双主架构
master/slave的单主架构,同一时间只有一Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高
服务器资源利用率
双主架构配置本质上与主/备配置没有非常大的差异
ka1配置:
[root@rhel7-ka1 ~]#vim/etc/keepalived/keepalived.conf
......
vrrp_instance VI_1 {
state MASTER #主
interface ens33
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev ens33 label ens33:0
}
}
vrrp_instance VI_60 {
state BACKUP #备
interface ens33
virtual_router_id 60
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200 dev ens33 label ens33:1
}
}
ka2配置:
[root@rhel7-ka2 ~]# vim /etc/keepalived/keepalived.conf
......
vrrp_instance VI_1 {
state BACKUP #备
interface ens33
virtual_router_id 50
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev ens33 label ens33:0
}
}
vrrp_instance VI_60 {
state MASTER #主
interface ens33
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200 dev eth0 label eth0:1
}
}
6. keepalived+lvs实现ipvs的高可用
在构建高可用性的网络服务架构时,Keepalived 和 LVS(Linux Virtual Server)是两个非常强大的工具。LVS 提供了一种高效的方式来实现负载均衡,而 Keepalived 则确保了高可用性。结合这两个工具,可以创建一个既具有高可用性又具备负载均衡能力的集群。
1. LVS 和 IPVS 简介
1.1 LVS
LVS 是一种基于 Linux 内核的负载均衡解决方案,它可以将来自客户端的请求分发到一组后端服务器上,从而提高服务的可用性和响应速度。LVS 支持多种负载均衡算法,包括轮询(Round Robin)、最少连接(Least Connections)等。
1.2 IPVS
IPVS 是 LVS 的内核模块,它是 LVS 的核心部分,实现了真正的负载均衡功能。IPVS 使用 iptables 或 ipvsadm 工具来管理虚拟服务器规则和服务。
2. Keepalived 的作用
Keepalived 是一个用于实现高可用性的开源软件包,主要用于构建高可用性集群,特别是对于网络服务的负载均衡和故障切换。通过 VRRP(Virtual Router Redundancy Protocol)协议,Keepalived 监控主服务器的状态,并在主服务器发生故障时接管其 IP 地址,从而保证服务的连续性。
3. 配置 Keepalived + LVS 实现高可用
3.1 准备环境
确保所有服务器都安装了 LVS 和 Keepalived。
安装 LVS
yum install ipvsadm
安装 Keepalived
yum install keepalived
配置RS
对于后端的RS服务器则需要配置其对报文的丢弃,避免vip冲突以及绑定至lo网卡的vip环回
[root@rs1 ~]# ip addr add 172.25.254.100/32 dev lo #配置环回VIP
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[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 ~]# ip addr add 172.25.254.100/32 dev lo
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
3.2 配置 LVS
在每个 LVS 节点上配置 LVS 规则。以下是一个简单的 LVS 规则配置示例,用于配置一个 HTTP 服务负载均衡器。
# 添加虚拟服务器
ipvsadm -A -t 172.25.254.100:80 -s rr
# 添加后端服务器
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.10:80 -g
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.20:80 -g
3.3 配置 Keepalived
在每个 LVS 节点上配置 Keepalived。以下是一个简单的 Keepalived 配置示例,用于设置一个主服务器和一个备份服务器。
3.3.1 主服务器配置
[root@rhel7-ka1 ~]# vim /etc/keepalived/keepalived.conf
.......
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr #权重轮询算法
lb_kind DR #设置lvs为dr模式
protocol TCP
#sorry_server 172.25.254.30
real_server 172.25.254.10 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.25.254.20 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
3.3.2 备份服务器配置
[root@rhel7-ka2 ~]# vim /etc/keepalived/keepalived.conf
.......
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 172.25.254.30
real_server 172.25.254.10 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.25.254.20 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
- global_defs:定义全局配置,如路由器 ID。
- state MASTER/BACKUP:定义服务器的角色。
- interface:指定用于 VRRP 通信的网络接口。
- virtual_router_id:定义 VRRP 实例的 ID。
- priority:定义服务器的优先级,数值越大优先级越高。
- advert_int:定义 VRRP 广播间隔时间(秒)。
- authentication:定义认证方式和密码。
- virtual_ipaddress:定义虚拟 IP 地址。
- track_script:定义健康检查脚本。
- virtual_server:定义虚拟服务器及其后端服务器。
- real_server:定义后端服务器的配置。
- TCP_CHECK:定义 TCP 健康检查参数。
3.4 启动与验证
启动 Keepalived 服务:
systemctl start keepalived
systemctl enable keepalived
验证服务状态:
systemctl status keepalived
验证虚拟 IP 地址是否已正确分配:
ip addr show
4. 故障切换
当主服务器发生故障时,Keepalived 会检测到主服务器没有发送 VRRP 报文,并根据优先级选择新的 Master,接管虚拟 IP 地址,继续提供服务。同时,LVS 会自动检测后端服务器的健康状态,并将流量分发到可用的后端服务器上。
5.示例
7.脚本自动化主从切换
在 Keepalived 的高可用性集群中,主从切换通常是自动完成的,但有时也需要进行一些额外的配置来确保服务的平滑迁移。通过编写脚本来自动化主从切换的过程,可以进一步提高系统的可靠性和响应速度。
自动化主从切换的步骤
监听状态变化
首先,我们需要配置 Keepalived 以便在状态发生变化时触发脚本。这通常是通过 track_script
和 notify_master
或 notify_backup
选项来实现的。
编写脚本
接下来,编写一个或多个脚本来处理状态变化。这些脚本可以根据需要执行不同的任务,例如更新 DNS 解析记录、重启服务、发送警报等。
配置 Keepalived
最后,在 Keepalived 的配置文件中添加相应的脚本配置,以确保在状态变化时调用这些脚本。
配置示例
脚本编写
编写一个脚本,测定存在指定文件时切换主从
[root@rhel7-ka1 ~]# vim /mnt/check_exa.sh
#!/bin/bash
[ ! -f "/mnt/example" ]
Keepalived 配置
在 Keepalived 的配置文件中添加以下配置来触发上述脚本:
[root@rhel7-ka1 ~]# vim /etc/keepalived/keepalived.conf
.......
vrrp_script check_exa {
script "/mnt/check_exa.sh"
interval 1
weight -30 #触发后减少30的权重
fall 2
rise 2
timeout 2
}
注意事项
- 权限问题:确保脚本有足够的权限执行相关操作。
- 错误处理:在脚本中加入适当的错误处理逻辑,确保即使脚本执行失败也不会影响 Keepalived 的正常运行。
- 测试:在正式部署之前,务必在测试环境中充分测试这些脚本,确保它们按预期工作。
8.keepalived+haproxy实现高可用
本质上haproxy+keepalived的高可用配置与lvs+keepalived没有非常大的差异。
配置haproxy
#在两个ka1和ka2先实现haproxy的配置
[root@rhel7-ka1 & ka2 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check
启用内核参数
因为虚拟VIP在ka2为未成为主服务器时不存在于ka2上,为了让ka2能够监听VIP需要启用内核参数
#在两个ka1和ka2两个节点启用内核参数
[root@rhel7-ka1 & ka2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
[root@rhel7-ka1 & ka2 ~]# sysctl -p
在ka1中编写检测脚本实现ka1-haproxy下线时自动切换主从
#在ka1中编写检测脚本
[root@rhel7-ka1 ~]# vim /etc/keepalived/scripts/haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
[root@rhel7-ka1 ~]# chmod +X /etc/keepalived/scripts/haproxy.sh
配置keeplived
#在ka1中配置keepalived
[root@ka1-centos8 ~]#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 ens33
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev ens33 label ens33:0
}
track_script {
check_haproxy
}
}
示例:
希望本文能够对您的keepalived的学习或者配置提供帮助