前言
在数字化业务全面普及的今天,企业核心系统(电商、支付、办公、数据服务)对7×24 小时不间断服务的需求已成为硬性标准。单点服务器极易因硬件故障、网络波动、程序崩溃导致服务中断,直接造成业务损失与用户流失。
高可用(HA,High Availability)与负载均衡(LB,Load Balancing)是解决上述问题的核心技术方案:
- LVS(Linux Virtual Server):Linux 内核级负载均衡器,性能极高、支撑高并发、支持多种转发模式
- Keepalived:基于 VRRP 协议实现故障自动切换,同时提供节点健康检查,完美适配 LVS
本文基于OpenEuler24 操作系统,从原理讲解→环境准备→双机热备→LVS+Keepalived 集群→测试验证→故障排查全流程实战,手把手搭建企业级高可用负载均衡集群,可直接用于生产环境落地。
一、Keepalived 双机热备核心基础
1.1 Keepalived 是什么
Keepalived 最初专为 LVS 设计,是一款开源轻量级高可用软件,核心能力:
- 故障切换(Failover):主节点宕机,备节点秒级接管服务
- 健康检查(Health Checking):实时检测调度器 / 后端节点可用性
- 自动管理 VIP:虚拟 IP 无需手动配置虚拟网卡,由软件自动漂移
- 非 LVS 场景也可用:单独作为双机热备软件(Web、FTP、SSH 等通用服务)
1.2 VRRP 协议原理
Keepalived 基于 **VRRP(虚拟路由冗余协议)** 实现热备:
- 多台服务器组成热备组,共用一个 ** 虚拟 IP(VIP)** 对外提供服务
- 同一时刻只有 ** 主节点(MASTER)** 持有 VIP 并提供服务
- 备节点(BACKUP)持续监听心跳,主节点失效则按优先级抢占 VIP
- 主节点恢复后,自动夺回 VIP 控制权(抢占模式)
1.3 双机热备实验环境
表格
| 操作系统 | 硬件配置 | 物理 IP | 运行服务 | 角色 |
|---|---|---|---|---|
| OpenEuler24 | 2C4G | 192.168.10.101 | Keepalived+Nginx | 主节点 MASTER |
| OpenEuler24 | 2C4G | 192.168.10.102 | Keepalived+Nginx | 备节点 BACKUP |
| - | - | 192.168.10.100 | 虚拟服务 IP | VIP(漂移地址) |
1.4 Keepalived 安装与服务控制
OpenEuler24 使用 DNF/YUM 安装:
# 安装Keepalived+ipvsadm(LVS管理工具)+Nginx(测试Web服务)
yum install -y keepalived ipvsadm nginx
# 设置开机自启
systemctl enable keepalived
# 服务启停命令
systemctl start keepalived # 启动
systemctl stop keepalived # 停止
systemctl restart keepalived # 重启
systemctl status keepalived # 查看状态
二、Keepalived 双机热备完整配置
2.1 基础环境预处理
所有节点必须关闭防火墙与 SELinux,避免网络拦截:
# 临时关闭防火墙
systemctl stop firewalld
# 永久禁用防火墙
systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
2.2 主节点(192.168.10.101)配置
Keepalived 配置文件路径:/etc/keepalived/keepalived.conf
# 进入配置目录
cd /etc/keepalived/
# 备份默认配置
cp keepalived.conf.sample keepalived.conf
# 编辑配置
vi keepalived.conf
主节点核心配置:
! Configuration File for keepalived
global_defs {
router_id HA_TEST_R1 # 本节点唯一标识(自定义)
}
vrrp_instance VI_1 { # VRRP实例名(主备必须一致)
state MASTER # 角色:主节点
interface ens33 # 承载VIP的物理网卡
virtual_router_id 1 # 热备组ID(主备必须一致,0-255)
priority 100 # 优先级(越大越优先,主>备)
advert_int 1 # 心跳间隔(秒)
authentication { # 认证信息(主备必须一致)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { # 漂移VIP(可配置多个)
192.168.10.100
}
}
启动服务并验证 VIP:
systemctl start keepalived
# 查看VIP(ifconfig无法看到,必须用ip addr)
ip addr show dev ens33
执行后可看到 ens33 网卡自动添加192.168.10.100/32。
2.3 备节点(192.168.10.102)配置
备节点配置90% 与主节点一致,仅修改 3 个参数:
global_defs {
router_id HA_TEST_R2 # 不同节点标识
}
vrrp_instance VI_1 {
state BACKUP # 角色:备节点
priority 99 # 优先级低于主节点
# 其余配置完全与主节点相同
}
启动服务:
systemctl start keepalived
备节点正常运行时不会持有 VIP,仅监听主节点心跳。
2.4 双机热备功能测试
2.4.1 连通性测试
客户端执行:
ping 192.168.10.100 -t
- 停止主节点 Keepalived:
systemctl stop keepalived - Ping 仅丢 1-2 个包即恢复,说明 VIP 已漂移到备节点
- 重启主节点 Keepalived:
systemctl start keepalived - 再次短暂丢包后恢复,主节点夺回 VIP
2.4.2 Web 服务测试
# 主节点配置测试页
echo "web01-master" > /usr/share/nginx/html/index.html
systemctl start nginx
# 备节点配置测试页
echo "web02-backup" > /usr/share/nginx/html/index.html
systemctl start nginx
- 访问
http://192.168.10.100→ 显示web01-master - 主节点宕机 → 自动显示
web02-backup - 主节点恢复 → 自动切回
web01-master
2.4.3 日志查看
Keepalived 日志默认存放在/var/log/messages:
tail -f /var/log/messages
可清晰看到:
- 主节点:停止→移除 VIP→重启→MASTER 状态→添加 VIP
- 备节点:检测主节点失效→切换 MASTER→检测主节点恢复→切换 BACKUP→移除 VIP
三、LVS+Keepalived 高可用集群搭建
3.1 集群架构设计
双负载调度器热备 + 多 Web 节点集群 + NFS 共享存储,无任何单点故障:
- 主调度器:lb01(192.168.10.101)
- 备调度器:lb02(192.168.10.102)
- Web 节点:web01(103)、web02(104)
- NFS 存储:192.168.10.105(统一网页内容)
- 集群模式:LVS-DR(直接路由,性能最高)
- VIP:192.168.10.100
3.2 集群资源清单
表格
| 主机名 | 操作系统 | 配置 | IP 地址 | 核心服务 | 角色 |
|---|---|---|---|---|---|
| lb01 | OpenEuler24 | 2C4G | 192.168.10.101 | Keepalived/ipvsadm | 主负载调度器 |
| lb02 | OpenEuler24 | 2C4G | 192.168.10.102 | Keepalived/ipvsadm | 备负载调度器 |
| web01 | OpenEuler24 | 2C4G | 192.168.10.103 | Nginx | Web 业务节点 |
| web02 | OpenEuler24 | 2C4G | 192.168.10.104 | Nginx | Web 业务节点 |
| nfs-server | OpenEuler24 | 2C4G | 192.168.10.105 | nfs-utils/rpcbind | 共享存储 |
3.3 调度器基础配置
所有调度器执行:
# 加载LVS内核模块
modprobe ip_vs
# 查看LVS版本
cat /proc/net/ip_vs
# 安装依赖
yum install -y ipvsadm keepalived
# 备份配置
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
3.4 主调度器(lb01)完整配置
在双机热备基础上,添加LVS 虚拟服务器 + 后端节点池 + 健康检查配置:
! Configuration File for keepalived
global_defs {
router_id LVS_HA_R1
}
# VRRP热备配置
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
}
}
# LVS虚拟服务器配置
virtual_server 192.168.10.100 80 {
delay_loop 15 # 健康检查间隔(秒)
lb_algo rr # 调度算法:rr=轮询(支持wrr/lc/wlc等)
lb_kind DR # LVS模式:DR=直接路由(性能最优)
persistence_timeout 50 # 会话保持时间(秒)
protocol TCP # 协议类型
# 后端真实节点1
real_server 192.168.10.103 80 {
weight 1 # 节点权重
TCP_CHECK { # TCP健康检查
connect_timeout 3 # 连接超时
nb_get_retry 3 # 重试次数
delay_before_retry 4 # 重试间隔
connect_port 80 # 检查端口
}
}
# 后端真实节点2
real_server 192.168.10.104 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
connect_port 80
}
}
}
启动服务:
systemctl restart keepalived
3.5 备调度器(lb02)配置
与主调度器完全一致,仅修改 3 个参数:
global_defs {
router_id LVS_HA_R2
}
vrrp_instance VI_1 {
state BACKUP
priority 90
}
启动服务:
systemctl restart keepalived
3.6 Web 节点 DR 模式配置(最关键)
LVS-DR 模式必须抑制 ARP 响应 ,否则客户端会直接访问后端节点,导致集群失效。一键配置脚本lvs_dr.sh:
vi lvs_dr.sh
chmod +x lvs_dr.sh
脚本内容:
#!/bin/bash
vip='192.168.10.100' # 集群VIP
case "$1" in
start)
# 配置ARP抑制(DR模式核心)
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
# 本地lo网卡绑定VIP
ip addr add ${vip}/32 dev lo label lo:0
# 添加本地路由
ip route add local ${vip}/32 dev lo
# 永久生效
echo "ip addr add ${vip}/32 dev lo label lo:0" >> /etc/rc.local
echo "ip route add local ${vip}/32 dev lo" >> /etc/rc.local
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与路由
ip addr del ${vip}/32 dev lo label lo:0
ip route del local ${vip}/32 dev lo
# 清除开机自启
sed -i "/${vip}/d" /etc/rc.local
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
执行配置:
./lvs_dr.sh start
所有 Web 节点(web01/web02)都必须执行此脚本。
3.7 NFS 共享存储配置(可选)
统一 Web 节点页面内容,方便测试负载均衡:
# NFS服务器安装
yum install -y nfs-utils rpcbind
systemctl start nfs rpcbind
systemctl enable nfs rpcbind
# 配置共享目录
echo "/var/www/html 192.168.10.0/24(rw,sync,no_root_squash)" >> /etc/exports
exportfs -rv
# Web节点挂载
mount 192.168.10.105:/var/www/html /usr/share/nginx/html
四、LVS+Keepalived 集群测试验证
4.1 基础功能测试
客户端浏览器访问:http://192.168.10.100
- 多次刷新 → 页面轮询显示 web01/web02(负载均衡生效)
- 停止主调度器 → 服务不中断(备调度器自动接管)
- 停止 web01 → 流量全部切到 web02(健康检查生效)
- 重启 web01 → 自动加入集群(故障恢复)
4.2 LVS 状态查看
# 查看虚拟服务器与节点状态
ipvsadm -ln
# 查看连接状态
ipvsadm -lnc
可清晰看到:VIP、调度算法、后端节点、连接数、权重等信息。
4.3 故障切换测试
- 主调度器宕机:备调度器秒级接管 VIP,业务无感知
- Web 节点宕机:Keepalived 自动剔除,流量不转发至故障节点
- 主调度器恢复:自动夺回 VIP,继续提供服务
- Web 节点恢复:自动加入节点池,恢复负载分担
五、核心原理与关键参数说明
5.1 LVS 三种工作模式对比
表格
| 模式 | 原理 | 性能 | 适用场景 | 配置难度 |
|---|---|---|---|---|
| NAT | 网络地址转换 | 中等 | 公网入口、小型集群 | 低 |
| DR | 直接路由 | 极高 | 内网高并发、大型集群 | 中 |
| TUN | IP 隧道 | 高 | 跨网段、异地集群 | 高 |
生产环境首选 DR 模式:性能接近物理机,不修改数据包,支持百万级并发。
5.2 Keepalived 关键参数
表格
| 参数 | 作用 | 注意事项 |
|---|---|---|
| router_id | 节点唯一标识 | 主备不能相同 |
| state | 节点角色 | MASTER/BACKUP |
| priority | 优先级 | 主节点必须更高 |
| virtual_router_id | 热备组 ID | 同一组必须一致 |
| virtual_ipaddress | 漂移 VIP | 主备必须相同 |
| TCP_CHECK | 健康检查 | 自动剔除故障节点 |
| lb_algo | 调度算法 | rr = 轮询、wrr = 加权轮询、lc = 最少连接 |
5.3 高可用保障机制
- 调度器高可用:双机热备,无单点故障
- 后端节点高可用:健康检查,故障自动隔离 / 恢复
- 服务高可用:VIP 漂移,秒级切换,业务无感知
- 数据高可用:NFS 共享存储,统一业务数据
六、常见故障排查
6.1 VIP 不漂移
- 检查
virtual_router_id主备是否一致 - 检查
priority主节点是否更高 - 检查防火墙 / SELinux 是否关闭
- 检查网卡名
interface是否正确 - 查看日志:
tail -f /var/log/messages
6.2 LVS 不转发流量
- 检查
ip_vs模块是否加载:lsmod | grep ip_vs - 检查 Web 节点 ARP 抑制是否配置
- 检查调度器
lb_kind DR是否正确 - 检查后端节点 80 端口是否通:
telnet IP 80
6.3 健康检查不生效
- 检查
TCP_CHECK端口与超时配置 - 检查后端节点服务是否正常运行
- 检查网络连通性
6.4 会话保持异常
- 调整
persistence_timeout参数 - 关闭浏览器 Cookie 后重试
- 检查调度算法是否正确
七、总结
LVS+Keepalived 是企业级高可用负载均衡的黄金架构,具备以下核心优势:
- 高性能:LVS 内核级转发,支撑百万级并发
- 高可用:无单点故障,故障秒级切换
- 易维护:配置简洁,自动化程度高
- 低成本:开源免费,基于 Linux 系统,无需专用硬件
- 通用性:支持 Web、FTP、API、游戏等几乎所有 TCP 服务