一、核心概念与原理
1.1 核心组件拆解
| 组件 | 中文名称 | 核心作用 | 通俗理解 |
|---|---|---|---|
| Keepalived | 高可用热备工具 | 基于 VRRP 实现 VIP 漂移、节点健康检查、主备自动切换 | 集群的 "哨兵",主节点挂了自动接管,主节点恢复后重新掌权 |
| LVS | Linux 虚拟服务器 | 内核级四层负载均衡,支持 DR/NAT/TUN 三种模式 | 流量的 "调度员",把客户端请求分发给后端真实服务器 |
| Director | 调度器 | 运行 LVS+Keepalived,负责接收客户端请求并分发 | 流量入口的 "老大",主调度器(MASTER)负责服务,备调度器(BACKUP)待命 |
| Real Server | 真实服务器 | 运行业务服务(如 Nginx/Web),处理实际请求 | 真正干活的 "打工人",多台 RS 实现业务集群 |
| VIP | 虚拟 IP | 漂移 IP,客户端统一访问的入口 | 固定的 "访问地址",在主备调度器间自动转移 |
1.2 核心原理:VRRP 协议与 LVS-DR 模式
(1)VRRP 协议(双机热备核心)
VRRP(虚拟路由冗余协议)是 Keepalived 实现高可用的底层协议,核心逻辑如下:
- 角色选举 :主备调度器组成热备组,通过
priority(优先级)选举主节点(MASTER),优先级高的节点抢占 VIP; - 心跳检测:主节点每秒发送 VRRP 通告报文(心跳),备节点(BACKUP)持续监听;
- 故障切换:备节点未收到心跳则判定主节点故障,立即抢占 VIP 并接管服务;
- 故障恢复:主节点恢复后,默认会重新抢占 VIP(可配置非抢占模式)。
(2)LVS-DR 模式(高性能首选)
DR(直接路由)模式是 LVS 最常用的模式,核心特点是请求经 LVS 分发,响应直接返回客户端,性能拉满:
- 客户端访问 VIP,请求到达主调度器(LVS);
- LVS 修改数据包的目标 MAC 地址为后端 RS 的 MAC,IP 不变(目标仍为 VIP);
- RS 收到请求后,通过 lo 接口的 VIP 处理业务;
- RS 直接将响应返回给客户端(源 IP 为 VIP),无需经过 LVS。
1.3 实验环境规划
本次实验共 4 台服务器,基于 OpenEuler24 搭建,IP 规划如下:
| 角色 | 主机名 | IP 地址 | 核心服务 |
|---|---|---|---|
| 主调度器(MASTER) | lb01 | 192.168.10.101 | Keepalived+LVS+ipvsadm |
| 备调度器(BACKUP) | lb02 | 192.168.10.102 | Keepalived+LVS+ipvsadm |
| 真实服务器 1(RS1) | web01 | 192.168.10.103 | Nginx+Web 服务 |
| 真实服务器 2(RS2) | web02 | 192.168.10.104 | Nginx+Web 服务 |
| 虚拟 IP(VIP) | - | 192.168.10.100 | 客户端统一访问入口 |
二、实验步骤一:Keepalived 双机热备基础配置
2.1 所有节点通用初始化(必做)
(1)关闭防火墙与 SELinux(测试环境)
生产环境需开放对应端口,测试环境直接关闭简化配置:
bash
运行
# 关闭防火墙并禁用开机自启
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
(2)安装核心软件
主备调度器需安装 Keepalived(高可用)、ipvsadm(LVS 管理工具);RS 节点安装 Nginx(Web 服务):
bash
运行
# 主备调度器(lb01/lb02)执行
yum install -y keepalived ipvsadm
# 真实服务器(web01/web02)执行
yum install -y nginx
(3)设置服务开机自启
bash
运行
# 主备调度器
systemctl enable keepalived
# RS节点
systemctl enable nginx
2.2 主调度器(lb01)Keepalived 配置
(1)进入配置目录并备份模板
Keepalived 主配置文件为/etc/keepalived/keepalived.conf,先备份模板避免误操作:
bash
运行
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
# 编辑配置文件
vi keepalived.conf
(2)完整配置内容
bash
运行
! Configuration File for keepalived
# 全局配置段
global_defs {
router_id LB01 # 服务器唯一标识,主备节点需不同
}
# VRRP热备实例配置
vrrp_instance VI_1 {
state MASTER # 角色为MASTER(主调度器)
interface ens33 # 承载VIP的物理网卡(根据实际环境修改)
virtual_router_id 1 # 虚拟路由ID,主备节点必须一致
priority 100 # 优先级,数值越大越优先(主备需不同)
advert_int 1 # 心跳间隔(秒),默认1秒
# 认证配置,防止非法节点抢占
authentication {
auth_type PASS # 密码认证
auth_pass 123456# 认证密码,主备节点必须一致
}
# 虚拟IP(VIP)配置,可多个
virtual_ipaddress {
192.168.10.100/24
}
}
2.3 备调度器(lb02)Keepalived 配置
备节点配置与主节点基本一致,仅修改 3 个关键参数:router_id、state、priority。
(1)进入配置目录并备份模板
bash
运行
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
vi keepalived.conf
(2)完整配置内容
bash
运行
! Configuration File for keepalived
global_defs {
router_id LB02 # 与主节点不同的标识
}
vrrp_instance VI_1 {
state BACKUP # 角色为BACKUP(备调度器)
interface ens33 # 与主节点一致的物理网卡
virtual_router_id 1 # 与主节点一致的虚拟路由ID
priority 99 # 优先级低于主节点(100>99)
advert_int 1 # 与主节点一致的心跳间隔
authentication {
auth_type PASS
auth_pass 123456 # 与主节点一致的认证密码
}
virtual_ipaddress {
192.168.10.100/24
}
}
2.4 启动 Keepalived 并验证双机热备
(1)启动服务(主备节点均执行)
bash
运行
systemctl start keepalived
(2)验证 VIP 绑定(主节点 lb01)
执行ip addr show dev ens33,若输出中包含192.168.10.100/24,说明 VIP 已绑定主节点:
bash
运行
[root@lb01 ~]# 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 192.168.10.255 scope global ens33
inet 192.168.10.100/32 scope global ens33 # VIP绑定成功
valid_lft forever preferred_lft forever
(3)验证备节点(lb02)
备节点执行ip addr show dev ens33,无 VIP 绑定,处于监听状态:
bash
运行
[root@lb02 ~]# 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.102/24 brd 192.168.10.255 scope global ens33
# 无VIP绑定,正常
(4)故障切换测试(核心验证)
模拟主节点故障,关闭 lb01 的 Keepalived 服务,观察 VIP 是否漂移到 lb02:
bash
运行
# 主节点lb01执行
systemctl stop keepalived
# 主节点验证:VIP消失
ip addr show dev ens33 | grep 192.168.10.100
# 备节点lb02验证:VIP绑定
ip addr show dev ens33 | grep 192.168.10.100
预期结果:lb02 成功绑定 VIP,双机热备生效;恢复 lb01 的 Keepalived 服务,VIP 自动切回主节点(默认抢占模式)。
2.5 补充知识点:非抢占模式配置
默认情况下,主节点恢复后会抢占 VIP,若需避免频繁切换,可配置非抢占模式 (主备节点均添加nopreempt):
bash
运行
vrrp_instance VI_1 {
state BACKUP # 备节点保持BACKUP
interface ens33
virtual_router_id 1
priority 99
advert_int 1
nopreempt # 开启非抢占模式
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.10.100/24
}
}
说明:非抢占模式下,主节点恢复后不会主动抢占 VIP,需手动切换或等待备节点故障。
三、实验步骤二:LVS+Keepalived DR 模式高可用集群部署
3.1 真实服务器(RS)配置(web01/web02)
RS 节点需绑定 VIP 到 lo 接口,并配置 ARP 策略(避免 RS 响应非本地 ARP 请求,防止 IP 冲突)。
(1)临时绑定 VIP 到 lo 接口
bash
运行
# 临时绑定(重启失效)
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100
# 验证
ifconfig lo:0 | grep 192.168.10.100
(2)配置 ARP 内核参数(永久生效)
bash
运行
# 配置lo接口ARP参数
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
# 配置所有接口ARP参数
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
# 永久生效(写入配置文件)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
# 加载配置
sysctl -p
(3)启动 Nginx 并配置测试页面
bash
运行
# 启动Nginx
systemctl start nginx
# web01配置页面(标识RS1)
echo "Web01 - Real Server 1" >/usr/share/nginx/html/index.html
# web02配置页面(标识RS2)
echo "Web02 - Real Server 2" >/usr/share/nginx/html/index.html
# 验证RS本地访问
curl http://192.168.10.103 # web01
curl http://192.168.10.104 # web02
3.2 主备调度器(LVS)配置(lb01/lb02)
调度器需配置 LVS-DR 规则,结合 Keepalived 实现负载均衡与高可用。
(1)加载 LVS 内核模块
bash
运行
modprobe ip_vs
# 验证模块加载
lsmod | grep ip_vs
(2)主调度器(lb01)LVS+Keepalived 配置
修改/etc/keepalived/keepalived.conf,添加virtual_server段配置 LVS 规则:
bash
运行
! Configuration File for keepalived
global_defs {
router_id LB01
}
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 {
192.168.10.100/24
}
}
# LVS虚拟服务器配置(DR模式)
virtual_server 192.168.10.100 80 {
delay_loop 2 # 健康检查间隔(秒)
lb_algo wrr # 调度算法:加权轮询(WRR)
lb_kind DR # 转发模式:直接路由(DR)
persistence_timeout 50 # 会话保持时间(秒)
protocol TCP # 协议:TCP
# 真实服务器1配置
real_server 192.168.10.103 80 {
weight 1 # 权重
TCP_CHECK { # TCP健康检查
connect_timeout 10 # 连接超时时间(秒)
nb_get_retry 3 # 重试次数
delay_before_retry 3 # 重试间隔(秒)
connect_port 80 # 检测端口
}
}
# 真实服务器2配置
real_server 192.168.10.104 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
(3)备调度器(lb02)LVS+Keepalived 配置
与主节点配置一致,仅修改router_id、state、priority:
bash
运行
! Configuration File for keepalived
global_defs {
router_id LB02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.10.100/24
}
}
virtual_server
| 角色 | IP 地址 | 服务 |
|---|---|---|
| Master(主调度器) | 192.168.10.10 | Keepalived + LVS |
| Backup(备调度器) | 192.168.10.11 | Keepalived + LVS |
| Real Server1(Web1) | 192.168.10.12 | Nginx |
| Real Server2(Web2) | 192.168.10.13 | Nginx |
| VIP(虚拟 IP) | 192.168.10.100 | 对外统一入口 |
2.2 系统初始化(所有机器都执行)
bash
运行
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 安装依赖
yum install -y wget net-tools ipvsadm keepalived nginx
三、实验一:Keepalived 双机热备配置
3.1 Master 主节点配置(192.168.10.10)
编辑配置文件:
bash
运行
vi /etc/keepalived/keepalived.conf
内容如下:
bash
运行
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/24
}
}
3.2 Backup 备节点配置(192.168.10.11)
bash
运行
vi /etc/keepalived/keepalived.conf
内容如下:
bash
运行
global_defs {
router_id LVS_BACKUP
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/24
}
}
3.3 启动服务
bash
运行
systemctl start keepalived
systemctl enable keepalived
3.4 查看 VIP 是否绑定成功
Master 上执行:
bash
运行
ip addr
能看到 192.168.10.100 说明成功。
3.5 故障切换测试
- 停掉 Master 的 keepalived:
bash
运行
systemctl stop keepalived
- 在 Backup 上查看:
bash
运行
ip addr
VIP 会自动漂移到 Backup,实验一完成。
四、实验二:LVS-DR + Keepalived 高可用集群
4.1 Real Server 配置(两台 Web 都执行)
4.1.1 在 lo 网卡绑定 VIP
bash
运行
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 up
4.1.2 抑制 ARP 响应(关键步骤)
bash
运行
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
永久生效:
bash
运行
vi /etc/sysctl.conf
添加:
plaintext
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
执行:
bash
运行
sysctl -p
4.1.3 启动 Nginx 并设置测试页面
bash
运行
systemctl start nginx
Web1:
bash
运行
echo "RS1 - 192.168.10.12" > /usr/share/nginx/html/index.html
Web2:
bash
运行
echo "RS2 - 192.168.10.13" > /usr/share/nginx/html/index.html
4.2 Master 调度器完整配置(LVS+Keepalived)
bash
运行
vi /etc/keepalived/keepalived.conf
完整配置:
bash
运行
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/24
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.10.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.10.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
4.3 Backup 调度器配置
只需要修改:
- state BACKUP
- priority 100其他 LVS 部分完全一样。
4.4 重启 Keepalived 生效
bash
运行
systemctl restart keepalived
4.5 查看 LVS 规则
bash
运行
ipvsadm -Ln
能看到 VIP 和两台 RS,说明配置成功。
五、测试验证
5.1 访问 VIP
在浏览器或 curl 访问:
plaintext
http://192.168.10.100
不断刷新,会轮流出现:
- RS1 - 192.168.10.12
- RS2 - 192.168.10.13
负载均衡生效。
5.2 主调度器故障测试
关闭 Master:
bash
运行
systemctl stop keepalived
再次访问 VIP,仍然可以打开网页,说明 自动切换成功。
5.3 后端 RS 故障测试
关掉 Web1 的 Nginx:
bash
运行
systemctl stop nginx
访问 VIP,只会出现 Web2,说明 健康检查生效。
六、补充知识点
6.1 Keepalived 核心作用
- 实现 VRRP 协议,做双机热备
- 自动检测节点故障
- 自动漂移 VIP
- 可以配置脚本实现服务监控
6.2 LVS 三种模式
- NAT 模式:请求和回包都走 LVS,性能一般
- TUN 模式:IP 隧道,跨网段
- DR 模式 :直接路由,生产最常用,性能最高
6.3 DR 模式为什么要抑制 ARP?
因为 RS 也配置了 VIP,如果不抑制 ARP,客户端会直接找到 RS,不会走 LVS 调度器。
6.4 LVS 调度算法
- rr:轮询
- wrr:加权轮询
- sh:源地址哈希(会话保持)
- dh:目标地址哈希
- lblc:基于局部性的最少连接
6.5 VRRP 工作原理
- 多台设备组成一个虚拟路由
- 优先级高的成为 Master
- Master 发广播心跳
- Backup 收不到心跳则认为 Master 宕机
- 优先级最高的 Backup 升级为新 Master
6.6 生产环境注意事项
- 防火墙必须放行 VRRP 协议(协议号 112)
- 不要在虚拟机随便漂移网卡
- 生产建议使用
nopreempt非抢占模式 - 健康检查要配置合理,避免误切换
- 监控脚本可以扩展监控 Nginx、MySQL、业务端口