Keepalived 双机热备基础
Keepalived 核心作用
-
专为 LVS 设计的辅助工具,提供故障切换(Failover)**与**健康检查(Health Checking)。
-
主节点故障时自动切换至备用节点,主节点恢复后重新接管业务。
-
非 LVS 环境可独立作为热备软件使用。
热备原理:VRRP 协议
-
虚拟路由冗余协议,以软件实现 Linux 服务器多机热备。
-
多台服务器组成热备组,共享 ** 虚拟 IP(VIP / 漂移 IP)** 对外提供服务。
-
同一时刻仅主节点提供服务,备用节点冗余;主节点失效,备用节点按优先级接替 VIP。
-
Keepalived 自动管理 VIP,无需手动配置虚接口。
Keepalived 安装与服务
-
安装:OpenEuler24 系统用 DNF/YUM 安装
keepalived、ipvsadm(LVS 环境必需)、nginx。 -
服务控制:设置开机自启
systemctl enable keepalived。
双机热备核心配置规则
- 配置文件:
/etc/keepalived/keepalived.conf。 - 全局配置
global_defs:指定router_id(本服务器名称)。 - VRRP 实例
vrrp_instance:state:MASTER(主)/BACKUP(备)。priority:优先级,数值越高越优先,主节点优先级高于备节点。interface:承载 VIP 的物理网卡。virtual_router_id:热备组内一致。advert_int:心跳通告间隔。authentication:热备组内认证信息一致。virtual_ipaddress:漂移 VIP 地址。
- 主备节点差异:
router_id、state、priority不同,其余配置一致。
双机热备验证逻辑
-
连通性:ping VIP,主节点宕机仅丢 1-2 个包即恢复。
-
服务访问:主节点正常访问主节点服务,主节点故障切换至备节点服务。
-
日志查看:
/var/log/messages记录 MASTER/BACKUP 状态切换。
LVS+Keepalived 高可用集群
核心优势
-
实现 LVS 负载调度器热备切换,提升可用性。
-
自动对后端节点健康检查,移除失效节点,恢复后重新加入。
-
无需手动执行
ipvsadm,Keepalived 自动管理 LVS 规则。
集群架构(DR 模式)
-
至少 2 台热备负载调度器(主 + 从)。
-
3 台及以上后端节点服务器,搭配 NFS 共享保证页面一致。
-
统一 VIP 对外提供服务。
Keepalived 配置 LVS 核心段
-
virtual_server VIP 端口:定义虚拟服务器。 -
delay_loop:健康检查间隔。 -
lb_algo:负载调度算法(如 rr 轮询)。 -
lb_kind:集群模式(DR 直接路由)。 -
protocol:传输协议(TCP)。 -
real_server:后端真实节点,配置权重与 TCP 健康检查。
DR 模式节点服务器要求
-
配置 ARP 内核参数:
arp_ignore=1、arp_announce=2。 -
环回口
lo:0配置 VIP,添加本地路由指向 VIP。
集群验证逻辑
-
客户端通过 VIP 正常访问 Web 服务。
-
主 / 从调度器任一故障,服务不中断。
-
用
ipvsadm -ln/ipvsadm -lnc查看负载分配。
实验案例
一、Keepalived 双机热备实验步骤
1. 基础环境准备(主、备服务器均执行)
①关闭 NetworkManager、防火墙
systemctl stop NetworkManager
systemctl stop firewalld
②关闭 SELinux
setenforce 0
③安装 Keepalived 与 ipvsadm 并设置开机自启
yum -y install keepalived ipvsadm
systemctl enable keepalived
2. 主服务器配置
①备份配置文件
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
②编辑 keepalived.conf 配置文件
vi keepalived.conf
配置内容
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.172
}
}
③启动 Keepalived 服务
systemctl start keepalived
④查看 VIP 是否绑定成功
ip add show dev ens33
3. 备用服务器配置
①执行与主服务器相同的基础环境准备
②备份配置文件
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
③编辑 keepalived.conf 配置文件
vim keepalived.conf
配置内容
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.172
}
}
④启动 Keepalived 服务
systemctl start keepalived
4. 功能测试
①客户端执行 ping 测试
ping 192.168.10.172
②断开主服务器网络,观察 ping 连通性,验证 VIP 自动漂移
③恢复主服务器网络,验证 VIP 自动切回
二、LVS+Keepalived 高可用实验步骤
1. 主调度器配置
①基础环境准备(同双机热备)
②备份配置文件
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
③编辑 keepalived.conf 配置文件
vim keepalived.conf
④配置内容
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.172
}
}
virtual_server 192.168.10.172 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
! persistence_timeout 50
protocol TCP
real_server 192.168.10.103 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.104 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
⑤配置内核参数
vi /etc/sysctl.conf
添加内容:
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
⑥生效内核参数
sysctl -p
⑦启动 Keepalived 服务
systemctl start keepalived
2. 从调度器配置
①基础环境准备(同主调度器)
②备份配置文件
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
③编辑 keepalived.conf 配置文件
vim keepalived.conf
配置内容
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.172
}
}
virtual_server 192.168.10.172 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
! persistence_timeout 50
protocol TCP
real_server 192.168.10.101 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
④配置与主调度器相同的内核参数并生效
⑤启动 Keepalived 服务
systemctl start keepalived
3. Web 节点服务器(web1、web2)配置
①关闭防火墙
systemctl stop firewalld
②配置 lo 接口 VIP
ip addr add 192.168.10.172/32 dev lo label lo:0
nmcli c reload
nmcli c up lo
③添加本地路由
ip route add local 192.168.10.172/32 dev lo
④配置开机自启 VIP 与路由
vi /etc/rc.local
添加内容:
ip addr add 192.168.10.172/32 dev lo label lo:0
ip route add local 192.168.10.172/32 dev lo
⑤给 rc.local 添加执行权限
chmod +x /etc/rc.local
⑥配置 ARP 内核参数
vi /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
⑦生效内核参数
sysctl -p
⑧安装 httpd 并配置测试页面
-
web1:
yum -y install httpd
echo "test web01" > /var/www/html/index.html
systemctl start httpd -
web2:
yum -y install httpd
echo "test web02" > /var/www/html/index.html
systemctl start httpd