背景介绍:为什么选择 LVS 负载均衡?
在高并发 Web 架构中,随着用户量增长,单台服务器的性能瓶颈和单点故障问题会愈发突出。传统应用层负载均衡(如 Nginx)虽配置灵活,但在百万级并发场景下,用户态转发的性能限制会显现。
LVS(Linux Virtual Server)作为内核级负载均衡方案,工作在传输层(Layer 4),通过 IPVS 模块直接在内核中处理数据包转发,无需用户态与内核态的频繁切换,可轻松支撑百万级并发连接,且资源占用极低。其 NAT 模式配置简单,无需修改后端服务器网络架构,是大型互联网企业高并发场景的首选方案,也适合负载均衡入门者快速掌握内核级负载均衡的核心原理。
本文将在 CentOS 7 系统上从零部署完整的 LVS 负载均衡集群(NAT 模式),覆盖环境准备、核心配置、效果验证及持久化优化,助力快速构建高可用、高并发的 Web 架构。
核心关键词解释
- LVS(Linux Virtual Server):集成于 Linux 内核的开源负载均衡项目,通过 IPVS 模块实现高效数据包转发,支持 NAT、DR、TUN 三种模式;
- IPVS(IP Virtual Server):LVS 的核心内核模块,负责实现负载均衡的调度算法和数据包转发逻辑,无需额外安装;
- VIP(Virtual IP):虚拟 IP 地址,对外提供统一的服务访问入口,客户端仅需访问 VIP 即可享受负载均衡服务;
- Director(调度器):运行 LVS 的服务器,负责接收客户端请求,根据调度算法转发至后端真实服务器;
- RS(Real Server):后端真实服务器,运行 Web 等应用服务,处理调度器转发的请求;
- NAT 模式:LVS 三种模式之一,通过地址转换实现请求转发,所有进出流量均经过调度器,配置简单但存在流量瓶颈;
- 调度算法:LVS 分发请求的规则,常用轮询(rr)、加权轮询(wrr)、最小连接(lc)等;
- ipvsadm:LVS 的用户态管理工具,用于配置、查看和修改 LVS 负载均衡规则。
一、LVS 简介与 NAT 模式原理
1. 什么是 LVS?
LVS 是一个开源负载均衡项目,已集成到 Linux 内核中。它通过 IPVS(IP Virtual Server)模块实现高效的数据包转发,无需额外安装内核,仅需通过用户态工具(如 ipvsadm)即可配置和管理。
2. NAT 模式工作原理
NAT(Network Address Translation)模式是 LVS 三种常用模式(NAT、DR、TUN)中配置最简单的一种,其流量路径遵循以下流程:
- 客户端发送请求至 LVS 的虚拟 IP(VIP);
- LVS 调度器(Director)接收请求后,根据预设的调度算法(如轮询)将请求转发给后端真实服务器(Real Server,简称 RS);
- 真实服务器处理请求后,将响应流量返回给 LVS 调度器(因真实服务器网关指向 LVS);
- LVS 调度器对响应流量做地址转换,最终返回给客户端。
3. NAT 模式优缺点
- ✅ 优点:配置简单,真实服务器无需修改网络配置,仅需指定网关即可;
- ⚠️ 缺点:所有进出流量均需经过 LVS 调度器,LVS 易成为流量瓶颈,不适合超大规模并发场景。
二、实验环境规划
本次搭建需 3 台 CentOS 7 服务器,角色、主机名、IP 地址规划如下表所示(LVS 公私网 IP 一致):
| 主机角色 | 主机名 | 操作系统 | IP 地址 |
|---|---|---|---|
| LVS 调度器 | lvs-director | CentOS 7 | 虚拟 IP(公私网一致):10.0.0.1 |
| 真实服务器 1 | web1 | CentOS 7 | 内网 IP:10.0.0.2 |
| 真实服务器 2 | web2 | CentOS 7 | 内网 IP:10.0.0.3 |
三、步骤 1:准备后端 Web 服务器
若尚未部署 Web 服务,需在 web1 和 web2 上分别搭建简单 Web 页面(以 Apache 为例),确保后端服务可正常响应请求:
1. 在 web1 上执行
bash
# 安装 Apache 服务(从 CentOS 官方 YUM 源获取)
yum install -y httpd
# 创建 Web 首页(标识 web1,便于测试时区分节点)
echo "<h1>Welcome to web1</h1>" > /var/www/html/index.html
# 启动 Apache 并设置开机自启(确保服务器重启后服务自动运行)
systemctl start httpd
systemctl enable httpd
2. 在 web2 上执行
仅需将 Web 首页内容改为 Welcome to web2,其余命令与 web1 一致:
bash
yum install -y httpd
echo "<h1>Welcome to web2</h1>" > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
3. 验证 Web 服务
在 LVS 调度器或其他内网机器上,通过内网 IP 访问 web1 和 web2,确认页面正常返回:
bash
# 访问 web1(应返回 web1 标识页面)
curl http://10.0.0.2
# 访问 web2(应返回 web2 标识页面)
curl http://10.0.0.3
四、步骤 2:配置 LVS 调度器(Director)
LVS 调度器是整个负载均衡集群的核心,需完成工具安装、IP 转发启用、防火墙配置三个关键操作,确保数据包能正常转发。
1. 安装 LVS 管理工具
LVS 内核模块(IPVS)默认已集成到 CentOS 7 内核中,无需额外安装,仅需安装用户态管理工具 ipvsadm:
bash
yum install -y ipvsadm
2. 启用 IP 转发(关键!)
LVS 作为调度器,需开启内核 IP 转发功能,否则无法将客户端请求转发至后端真实服务器:
bash
# 临时启用 IP 转发(重启后失效,用于快速测试)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久启用 IP 转发(修改配置文件,重启后仍生效)
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
# 使配置立即生效
sysctl -p
# 验证 IP 转发是否启用(输出 1 表示已启用)
sysctl net.ipv4.ip_forward
3. 设置防火墙(可选)
若系统启用了 firewalld,需开放 80 端口(Web 服务默认端口),或临时关闭防火墙(仅测试环境推荐):
bash
# 方案 1:开放 80 端口(推荐,生产环境适用)
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# 方案 2:临时关闭 firewalld(测试环境适用,简化配置)
systemctl stop firewalld
五、步骤 3:配置 LVS 虚拟服务(NAT 模式)
通过 ipvsadm 命令创建 LVS 虚拟服务规则,指定 VIP、调度算法和后端真实服务器,实现请求分发:
bash
# 1. 清空现有 LVS 规则(首次配置可省略,避免旧规则干扰)
ipvsadm -C
# 2. 添加虚拟服务:VIP 为 10.0.0.1,端口 80,调度算法为轮询(rr)
ipvsadm -A -t 10.0.0.1:80 -s rr
# 3. 添加后端真实服务器(-m 表示 NAT 模式)
ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.2:80 -m # 添加 web1 节点
ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.3:80 -m # 添加 web2 节点
关键参数说明
| 参数 | 含义 |
|---|---|
| -A | 添加虚拟服务(Virtual Server) |
| -a | 为虚拟服务添加真实服务器(Real Server) |
| -t VIP:PORT | 指定虚拟服务的 TCP 协议和端口(如 10.0.0.1:80) |
| -s rr | 调度算法为轮询(round-robin),其他常用算法:wrr(加权轮询)、lc(最小连接) |
| -m | 指定 LVS 模式为 NAT(Masquerading) |
| -r RS_IP:PORT | 指定后端真实服务器的 IP 和端口 |
六、步骤 4:配置真实服务器网关(关键!)
NAT 模式要求真实服务器的默认网关指向 LVS 调度器的 IP(10.0.0.1),否则真实服务器的响应流量无法返回给 LVS,客户端将收不到响应。
1. 在 web1 和 web2 上修改网关
bash
# 编辑网卡配置文件(假设网卡为 eth0,实际需根据服务器网卡名称调整,可通过 ip addr 查看)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 在文件末尾添加网关配置(指向 LVS 调度器 IP)
GATEWAY=10.0.0.1
2. 重启网络服务生效
bash
systemctl restart network
3. 验证网关配置
bash
# 查看默认网关,输出应包含"default via 10.0.0.1 dev eth0"
ip route show default
七、步骤 5:测试负载均衡效果
配置完成后,需验证 LVS 是否能将请求均匀分发到后端两台真实服务器。
1. 命令行测试(推荐)
在任意客户端(或 LVS 调度器本机)执行循环请求 VIP,观察返回结果是否交替显示 web1 和 web2 的页面:
bash
# 循环请求 10 次 VIP(10.0.0.1)
for i in {1..10}; do
curl -s http://10.0.0.1
done
预期输出(轮询交替):
plaintext
<h1>Welcome to web1</h1>
<h1>Welcome to web2</h1>
<h1>Welcome to web1</h1>
<h1>Welcome to web2</h1>
...
2. 浏览器测试
打开浏览器,访问 http://10.0.0.1,多次刷新页面,观察页面内容是否交替变化(若浏览器缓存影响,可开启无痕模式测试)。
八、步骤 6:持久化 LVS 规则(开机自启)
LVS 规则默认保存在内存中,服务器重启后规则会丢失。需通过 systemd 创建服务,实现 LVS 规则开机自动加载,确保服务稳定性。
1. 创建 LVS 服务文件
bash
cat > /etc/systemd/system/lvs.service <<EOF
[Unit]
Description=LVS Load Balancer (NAT Mode)
After=network.target # 网络服务启动后再启动 LVS 服务
[Service]
Type=oneshot # 一次性执行服务
# 启动时清空旧规则并重新创建 LVS 规则(与步骤 3 配置一致)
ExecStart=/sbin/ipvsadm -C && \
/sbin/ipvsadm -A -t 10.0.0.1:80 -s rr && \
/sbin/ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.2:80 -m && \
/sbin/ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.3:80 -m
RemainAfterExit=yes # 执行完成后保持服务活跃状态
[Install]
WantedBy=multi-user.target # 多用户模式下启动
EOF
2. 启用并启动服务
bash
# 重新加载 systemd 配置(识别新创建的服务)
systemctl daemon-reload
# 设置开机自启(服务器重启后自动加载 LVS 规则)
systemctl enable lvs
# 启动服务(立即加载 LVS 规则)
systemctl start lvs
# 验证服务状态(输出 active 表示正常)
systemctl status lvs
九、常用命令与排错
1. 常用 LVS 管理命令
| 功能 | 命令 |
|---|---|
| 查看 LVS 规则(详细信息,数字格式显示 IP 和端口) | ipvsadm -ln |
| 查看当前连接数(客户端 IP、后端 RS 等) | ipvsadm -lnc |
| 清空所有 LVS 规则 | ipvsadm -C |
| 保存 LVS 规则到文件 | ipvsadm -S > /etc/sysconfig/ipvsadm |
| 从文件加载 LVS 规则 | ipvsadm -R < /etc/sysconfig/ipvsadm |
| 测试后端 RS 连通性 | curl http://10.0.0.2(web1)、curl http://10.0.0.3(web2) |
| 检查真实服务器网关 | ip route show default |
2. 常见问题排查
问题 1:访问 VIP 无响应
- 检查 LVS 调度器的安全组是否开放 80 端口(云服务器场景);
- 检查 LVS 调度器的防火墙是否放行 80 端口(
firewall-cmd --list-ports); - 检查真实服务器的网关是否正确指向 LVS 的 IP(10.0.0.1);
- 检查真实服务器的 Web 服务是否正常运行(
systemctl status httpd)。
问题 2:只有一台后端 RS 响应
- 检查 LVS 规则是否包含两台 RS(
ipvsadm -ln); - 检查未响应的 RS 的 Web 服务是否正常(
curl http://RS_IP); - 检查未响应的 RS 的网关是否正确配置(
ip route show default)。
问题 3:连接超时
-
在 LVS 调度器上使用
tcpdump抓包分析流量路径,例如:bash
# 抓取与 web1(10.0.0.2)相关的 80 端口流量 tcpdump -i eth0 host 10.0.0.2 and port 80 -
检查 LVS 与 RS 之间的网络是否通畅(
ping 10.0.0.2、ping 10.0.0.3)。
十、总结与进阶建议
1. 总结
本文完整演示了在 CentOS 7 上从零搭建 LVS 负载均衡集群(NAT 模式)的流程,核心亮点:
- LVS 工作在传输层,内核级转发,低延迟、高吞吐,适合高并发场景;
- NAT 模式配置简单,无需修改后端 RS 的网络架构,仅需指定网关即可快速部署;
- LVS 公私网 IP 统一为 10.0.0.1,简化网络配置,降低入门门槛;
- 通过
systemd实现 LVS 规则开机自启,确保服务重启后仍能正常工作。
同时需注意,NAT 模式的局限性在于 LVS 调度器会成为流量瓶颈,所有进出流量均需经过调度器,不适合超大规模集群。
2. 进阶学习方向
- 🔄 切换至 LVS-DR 模式(Direct Routing):DR 模式下,RS 直接将响应流量返回给客户端,绕过 LVS 调度器,突破 NAT 模式的性能瓶颈,适合大规模集群;
- 🛡️ 集成 Keepalived:实现 LVS 调度器的高可用(主备自动切换),避免 LVS 单点故障,确保负载均衡服务不中断;
- 📊 监控与运维:结合 Prometheus + Node Exporter + Grafana 监控 LVS 的连接数、转发效率、后端 RS 状态等指标,实时掌握集群运行状态,及时发现并处理异常。
总结
LVS 作为内核级负载均衡方案,凭借其高性能、低资源占用的优势,成为高并发场景的核心组件。本文通过 NAT 模式的实战部署,帮助快速理解 LVS 的工作原理和配置逻辑,适合作为负载均衡进阶学习的基础。
后续可根据业务规模,灵活选择 LVS 模式(NAT/DR/TUN),并结合 Keepalived、监控工具等,构建更稳定、可扩展的高可用架构。