LVS(Linux Virtual Server)全面解析与实验手册:集群概念、工作模式与调度算法
摘要
本文深入解析 LVS(Linux Virtual Server)负载均衡技术,涵盖集群核心概念、三大分类、四种工作模式(NAT、DR、TUN、FULLNAT)及十三种调度算法。通过详细的实验手册,手把手指导多端口轮询(FWM)和会话粘滞(Redis+持久连接)的配置。每条命令均附带详细注释,可直接复制执行,助您从理论到实践全面掌握 LVS。
一、什么是集群(Cluster)
集群(Cluster)是一组相互独立的计算机(节点),通过高速网络互联,对外表现为一个单一系统,共同对外提供服务。其核心思想是将多台计算机组合起来,以较低的成本获得与大型主机相当的性能和可用性。
1.1 核心概念
- Scale Up(纵向扩展):提升单台服务器的硬件配置(CPU、内存、磁盘),成本高、有上限,存在单点故障(SPOF)。
- Scale Out(横向扩展):增加服务器数量,通过集群技术协同工作,成本低、弹性好,是高并发场景的标准做法。
- 集群的关键在于“协同”:多台机器不是简单堆叠,而是通过调度器和统一入口对外提供透明服务。
1.2 集群核心特征
| 特征 | 说明 |
|---|---|
| 单一系统映像 | 用户看到的是一个整体入口(VIP),不需要关心背后有多少台服务器。 |
| 高可用性 | 单节点故障不影响整体服务;衡量标准 A = MTBF/(MTBF+MTTR),目标 99.999%。 |
| 可扩展性 | 通过增加节点水平扩展(Scale Out),性能线性增长。 |
| 负载均衡 | 请求由调度器按算法智能分发到各节点,避免单点过载。 |
| 透明性 | 客户端无需修改代码,后端 RS 对用户完全透明。 |
1.3 集群架构示意
客户端请求 (CIP → VIP) │ ┌──────▼──────┐ │ 负载均衡器 │ ← Director / Load Balancer │ (LVS) │ 对外暴露 VIP,对内分发请求 └──────┬──────┘ ┌───────┼───────┐ ┌──▼──┐ ┌──▼──┐ ┌──▼──┐ │RS 1 │ │RS 2 │ │RS 3 │ ← Real Server(真实服务器) │Web │ │Web │ │Web │ 处理实际业务请求 └──┬──┘ └──┬──┘ └──┬──┘ └───────┼───────┘ ┌──────▼──────┐ │ 共享存储 │ ← NFS / Ceph / GlusterFS / FastDFS └─────────────┘ 保障数据一致性二、集群分类
集群按功能目标分为三大类,实际生产环境中通常混合使用。
2.1 负载均衡集群(LB — Load Balancing)
| 特性 | 说明 |
|---|---|
| 目标 | 将大量并发请求分发到多台服务器,提升系统吞吐量。 |
| 典型实现 | LVS(四层)、Nginx(七层)、HAProxy(四/七层)、F5(硬件)。 |
| 工作层次 | 四层传输层(IP:Port)或七层应用层(HTTP/HTTPS)。 |
| 适用场景 | Web服务、API网关、DNS解析、邮件服务。 |
| 核心价值 | 用多台廉价服务器替代昂贵的大型机,成本低且弹性好。 |
2.2 高可用集群(HA — High Availability)
| 特性 | 说明 |
|---|---|
| 目标 | 保证服务连续性,单点故障(SPOF)时自动切换到备用节点。 |
| 典型实现 | Keepalived(VRRP协议)、Heartbeat、Corosync + Pacemaker。 |
| 适用场景 | 数据库主备(Master-Slave)、核心服务冗余、VIP漂移。 |
| 衡量指标 | 可用性 A = MTBF/(MTBF+MTTR),常见目标 99.9% ~ 99.999%(5个9)。 |
| SLA | Service Level Agreement(服务等级协议),定义可用性目标。 |
| 故障切换时间 | Keepalived 通常 1~3 秒完成 VIP 漂移。 |
2.3 高性能计算集群(HPC — High Performance Computing)
| 特性 | 说明 |
|---|---|
| 目标 | 将大规模计算任务拆分到多节点并行处理,聚合算力。 |
| 典型实现 | MPI(消息传递接口)、Hadoop MapReduce、Apache Spark。 |
| 适用场景 | 科学计算、气象预测、基因分析、AI 大模型训练。 |
| 分布式存储 | Ceph、GlusterFS、FastDFS、MogileFS、Hadoop HDFS。 |
| 数据处理 | Hadoop MapReduce、Apache Spark(内存计算)。 |
2.4 三类集群对比
LB (负载均衡) HA (高可用) HPC (高性能) ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 分发用户请求 │ │ 主备故障切换 │ │ 并行拆分计算 │ │ 横向扩展容量 │ │ 服务永不中断 │ │ 聚合算力求解 │ │ 对外一个入口 │ │ VIP 自动漂移 │ │ 任务调度分发 │ │ LVS/Nginx │ │ Keepalived │ │ MPI/Spark │ └──────────────┘ └──────────────┘ └──────────────┘★ 生产环境标准组合:LVS(四层LB)+ Keepalived(HA,VIP高可用)+ Nginx(七层代理)+ Redis(Session共享)。
三、LVS 的作用
LVS(Linux Virtual Server)是章文嵩博士于 1998 年开发的开源负载均衡项目,已从 Linux 2.4 内核开始集成到内核空间。官网:http://www.linuxvirtualserver.org/。
3.1 LVS 核心术语
| 缩写 | 全称 | 含义 |
|---|---|---|
| VS | Virtual Server | 虚拟服务器,即 LVS 调度器本身 |
| RS | Real Server | 真实服务器,后端处理请求的服务器 |
| CIP | Client IP | 客户端 IP 地址,发起请求的源地址 |
| VIP | Virtual IP | 虚拟 IP,VS 对外暴露的 IP,客户端访问的目标地址 |
| DIP | Director IP | 调度器 IP,VS 与 RS 通信时使用的内网 IP |
| RIP | Real Server IP | 真实服务器 IP,RS 自身的 IP 地址 |
3.2 LVS 数据流模型
数据包流转路径:
CIP (客户端IP) <──请求──> VIP (虚拟IP) ==调度== DIP (调度器内网IP) <──转发──> RIP (真实服务器IP)通俗理解:
- 用户只知道 VIP,也只访问 VIP。
- VIP 像公司的总机号码,DIP/RIP 像内部员工的分机号。
- LVS 的工作就是:接到总机来电后,根据策略转给合适的分机。
3.3 LVS 核心定位
| 维度 | 说明 |
|---|---|
| 工作空间 | 内核空间(kernel space),基于 Netfilter 框架,处理效率极高。 |
| 工作层次 | 四层(传输层),基于 IP:Port 调度,不解析 HTTP 等七层协议。 |
| 核心模块 | ip_vs 内核模块,通过 ipvsadm 用户态工具管理。 |
| 性能 | 百万级并发连接,DR 模式下 CPU 占用近乎为零。 |
| 转发方式 | 只做分发不做代理(DR/TUN),或做简单 NAT 转换(NAT/FULLNAT)。 |
3.4 LVS 在 Netfilter 框架中的位置
数据包进入后经过 Netfilter 的 5 个钩子点:
PREROUTING → INPUT → FORWARD → OUTPUT → POSTROUTINGLVS 工作在 INPUT 链上:
- VIP 的数据包到达 PREROUTING → 路由判断是本机 → 进入 INPUT。
- ip_vs 模块在 INPUT 链上拦截数据包,根据调度规则修改目标地址。
- NAT 模式:修改后的包走 FORWARD → POSTROUTING 发往 RS。
- DR 模式:修改 MAC 地址后直接通过交换机发往 RS。
四、LVS 的 4 种工作模式及原理
LVS 的四种工作模式按数据包修改的层次不同分为:lvs-nat(修改 IP 层,DNAT)、lvs-dr(修改 MAC 层)、lvs-tun(IP 隧道封装)、lvs-fullnat(双向全 NAT)。
4.1 NAT 模式(Network Address Translation)
【原理】LVS 修改数据包的目标 IP 地址(DNAT),将 VIP 转换为选中 RS 的 RIP。RS 处理完毕后,响应必须原路返回 Director,再由 Director 做 SNAT 还原源 IP 后返回客户端。
数据包流转(NAT 模式):
┌────────┐ ①请求(CIP→VIP) ┌────────────┐ ②DNAT(VIP→RIP) ┌──────────┐ │ Client │ ──────────────────► │ Director │ ──────────────────► │ Real Srv │ │ CIP:X │ │ VIP/RIP │ │ RIP │ │ │ ◄────────────────── │ 改目标IP │ ◄────────────────── │ │ └────────┘ ④响应(VIP→CIP) └────────────┘ ③响应(RIP→CIP) └──────────┘ 由Director SNAT还原 RS的默认网关必须是Director| 项目 | 说明 |
|---|---|
| 修改内容 | 目标 IP 地址(入站做 DNAT)+ 源 IP 地址(出站做 SNAT) |
| RS 默认网关 | 必须指向 Director 的 DIP(192.168.0.100),否则响应无法原路返回 |
| Director 压力 | 大——进出双向流量都要经过 Director,网卡带宽是瓶颈 |
| 支持端口映射 | ✅ 支持(例如 VIP:80 → RS:8080,端口可以不同) |
| RS 规模上限 | 10~20 台(受 Director 网卡吞吐量限制) |
| RS 操作系统 | 任意 OS(Linux / Windows / …),对 RS 完全透明 |
| 跨网段 | 不支持——RS 必须与 Director 网络可达且同在一个广播域 |
| Director 要求 | 必须开启 IP 转发:net.ipv4.ip_forward = 1 |
★ NAT 模式的工作流程(逐步详解):
- 客户端发送请求:CIP → VIP:Port
- Director 收到后做 DNAT:将目标 IP 从 VIP 改为选中 RS 的 RIP
- RS 收到请求,处理后生成响应:RIP → CIP
- 响应必须经过 Director(因 RS 默认网关指向 Director)
- Director 做 SNAT:将源 IP 从 RIP 还原为 VIP,返回给客户端
六、LVS NAT模式实验配置
以下为LVS NAT模式实验环境配置的详细命令,每条命令均附带注释说明,可直接在Xshell中执行。
6.1 环境说明
| 主机 | 网络模式 | 功能 | 是否设定网关 |
|---|---|---|---|
| lvs | nat-172.25.254.100,hostonly-192.168.0.100 | vs(虚拟服务器/调度器) | - |
| rs1 | hostonly-192.168.0.10 | rs(真实服务器1) | 192.168.0.100 |
| rs2 | hostonly-192.168.0.20 | rs(真实服务器2) | 192.168.0.100 |
6.2 环境设定操作
6.2.1 基本环境配置
lvs主机网络配置:
- eth0 - nat模式 - 172.25.254.100
- eth1 - hostonly模式 - 192.168.0.100
rs1主机网络配置:
- eth0 - hostonly模式 - 192.168.0.10
- 注意:使用脚本设定IP时不设定网关,后续手动设定
rs2主机网络配置:
- eth0 - hostonly模式 - 192.168.0.20
- 注意:使用脚本设定IP时不设定网关,后续手动设定
6.2.2 设定RS1和RS2的网关
在RS1主机上执行以下命令:
# 修改eth0网卡的网关为192.168.0.100(指向LVS的DIP) [root@rs1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100 重新加载网络连接配置 [root@rs1 ~]# nmcli connection reload 激活eth0网络连接 [root@rs1 ~]# nmcli connection up eth0 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4) 查看路由表,确认网关设置生效 [root@rs1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0在RS2主机上执行以下命令:
# 修改eth0网卡的网关为192.168.0.100(指向LVS的DIP) [root@rs2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100 重新加载网络连接配置 [root@rs2 ~]# nmcli connection reload 激活eth0网络连接 [root@rs2 ~]# nmcli connection up eth0 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4) 查看路由表,确认网关设置生效 [root@rs2 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth06.2.3 环境验证
配置效果验证:
- 所有IP之间可以直接ping通
- RS1和RS2的默认网关都指向LVS的DIP(192.168.0.100)
- LVS可以同时访问nat网络(172.25.254.0/24)和hostonly网络(192.168.0.0/24)
网络连通性测试命令:
# 从LVS ping RS1 [root@lvs ~]# ping 192.168.0.10 从LVS ping RS2 [root@lvs ~]# ping 192.168.0.20 从RS1 ping LVS [root@rs1 ~]# ping 192.168.0.100 从RS2 ping LVS [root@rs2 ~]# ping 192.168.0.100 从RS1 ping RS2(通过LVS网关转发) [root@rs1 ~]# ping 192.168.0.20 从RS2 ping RS1(通过LVS网关转发) [root@rs2 ~]# ping 192.168.0.10注意事项:
- NAT模式下,RS的默认网关必须指向Director的DIP,否则响应包无法返回
- 确保所有主机的防火墙已关闭或配置了相应规则
- LVS主机需要开启IP转发功能:
sysctl -w net.ipv4.ip_forward=1 - 建议将IP转发配置写入
/etc/sysctl.conf文件永久生效
五、LVS 调度算法
LVS 内置了 13 种调度算法,可根据业务场景灵活选择。
| 算法 | 缩写 | 说明 | 适用场景 |
|---|---|---|---|
| 轮询 | rr | 按顺序轮流分配请求 | 所有 RS 性能相近 |
| 加权轮询 | wrr | 按权重比例分配请求 | RS 性能差异明显 |
| 最少连接 | lc | 将请求发给当前连接数最少的 RS | 长连接服务(如数据库) |
| 加权最少连接 | wlc | 考虑权重的最少连接(默认算法) | 通用场景,性能最佳 |
| 基于局部性的最少连接 | lblc | 考虑目标 IP 的局部性,相同目标 IP 发往同一 RS | 缓存服务器 |
| 带复制的基于局部性的最少连接 | lblcr | lblc 的改进版,允许复制到负载较轻的 RS | 缓存服务器集群 |
| 目标地址散列 | dh | 根据目标 IP 的哈希值选择 RS | 反向代理缓存 |
| 源地址散列 | sh | 根据源 IP 的哈希值选择 RS | 会话保持( |
