在微服务架构与高并发场景下,高可用和负载均衡是保障系统稳定性的两大核心支柱。本文将深入剖析 Keepalived 与 LVS-DR 模式的协同工作机制,并通过完整的实战实验,带你从零构建一套具备故障自动切换能力的高性能集群架构。
一、核心机制深度解析:VRRP 与 LVS-DR 如何协同工作
要理解 Keepalived 的高可用能力,必须先从 VRRP(虚拟路由冗余协议) 说起。VRRP 的核心思想是将多台物理路由器虚拟成一台逻辑路由器,对外呈现唯一的虚拟 IP(VIP)。
其工作流程如下:
- 角色选举:主备节点通过优先级(
priority)竞争 MASTER 角色,优先级高者抢占 VIP; - 心跳检测:MASTER 节点周期性发送 VRRP 通告报文,BACKUP 节点持续监听;
- 故障切换:若 BACKUP 在超时时间内未收到心跳,则判定 MASTER 故障,立即接管 VIP;
- 故障恢复:MASTER 恢复后默认重新抢占 VIP(可配置为非抢占模式避免频繁切换)。
而 LVS-DR(直接路由)模式 则是高性能负载均衡的首选方案。其精妙之处在于:请求经过调度器分发,但响应数据包由后端真实服务器(RS)直接返回给客户端,绕过了调度器,从而极大提升了吞吐能力。具体流程为:客户端请求到达 VIP → LVS 修改目标 MAC 为某台 RS 的 MAC(IP 不变)→ RS 通过 lo 接口上的 VIP 处理请求 → RS 直接将响应返回客户端。
本次实验环境规划如下,共 4 台基于 OpenEuler24 的服务器:
| 组件 | 中文名称 | 核心作用 | 通俗理解 |
|---|---|---|---|
| Keepalived | 高可用热备工具 | 基于 VRRP 实现 VIP 漂移、节点健康检查、主备自动切换 | 集群的 “哨兵”,主节点挂了自动接管,主节点恢复后重新掌权 |
| LVS | Linux 虚拟服务器 | 内核级四层负载均衡,支持 DR/NAT/TUN 三种模式 | 流量的 “调度员”,把客户端请求分发给后端真实服务器 |
| Director | 调度器 | 运行 LVS+Keepalived,负责接收客户端请求并分发 | 流量入口的 “老大”,主调度器(MASTER)负责服务,备调度器(BACKUP)待命 |
| Real Server | 真实服务器 | 运行业务服务(如 Nginx/Web),处理实际请求 | 真正干活的 “打工人”,多台 RS 实现业务集群 |
| VIP | 虚拟 IP | 漂移 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 双机热备配置
在开始配置之前,所有节点都需要完成统一的初始化操作。测试环境下,为了简化配置流程,我们直接关闭防火墙与 SELinux:
# 关闭防火墙并禁用开机自启
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
接下来安装核心软件。主备调度器需要安装 Keepalived(高可用)和 ipvsadm(LVS 管理工具),而后端 RS 节点则安装 Nginx 提供 Web 服务:
# 主备调度器(lb01/lb02)执行
yum install -y keepalived ipvsadm
# 真实服务器(web01/web02)执行
yum install -y nginx
安装完成后,设置服务开机自启,确保系统重启后集群能自动恢复:
# 主备调度器
systemctl enable keepalived
# RS节点
systemctl enable nginx
现在进入主调度器(lb01)的配置环节。Keepalived 的主配置文件为 /etc/keepalived/keepalived.conf,建议先备份模板再进行修改:
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
# 编辑配置文件
vi keepalived.conf
以下是主调度器的完整配置内容,重点关注 state MASTER、priority 150 以及 virtual_ipaddress 中的 VIP 定义:
! 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
}
}
备调度器(lb02)的配置与主节点基本一致,仅需修改三个关键参数:state 改为 BACKUP、priority 改为较低值(如 100)、router_id 改为唯一标识。同样先备份模板:
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
vi keepalived.conf
备节点的完整配置如下:
! 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
}
}
配置完成后,在主备节点分别启动 Keepalived 服务:
systemctl start keepalived
✅ 验证环节:在主节点 lb01 上执行 ip a,若输出中包含 VIP 地址,说明绑定成功:
[root@lb01 ~]# ip addr show dev ens33
2: ens33: 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
而在备节点 lb02 上执行相同命令,应看不到 VIP,表明其正处于监听状态:
[root@lb02 ~]# ip addr show dev ens33
2: ens33: 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绑定,正常
故障切换测试:这是验证高可用能力的核心步骤。关闭 lb01 的 Keepalived 服务,观察 VIP 是否自动漂移到 lb02:
# 主节点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 恢复后,默认抢占模式下 VIP 会自动切回。如果希望避免频繁切换,可以配置非抢占模式,在主备节点的 vrrp_instance 中添加 nopreempt 参数:
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,需要手动干预或等待备节点故障,适合对稳定性要求极高的生产环境。
[AFFILIATE_SLOT_1]三、LVS-DR + Keepalived 高可用集群部署实战
在双机热备的基础上,我们进一步集成 LVS 实现负载均衡。首先配置后端真实服务器(web01/web02),需要将 VIP 绑定到 lo 接口并配置 ARP 抑制策略:
# 临时绑定(重启失效)
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
ARP 抑制是 DR 模式的关键步骤,通过修改内核参数确保 RS 不会响应非本地 ARP 请求,防止客户端绕过调度器直接访问 RS:
# 配置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
随后启动 Nginx 并配置测试页面,用于后续验证负载均衡效果:
# 启动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
接下来配置调度器。首先加载 LVS 内核模块:
modprobe ip_vs
# 验证模块加载
lsmod | grep ip_vs
然后在主调度器(lb01)的 Keepalived 配置中添加 virtual_server 段,定义 LVS-DR 转发规则。注意 lb_kind 必须设置为 DR,persistence_timeout 可根据业务需求决定是否启用会话保持:
! 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
}
}
}
备调度器(lb02)的 LVS 配置与主节点完全一致,仅需调整 state、priority 和 router_id 三个参数:
! 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
作为补充,以下是完整的系统初始化命令汇总,适用于所有机器:
# 关闭防火墙
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
四、完整实验流程:从双机热备到 LVS 负载均衡
为了让大家更清晰地掌握整个部署流程,这里梳理一套标准化的实验步骤。首先是 Master 主节点(192.168.10.10)的配置:
vi /etc/keepalived/keepalived.conf
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
}
}
接着配置 Backup 备节点(192.168.10.11):
vi /etc/keepalived/keepalived.conf
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
}
}
启动服务后,在 Master 上执行 ip a 查看 VIP 是否绑定成功:
systemctl start keepalived
systemctl enable keepalived
ip addr
故障切换测试同样简单直接——停掉 Master 的 Keepalived,在 Backup 上观察 VIP 是否漂移过来:
systemctl stop keepalived
ip addr
接下来是 LVS-DR 集群的完整配置。两台 Real Server 都需要执行以下操作,包括绑定 VIP 到 lo 接口、抑制 ARP 响应、启动 Nginx 并设置差异化测试页面:
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 up
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
vi /etc/sysctl.conf
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
sysctl -p
systemctl start nginx
echo "RS1 - 192.168.10.12" > /usr/share/nginx/html/index.html
echo "RS2 - 192.168.10.13" > /usr/share/nginx/html/index.html
Master 调度器的完整 LVS+Keepalived 配置如下:
vi /etc/keepalived/keepalived.conf
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
}
}
}
Backup 调度器仅需修改 state BACKUP 和 priority 100,其余 LVS 部分保持一致。重启 Keepalived 使配置生效:
systemctl restart keepalived
通过 ipvsadm -Ln 查看 LVS 规则,若能看到 VIP 和两台 RS 的记录,说明配置成功:
ipvsadm -Ln
五、测试验证与生产环境注意事项
访问 VIP 地址进行最终验证。在浏览器或终端中执行 curl 命令,不断刷新页面,应该会轮流出现两台 RS 的测试内容,表明负载均衡已生效:
http://192.168.10.100
关闭 Master 调度器后再次访问 VIP,网页仍可正常打开,证明高可用切换成功:
systemctl stop keepalived
关掉 Web1 的 Nginx 后访问 VIP,只会出现 Web2 的内容,说明健康检查机制正常工作:
systemctl stop nginx
⚠️ 生产环境注意事项:
- 防火墙必须放行 VRRP 协议(协议号 112),否则心跳通信会中断;
- 避免在虚拟机环境中随意漂移网卡,可能导致网络异常;
- 建议使用
nopreempt非抢占模式减少不必要的切换; - 健康检查间隔和超时时间要合理配置,避免误判导致频繁切换;
- 监控脚本可扩展至 Nginx、MySQL、业务端口等更细粒度的服务检测。
补充几个关键知识点:LVS 支持三种模式——NAT 模式(请求和回包都走 LVS,性能一般)、TUN 模式(IP 隧道,支持跨网段)、DR 模式(直接路由,生产环境最常用,性能最高)。调度算法方面,rr 为轮询、wrr 为加权轮询、sh 为源地址哈希(支持会话保持)、dh 为目标地址哈希、lblc 为基于局部性的最少连接。
总结
Keepalived 通过 VRRP 协议实现 VIP 的自动漂移与故障切换,LVS-DR 模式则提供了高性能的负载均衡能力。两者结合,构成了分布式系统架构中高可用与高并发的基石。掌握这套方案,不仅能够应对传统 IDC 场景,也为微服务架构下的流量入口高可用提供了坚实保障。建议在实际生产部署前,充分测试故障切换逻辑与健康检查策略,确保集群稳定运行。
浙公网安备 33010602011771号