基于 CentOS 7 搭建 LVS 负载均衡(NAT 模式)搭建指南

背景介绍:为什么选择 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)中配置最简单的一种,其流量路径遵循以下流程:

  1. 客户端发送请求至 LVS 的虚拟 IP(VIP);
  2. LVS 调度器(Director)接收请求后,根据预设的调度算法(如轮询)将请求转发给后端真实服务器(Real Server,简称 RS);
  3. 真实服务器处理请求后,将响应流量返回给 LVS 调度器(因真实服务器网关指向 LVS);
  4. 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.2ping 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、监控工具等,构建更稳定、可扩展的高可用架构。

相关推荐
whlqjn_12111 天前
linux下使用SHC对Shell脚本进行封装和源码隐藏
linux·centos
芝麻馅汤圆儿1 天前
cpu 大小核
linux·运维·centos
学习3人组1 天前
CentOS 系统下 ModelScope 模型下载的默认目录
linux·python·centos
坐不住的爱码1 天前
Nacos负载均衡
负载均衡·cloud
是大芒果1 天前
线程池和高并发
负载均衡·高可用
TimerShaft1 天前
CentOS7安装PostgresSQL和PGVector
postgresql·centos·pgvector
柠檬叶子C1 天前
【云计算】利用 LVS 构建集群实现负载均衡 | 集群的概念 | 单服务器性能瓶颈验证例子 | LVS 基础 | LVS 构建负载均衡集群实操步骤
服务器·负载均衡·lvs
千百元2 天前
centos如何删除恶心定时任务
linux·运维·centos
XMYX-02 天前
CentOS 7 搭建 PostgreSQL 14 实战指南
linux·postgresql·centos
丁丁丁梦涛2 天前
TencentOS Server 4.4(兼容centos 9 stream)部署KKFileView
linux·运维·centos·kkfileview