一、Keepalived 双机热备基础知识
Keepalived 起初是专门针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(Health Checking)功能 ------ 判断 LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到 backup 节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。
二、使用 Keepalived 实现双机热备
Keepalived 的设计目标是构建高可用的 LVS 负载均衡群集,可以调用 ipvsadm 工具来创建虚拟服务器、管理服务器池,而不仅仅用作双机热备。使用 Keepalived 构建 LVS 群集更加简便易用,主要优势体现在:对 LVS 负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。
在基于 LVS + Keepalived 实现的 LVS 群集结构中,至少包括两台热备的负载调度器,三台以上的节点服务器。本节将以 DR 模式的 LVS 群集为基础,增加一台从负载调度器,使用 Keepalived 来实现主、从调度器的热备,从而构建兼有负载均衡、高可用两种能力的 LVS 网站群集平台,如图所示

操作系统 | 配置 | IP | 服务 |
---|---|---|---|
OpenEuler24 | 2C4G | 192.168.10.101 | Keepalived/ipvsadm |
OpenEuler24 | 2C4G | 192.168.10.102 | Keepalived/ipvsadm |
OpenEuler24 | 2C4G | 192.168.10.103 | httpd |
OpenEuler24 | 2C4G | 192.168.10.104 | httpd |
OpenEuler24 | 2C4G | 192.168.10.105 | nfs-utils/rpcbind |
[资源列表] |
1、基础配置
关闭各节点防火墙及内核保护
bash
systemctl stop firewalld
setenforce 0

2、安装服务
101与102节点:

3、配置调度器
101:

bash
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_01
vrrp_skip_check_adv_addr
关闭严格模式
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 定义 VRRP 实例,用于实现虚拟路由冗余(主备切换)
vrrp_instance VI_1 {
# 实例状态,MASTER 表示主设备,BACKUP 为备设备,主备通过优先级选举
state MASTER
# 绑定的物理网卡(根据实际环境调整,如 ens33 等),用于发送 VRRP 报文
interface ens160
# 虚拟路由标识,同一 VRRP 组要一致,区分不同组
virtual_router_id 51
# 优先级,数值越大优先级越高,主设备优先级应高于备设备
priority 100
# VRRP 通告间隔(秒),主备间定时发送心跳,确认状态
advert_int 1
# 认证配置,保证 VRRP 报文安全,避免非法设备干扰
authentication {
# 认证类型,PASS 为简单密码认证(也可用 AH 等更安全方式)
auth_type PASS
# 认证密码,主备需一致
auth_pass 1111
}
# 虚拟 IP(VIP),对外提供服务的统一 IP,主备切换时自动漂移
virtual_ipaddress {
192.168.10.200
}
}
# 定义 LVS 虚拟服务,VIP + 端口 ,这里是 192.168.10.200:80 的 HTTP 服务
virtual_server 192.168.10.200 80 {
# 健康检查间隔(秒),定期检查真实服务器状态
delay_loop 6
# 负载均衡算法,wrr(加权轮询),按权重分配请求
lb_algo wrr
# LVS 工作模式,DR(直接路由),集群内通过 MAC 地址转发,效率高
lb_kind DR
# 会话保持时间(秒),注释后不启用,启用时相同客户端请求会固定到同一服务器
#persistence_timeout 50
# 协议类型,TCP(对应 HTTP 等基于 TCP 的应用)
protocol TCP
# 定义真实服务器(RS),192.168.10.103:80 ,承载实际业务
real_server 192.168.10.103 80 {
# 服务器权重,数值越大,被分配的请求越多
weight 2
# TCP 健康检查配置,探测服务器 80 端口是否存活
TCP_CHECK {
# 检查的目标端口(与服务端口一致)
connect_port 80
# 连接超时时间(秒),超时则认为服务器异常
connect_timeout 3
# 重试次数,失败后重试几次才标记为down
retry 3
# 重试前延迟时间(秒),避免频繁重试干扰
delay_before_retry 3
}
}
# 另一台真实服务器(RS),192.168.10.104:80
real_server 192.168.10.104 80 {
# 权重 1,相比 10.103 会分配更少请求
weight 1
# 同样的 TCP 健康检查逻辑
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}

启动服务:
bash
systemctl start keepalived
查看VIP:

102:

bash
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_02
vrrp_skip_check_adv_addr
关闭严格模式
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 定义 VRRP 实例,用于实现虚拟路由冗余(主备切换)
vrrp_instance VI_1 {
# 实例状态,MASTER 表示主设备,BACKUP 为备设备,主备通过优先级选举
state BACKUP
# 绑定的物理网卡(根据实际环境调整,如 ens33 等),用于发送 VRRP 报文
interface ens160
# 虚拟路由标识,同一 VRRP 组要一致,区分不同组
virtual_router_id 51
# 优先级,数值越大优先级越高,主设备优先级应高于备设备
priority 90
# VRRP 通告间隔(秒),主备间定时发送心跳,确认状态
advert_int 1
# 认证配置,保证 VRRP 报文安全,避免非法设备干扰
authentication {
# 认证类型,PASS 为简单密码认证(也可用 AH 等更安全方式)
auth_type PASS
# 认证密码,主备需一致
auth_pass 1111
}
# 虚拟 IP(VIP),对外提供服务的统一 IP,主备切换时自动漂移
virtual_ipaddress {
192.168.10.200
}
}
# 定义 LVS 虚拟服务,VIP + 端口 ,这里是 192.168.10.200:80 的 HTTP 服务
virtual_server 192.168.10.200 80 {
# 健康检查间隔(秒),定期检查真实服务器状态
delay_loop 6
# 负载均衡算法,wrr(加权轮询),按权重分配请求
lb_algo wrr
# LVS 工作模式,DR(直接路由),集群内通过 MAC 地址转发,效率高
lb_kind DR
# 会话保持时间(秒),注释后不启用,启用时相同客户端请求会固定到同一服务器
#persistence_timeout 50
# 协议类型,TCP(对应 HTTP 等基于 TCP 的应用)
protocol TCP
# 定义真实服务器(RS),192.168.10.103:80 ,承载实际业务
real_server 192.168.10.103 80 {
# 服务器权重,数值越大,被分配的请求越多
weight 1
# TCP 健康检查配置,探测服务器 80 端口是否存活
TCP_CHECK {
# 检查的目标端口(与服务端口一致)
connect_port 80
# 连接超时时间(秒),超时则认为服务器异常
connect_timeout 3
# 重试次数,失败后重试几次才标记为down
retry 3
# 重试前延迟时间(秒),避免频繁重试干扰
delay_before_retry 3
}
}
# 另一台真实服务器(RS),192.168.10.104:80
real_server 192.168.10.104 80 {
# 权重 1,相比 10.103 会分配更少请求
weight 1
# 同样的 TCP 健康检查逻辑
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}

查看VIP:

4、配置后端服务
安装服务:
bash
dnf -y install httpd
systemctl start httpd


编写网页:
bash
echo "192.168.10.103web">/var/www/html/index.html
echo "192.168.10.104web">/var/www/html/index.html


配置LVS(DR)VIP:
bash
ip addr add 192.168.10.200/32 dev lo label lo:0


配置内核文件:
bash
vim /etc/sysctl.conf
##添加内容##
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

客户端访问:

5、高可用测试
关闭一个LVS测试:
关闭master主机101后,VIP漂移到102主机

访问不受影响

关闭一个后端服务:

访问测试时,只能访问103主机

查看策略:
自动剔除一个后端服务

重启后端服务并查看策略:


访问测试:
