目录
1.1Keepalived双机热备基础知识
Keepalived 起初是专门针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(Health Checking)功能 ------ 判断 LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到 backup 节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。
1.1.1Keepalived概述及安装
Keepalived 的官方网站位于 Keepalived for Linux,本章将以 YUM 方式讲解 Keepalived 的安装、配置和使用过程。在非 LVS 群集环境中使用时,Keepalived 也可以作为热备软件使用。
1.1.2Keepalived的热备方式
Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现 Linux 服务器的多机热备功能。VRRP 是针对路由器的一种备份解决方案 ------ 由多台路由器组成一个热备组,通过共用的虚拟 IP 地址对外提供服务;每个热备组内同一时刻只有一台主路由器提供服务,其他路由器处于冗余状态。若当前在线 的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟 IP 地址,以继续提供服务,如图 3.1 所示。
热备组内的每台路由器都可能成为主路由器,虚拟路由器的 IP 地址(VIP)可以在热备组内的路由器之间进行转移,所以也称为漂移 IP 地址。使用 Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如 ens33 :0),而是由 Keepalived 根据配置文件自动管理。

1.1.3Keepalived的安装与服务控制
(1)安装Keepalived
sql
[root@localhost ~]# yum install -y keepalived ipvsadm
(2)控制Keepalived服务
sql
[root@localhost ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
2.1使用Keepalived实现双机热备
基于 VRRP 的热备方式,Keepalived 可以用作服务器的故障切换,每个热备组可以有 多台服务器 ------ 当然,最常用的就是双机热备了。在这种双机热备方案中,故障切换主要针对虚拟 IP 地址的漂移来实现,因此能够适用于各种应用服务器(不管是 Web、FTP、Mail,还是 SSH、DNS......)。
本小节将通过一个简单的案例来说明 Keepalived 双机热备的配置方法。其中,主、备服务器的 IP 地址分别为 192.168.10.101 和 192.168.10.102,基于漂移地址 192.168.10.100 提供 Web 服务,如图 3.2 所示。

主,备服务器中都安装Keepalived,使用DNF方式安装httpd提供Web服务。
2.1.1主服务器的配置
sql
[root@localhost ~]# systemctl stop firewalld // 关闭防火墙
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf.sample keepalived.conf
[root@localhost keepalived]# vi keepalived.conf
global_defs {
router_id HA_TEST_R1 // 本路由器 (服务器) 的名称
}
vrrp_instance VI_1 { // 定义 VRRP 热备实例
state MASTER // 热备状态,MASTER 表示主服务器
interface ens33 // 承载 VIP 地址的物理接口
virtual_router_id 1 // 虚拟路由器的 ID 号,每个热备组保持一致
priority 100 // 优先级,数值越大优先级越高
advert_int 1 // 通告间隔秒数 (心跳频率)
authentication { // 认证信息,每个热备组保持一致
auth_type PASS // 认证类型
auth_pass 123456 // 密码字串
}
virtual_ipaddress { // 指定漂移地址 (VIP), 可以有多个
192.168.10.100
}
}
sql
[root@localhost keepalived]# systemctl start keepalived
[root@localhost keepalived]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff
inet 192.168.10.101/24 brd 172.16.16.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33 // 自动设置的 VIP 地址
valid_lft forever preferred_lft forever
inet6 fe80::56be:f27:2b9b:823e/64 scope link
valid_lft forever preferred_lft forever
2.1.2备用服务器的配置
sql
[root@localhost ~]# systemctl stop firewalld // 关闭防火墙
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf.sample keepalived.conf
[root@localhost keepalived]# vi keepalived.conf
global_defs {
router_id HA_TEST_R2 // 本路由器 (服务器) 的名称
}
vrrp_instance VI_1 {
state BACKUP // 热备状态,BACKUP 表示备用服务器
priority 99 // 优先级,数值应低于主服务器
...... // 省略部分内容
}
sql
[root@localhost keepalived]# systemctl start keepalived
[root@localhost keepalived]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:d1:f0:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.102/24 brd 172.16.16.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::1f08:ab66:736f:72eb/64 scope link
valid_lft forever preferred_lft forever
2.1.3测试双机热备功能
Keepalived 的日志消息保存在 /var/log/messages 文件中,在测试主、备故障自动切换功能时,可以跟踪此日志文件来观察热备状态的变化。以针对连通性和 Web 服务的测试为例,主要操作如下。
(1)连通性测试
在客户机中执行 "ping -t 192.168.10.100" 命令,能够正常、持续 ping 通,根据以下操作继续观察测试结果。
① 停止启用主服务器的 Keepalived 服务,发现 ping 测试只中断了 1 或 2 个包即恢复正常,说明已有其他服务器接替 VIP 地址,并及时响应客户机请求。
② 重新启用主服务器的 Keepalived 服务,发现 ping 测试再次中断 1 或 2 个包即恢复正常,说明主服务器已恢复正常,并夺回 VIP 地址的控制权。
(2)Web 访问测试
在 keepalived 运行的主机上启动 nginx 服务并写入不通的测试页面内容
Keepalived01
sql
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# echo "web01" >/usr/share/nginx/html/index.html
Keepalived02
sql
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# echo "web02" >/usr/share/nginx/html/index.html
在客户机中访问 http://192.168.10.100/,将看到由主服务器 192.168.10.101 提供的网页文档。
① 停止启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到由备用服务
器 192.168.10.102 提供的网页文档,说明 VIP 地址已切换至备用服务器。
② 重新启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到重新由主服
务器 192.168.10.101 提供的网页文档,说明主服务器已重新夺取 VIP 地址。
(3)查看日志记录
在执行主、备服务器故障切换的过程中,分别观察各自的 /var/log/messages 日志文件,可以看到 MASTER、SLAVE 状态的迁移记录。
① 主服务器中,Keepalived 服务状态先变为 "stop",移除 VIP 地址,恢复后重新变为 MASTER。
sql
[root@localhost ~]# less /var/log/messages
...... // 省略部分信息
Sep 11 13:32:24 localhost Keepalived[18259]: Stopping Keepalived v1.2.13 (11/05,201
6)
Sep 11 13:32:24 localhost systemd: Stopping LVS and VRRP High Availability Monito
r...
Sep 11 13:32:24 localhost Keepalived_vrrp[18261]: VRRP_Instance(VI_1) sending 0 prio
rity
Sep 11 13:32:24 localhost Keepalived_vrrp [18261]: VRRP_Instance (VI_1) removing proto
col VIPs.
...... // 省略部分信息
Sep 11 13:36:42 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Transition to
MASTER STATE
Sep 11 13:36:42 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Received lower
prio advert, forcing new election
Sep 11 13:36:43 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Entering MASTE
R STATE
Sep 11 13:36:43 localhost Keepalived_vrrp [18280]: VRRP_Instance (VI_1) setting protoc
ol VIPs.
...... // 省略部分信息
② 备用服务器中,状态先切换为 MASTER,待主服务器恢复后再交回控制权。
sql
[root@localhost ~]# less /var/log/messages
...... // 省略部分信息
Sep 11 13:12:43 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Transition to
MASTER STATE
Sep 11 13:12:44 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering MASTE
R STATE
Sep 11 13:12:44 localhost Keepalived_vrrp [25338]: VRRP_Instance (VI_1) setting protoc
ol VIPs.
...... // 省略部分信息
Sep 11 13:14:23 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Received highe
r prio advert
Sep 11 13:14:23 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering BACKU
P STATE
Sep 11 13:14:23 localhost Keepalived_vrrp [25338]: VRRP_Instance (VI_1) removing proto
col VIPs.
...... // 省略部分信息
通过上述测试过程,可以发现双机热备已经正常。客户机只要通过 VIP 地址就可以访问服务器所提供的 Web 等应用。其中,任何一台服务器失效,另一台服务器将会立即接替服务,从而实现高可用性。实际应用时,注意主、备服务器所提供的 Web 服务内容要保持一致。
3.1使用Keepalived实现双机热备的实验案例
Keepalived 的设计目标是构建高可用的 LVS 负载均衡群集,可以调用 ipvsadm 工具来创建虚拟服务器、管理服务器池,而不仅仅用作双机热备。使用 Keepalived 构建 LVS 群集更加简便易用,主要优势体现在:对 LVS 负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。
在基于 LVS+Keepalived 实现的 LVS 群集结构中,至少包括两台热备的负载调度器,三台以上的节点服务器。本节将以 DR 模式的 LVS 群集为基础,增加一台从负载调度器,使用 Keepalived 来实现主、从调度器的热备,从而构建兼有负载均衡、高可用两种能力的 LVS 网站群集平台,如图 3.3 所示。

使用 Keepalived 构建 LVS 群集时,也需要用到 ipvsadm 管理工具。但大部分工作会由 Keepalived 自动完成,不需要手动执行 ipvsadm(除了查看和监控群集以外)。下面主要讲解 Keepalived 的服务器池设置,关于 NFS 共享服务的配置、Keepalived 的热备配置等在此不再详细阐述。
操作系统 | 配置 | 主机名 | IP | 服务 |
---|---|---|---|---|
OpenEuler24 | 2C4G | lb01 | 192.168.10.101 | Keepalived/ipvsadm |
OpenEuler24 | 2C4G | lb01 | 192.168.10.102 | Keepalived/ipvsadm |
OpenEuler24 | 2C4G | web01 | 192.168.10.103 | Nginx |
OpenEuler24 | 2C4G | web02 | 192.168.10.104 | Nginx |
OpenEuler24 | 2C4G | nfs-server | 192.168.10.105 | nfs-utils/rpcbind |
3.1.1基础环境配置
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭内核安全机制
setenforce 0
安装Keepalived以及ipvsadm
dnf -y install keepalived ipvsadm
3.1.2配置主调度器
(1)全局配置,热备配置
sql
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_HA_R1 // 主调度器的名称
}
vrrp_instance VI_1 {
state MASTER // 主调度器的热备状态
interface ens33
virtual_router_id 1
priority 100 // 主调度器的优先级
advert_int 1
authentication { // 主、从热备认证信息
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { // 指定群集 VIP 地址
192.168.10.100
}
}
(2)Web服务器池配置
sql
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
...... #省略部分信息
virtual_server 192.168.10.100 80 {#虚拟服务器地址 (VIP)、端口
delay_loop 15 #健康检查的间隔时间 (秒)
lb_algo rr #轮询 (rr) 调度算法
lb_kind DR #直接路由 (DR) 群集工作模式
! persistence 60 #连接保持时间 (秒), 若启用请去掉!号
protocol TCP #应用服务采用的是 TCP 协议
real_server 192.168.10.103 80 { #第一个 Web 节点的地址、端口
weight 1 #节点的权重
TCP_CHECK { #健康检查方式
connect_port 80 #检查的目标端口
connect_timeout 3 #连接超时 (秒)
nb_get_retry 3 #重试次数
delay_before_retry 4 // 重试间隔 (秒)
}
}
}
real_server 192.168.10.104 80 { #第二个 Web 节点的地址、端口
...... #省略部分信息
}
}
sql
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 两个 DS,一个为 MASTER 一个为 BACKUP
interface ens33 # 当前 IP 对应的网络接口,通过 ifconfig 查询
virtual_router_id 62# 虚拟路由 ID (0 - 255),在一个 VRRP 实例中主备服务器 ID 必须一样
priority 100 # 优先级值设定:MASTER 要比 BACKUP 的值大
advert_int 1 # 通告时间间隔:单位秒,主备要一致
authentication { # 认证机制,主从节点保持一致即可
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100 # VIP,可配置多个
}
}
vim keepalived
virtual_server 192.168.10.100 80 {
delay_loop 3 # 设置健康状态检查时间
lb_algo rr # 调度算法,这里用了 rr 轮询算法
lb_kind DR # 这里测试用了 Direct Route 模式
persistence_timeout 50 # 持久连接超时时间,注意添加此项配置客户端连续请求时,请求到同一节点
protocol TCP
real_server 192.168.10.103 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3 # 旧版本为 nb_get_retry
delay_before_retry 3# 重试间隔 3 秒
connect_port 80
}
}
real_server 192.168.10.104 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 80
}
}
}
(3)重新启动Keepalived服务
systemctl restart keepalived
3.1.3配置从调度器
sql
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_HA_R2
// 从调度器的名称
}
vrrp_instance VI_1 {
state BACKUP // 从调度器的热备状态
priority 90 // 从调度器的优先级
...... // 省略部分信息
}
virtual_server 192.168.10.100 80 {
...... // 省略部分信息
}
[root@localhost ~]# systemctl restart keepalived
3.1.4配置Web节点服务器
sql
bash
# 修改为自己的 VIP
vip=192.168.207.200
case $1 in
start)
# 设置 ARP 参数
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
# 临时添加 VIP(重启失效)
sudo ip addr add ${vip}/32 dev lo label lo:0
# 临时添加路由(重启失效)
sudo ip route add local ${vip}/32 dev lo
# 永久生效(通过 rc.local 或 NetworkManager 脚本)
echo "ip addr add ${vip}/32 dev lo label lo:0" | sudo tee -a /etc/rc.local
echo "ip route add local ${vip}/32 dev lo" | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
;;
stop)
# 恢复 ARP 参数
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/default/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/default/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
# 移除临时添加的 VIP
sudo ip addr del ${vip}/32 dev lo label lo:0
# 移除临时添加的路由
sudo ip route del local ${vip}/32 dev lo
# 从 rc.local 中移除永久设置
sudo sed -i "/ip addr add ${vip}\/32 dev lo label lo:0/d" /etc/rc.local
sudo sed -i "/ip route add local ${vip}\/32 dev lo/d" /etc/rc.local
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0