📘 LVS(Linux Virtual Server)负载均衡全解析
一、LVS 核心概念
1.1 什么是 LVS?
LVS(Linux Virtual Server)是 Linux 内核中的四层负载均衡软件,由章文嵩博士于 1998 年创建。它工作在内核空间(通过 netfilter 框架),能将大量并发请求按调度算法分发到后端真实服务器(Real Server),从而实现高可用、高并发的服务集群。
1.2 关键术语
| 术语 | 说明 |
|---|---|
| VS(Virtual Server) | 负载均衡器,对外提供虚拟服务 |
| VIP | 虚拟 IP,客户端访问的入口 IP |
| DIP | 与后端 RS 通信的 IP(Director IP) |
| RS(Real Server) | 真正处理业务请求的后端服务器 |
| CIP | 客户端 IP |
| RIP | 后端服务器的实际 IP |
| ipvsadm | 用户空间工具,用于管理 LVS 规则 |
| ipvs | 内核模块,真正执行包转发 |
⚠️ LVS 没有统一配置文件,所有规则通过
ipvsadm命令动态管理。
二、LVS 工作原理(简述)
- 客户端请求到达 Director Server(VS)的 VIP。
- 数据包经过内核 PREROUTING 链,发现目标是本机,送往 INPUT 链。
- INPUT 链上的 ipvs 模块根据预设的集群服务规则,修改数据包的目标地址/端口或封装新头部。
- 修改后的包经 POSTROUTING 链转发给选中的 RS。
- RS 处理请求后,根据工作模式决定响应路径(可能经 VS 返回,也可能直接返回客户端)。
三、LVS 三种工作模式对比
3.1 NAT 模式(Network Address Translation)
- 特点:请求和响应都经过 VS,VS 需做源/目标 NAT。
- 优点:RS 可使用私有 IP,支持端口映射,配置简单。
- 缺点:VS 容易成为瓶颈,适合小规模集群。
- 关键要求:RS 的网关必须指向 DIP。
3.2 DR 模式(Direct Routing) ★★★★★
- 特点:请求经 VS 转发,响应直接由 RS 返回客户端。
- 优点:性能最高,VS 几乎无瓶颈,生产环境最常用。
- 缺点:VS 与 RS 必须在同一二层网络(同一交换机),不支持端口映射。
- 关键要求:
- RS 的 lo 或 dummy 网卡配置 VIP(掩码 32)。
- 关闭 RS 对 VIP 的 ARP 响应(修改内核参数)。
3.3 TUN 模式(Tunneling)
- 特点:VS 封装 IP 隧道(额外 IP 头)将请求转发给 RS。
- 优点:VS 和 RS 可以跨网段。
- 缺点:隧道开销大,配置复杂,很少使用。
四、调度算法
静态算法(不关心后端负载)
- RR(Round Robin):轮询
- WRR(Weighted RR):加权轮询
- SH(Source Hashing):源地址哈希
- DH(Destination Hashing):目标地址哈希
动态算法(依据后端连接数等)
- LC(Least Connections):最少连接数
- WLC(Weighted LC,默认算法):加权最少连接
- SED(Shortest Expected Delay):最短期望延迟
- NQ(Never Queue):永不排队
- LBLC(Locality-Based LC):基于局部性的最少连接
- LBLCR(LBLC with Replication):带复制的局部性最少连接
五、实验环境总览
实验使用 VMware 虚拟机,划分两个网段:
10.1.1.0/24(模拟外网客户端网段)10.1.8.0/24(内网服务器网段)
路由器(router)负责双网段互通,开启 IP 转发。
六、NAT 模式实验(含注释)
6.1 网络拓扑与角色
| 主机名 | IP 地址 | 网关 | 角色 |
|---|---|---|---|
| client2 | 10.1.1.21 | 10.1.1.10 | 客户端 |
| lvs | 10.1.1.10 (ens36) 10.1.8.10 (ens33) | 10.1.8.2 | LVS(Director) |
| web1~web3 | 10.1.8.11~13 | 10.1.8.10 | Real Server(Nginx) |
⚠️ NAT 模式下,RS 的网关必须指向 LVS 的 DIP(10.1.8.10)。
6.2 基础配置(省略重复部分)
① 开启 LVS 的 IP 转发及防火墙
# 开启路由转发echo"net.ipv4.ip_forward = 1">>/etc/sysctl.confsysctl-p# 配置防火墙(允许伪装)systemctlenablefirewalld--nowfirewall-cmd --set-default-zone=trusted firewall-cmd --add-masquerade--permanentfirewall-cmd --add-masquerade② 部署后端 Nginx(web1~web3)
# 安装 Nginxyuminstall-ynginx# 生成测试主页(显示主机名)echo"welcome to$(hostname)">/usr/share/nginx/html/index.html systemctlenablenginx--now③ 安装 ipvsadm(LVS 上)
yuminstall-yipvsadmtouch/etc/sysconfig/ipvsadm systemctlenableipvsadm--now6.3 配置 LVS NAT 负载均衡(带注释)
# 1. 添加一个虚拟服务:VIP = 10.1.1.10,端口 80,使用轮询算法(rr)ipvsadm-A-t10.1.1.10:80-srr# 2. 添加真实服务器:使用 NAT 模式(-m),权重为 1(默认)ipvsadm-a-t10.1.1.10:80-r10.1.8.11-mipvsadm-a-t10.1.1.10:80-r10.1.8.12-mipvsadm-a-t10.1.1.10:80-r10.1.8.13-m# 3. 保存规则到文件(以便开机恢复)ipvsadm-save-n>/etc/sysconfig/ipvsadm# 4. 查看规则ipvsadm-Ln输出示例:
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward weight ActiveConn InActConn TCP 10.1.1.10:80 rr -> 10.1.8.11:80 Masq 1 0 0 -> 10.1.8.12:80 Masq 1 0 0 -> 10.1.8.13:80 Masq 1 0 06.4 验证 NAT 模式
在客户端(10.1.1.21)执行循环测试:
foriin{1..90};docurl-s10.1.1.10;done|sort|uniq-c结果示例(轮询):
30 welcome to web1.laogao.cloud 30 welcome to web2.laogao.cloud 30 welcome to web3.laogao.cloud6.5 动态修改调度算法为 WRR
# 修改虚拟服务的调度算法为加权轮询ipvsadm-E-t10.1.1.10:80-swrr# 修改权重:web2 权重 2,web3 权重 3(web1 保持默认 1)ipvsadm-e-t10.1.1.10:80-r10.1.8.12-m-w2ipvsadm-e-t10.1.1.10:80-r10.1.8.13-m-w3再次测试,请求比例应为 1:2:3(web1:web2:web3)。
6.6 NAT 模式的坑 & 解决
问题:client1(10.1.8.21)无法通过 VIP 10.1.1.10 访问后端?
原因:client1 发出的请求经过 LVS 转发到 RS,RS 看到源 IP 是 10.1.8.21(同网段),会直接将响应发回 client1,而不是经过 LVS。client1 收到的响应源 IP 是 RS 的真实 IP(10.1.8.11),而非 VIP,导致连接混乱。
解决方法:在每台 RS 上添加静态路由,强制将发往 client1 的响应包路由到 LVS:
nmcli connection modify ens33 ipv4.routes'10.1.8.21 255.255.255.255 10.1.8.10'nmcli connection up ens33更通用的做法是让 RS 的默认网关指向 LVS,这样所有响应包都经过 LVS 做源 NAT。
七、DR 模式实验(生产环境首选,含详细注释)
7.1 网络拓扑与角色
| 主机名 | IP 地址 | 网关 | VIP | 角色 |
|---|---|---|---|---|
| client2 | 10.1.1.21 | 10.1.1.20 | 无 | 外网客户端 |
| client1 | 10.1.8.21 | 10.1.8.20 | 无 | 内网客户端 |
| lvs | 10.1.8.10 | 10.1.8.20 | 10.1.8.100 | Director |
| web1~web3 | 10.1.8.11~13 | 10.1.8.20 | 10.1.8.100 | Real Server |
路由器配置略(类似 NAT 模式,需开启转发)。
7.2 Real Server 关键配置(所有 RS 执行)
① 创建 dummy 网卡并绑定 VIP(掩码 32)
# 添加 dummy 虚拟网卡,设置 IP 为 10.1.8.100/32(仅自己可见)nmcli connectionaddtypedummy ifname dummy con-name dummy\ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy② 修改 ARP 内核参数(防止 RS 响应 VIP 的 ARP 请求)
cat>>/etc/sysctl.conf<<EOF net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.dummy.arp_ignore = 1 net.ipv4.conf.dummy.arp_announce = 2 EOFsysctl-p参数解释:
| 参数 | 值 | 含义 |
|---|---|---|
arp_ignore | 1 | 仅当 ARP 请求的目标 IP 与接收网卡的主 IP 完全匹配时才响应 |
arp_announce | 2 | 发送 ARP 通告时,使用与目标 IP 同子网的本地 IP 作为源 IP,否则不发送 |
🎯 目的:避免 RS 上的 VIP 被广播出去,导致路由器将流量直接发给 RS 而非 LVS。
7.3 Director(LVS)配置
① 绑定 VIP(可选,用于本机接收报文)
# 同样添加 dummy 网卡绑定 VIP(也可直接配置在物理网卡上)nmcli connectionaddtypedummy ifname dummy con-name dummy\ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy② 安装 ipvsadm 并配置 DR 模式规则
yuminstall-yipvsadmtouch/etc/sysconfig/ipvsadm systemctlenableipvsadm--now# 清除旧规则ipvsadm-C# 添加虚拟服务(VIP:80,调度算法 rr)ipvsadm-A-t10.1.8.100:80-srr# 添加真实服务器,使用 DR 模式(-g),权重默认 1ipvsadm-a-t10.1.8.100:80-r10.1.8.11-gipvsadm-a-t10.1.8.100:80-r10.1.8.12-gipvsadm-a-t10.1.8.100:80-r10.1.8.13-g# 保存规则ipvsadm-save-n>/etc/sysconfig/ipvsadm查看规则:
ipvsadm-Ln# Forward 列显示 "Route" 表示 DR 模式Prot LocalAddress:Port Scheduler ->RemoteAddress:Port Forward weight ActiveConn InActConn TCP10.1.8.100:80 rr ->10.1.8.11:80 Route100->10.1.8.12:80 Route100->10.1.8.13:80 Route1007.4 验证 DR 模式
从客户端(client1 或 client2)访问 VIP:
foriin{1..90};docurl-s10.1.8.100;done|sort|uniq-c输出应为均匀轮询(每个 RS 30 次)。
此时用tcpdump抓包可见:请求包源 IP 为客户端,目标 IP 为 VIP(10.1.8.100),MAC 目标为 LVS 的 MAC;响应包直接从 RS 返回客户端,源 IP 为 VIP,不经过 LVS。
7.5 DR 模式一键脚本(RS 端)
#!/bin/bash# 文件名: rs_dr.sh# 描述: 配置 Real Server 的 VIP 及 ARP 参数VIP=10.1.8.100case$1instart)echo-n"Start LVS Real Server ... "# 添加 dummy 网卡绑定 VIPifnmcli connection|grep-qdummy;thennmcli connection modify dummy ipv4.method manual ipv4.addresses$VIP/32elsenmcli connectionaddtypedummy ifname dummy con-name dummy\ipv4.method manual ipv4.addresses$VIP/32finmcli connection up dummy# 关闭 ARP 响应和通告echo1>/proc/sys/net/ipv4/conf/all/arp_ignoreecho2>/proc/sys/net/ipv4/conf/all/arp_announceecho1>/proc/sys/net/ipv4/conf/dummy/arp_ignoreecho2>/proc/sys/net/ipv4/conf/dummy/arp_announceecho"OK";;stop)echo-n"Stop LVS Real Server ... "nmcli connection delete dummyecho0>/proc/sys/net/ipv4/conf/all/arp_ignoreecho0>/proc/sys/net/ipv4/conf/all/arp_announceecho"OK";;*)echo"Usage:$0{start|stop}"exit1esac7.6 DR 模式一键脚本(Director 端)
#!/bin/bash# 文件名: lvs_dr.sh# 描述: 配置 LVS Director 的 VIP 和 ipvs 规则VIP=10.1.8.100PORT=80RS_LIST="10.1.8.11 10.1.8.12 10.1.8.13"SCHEDULER="rr"# 可改为 wrr, wlc 等# 安装 ipvsadm(若未安装)rpm-qipvsadm||yuminstall-yipvsadmcase$1instart)echo-n"Start LVS Director Server ... "# 绑定 VIP 到 dummy 网卡(或物理网卡别名)if!ipaddr|grep-q$VIP;thennmcli connection modify ens33 +ipv4.addresses$VIP/32 nmcli connection up ens33fi# 清空所有规则ipvsadm-C# 添加虚拟服务ipvsadm-A-t${VIP}:${PORT}-s$SCHEDULER# 添加真实服务器(DR 模式 -g)forrsin$RS_LIST;doipvsadm-a-t${VIP}:${PORT}-r$rs-gdoneecho"OK";;stop)echo-n"Stop LVS Director Server ... "ipvsadm-Cnmcli connection modify ens33-ipv4.addresses$VIP/32 nmcli connection up ens33echo"OK";;*)echo"Usage:$0{start|stop}"exit1esac八、LVS 常用命令速查表
| 命令 | 说明 |
|---|---|
ipvsadm -A -t VIP:port -s rr | 添加 TCP 虚拟服务,调度算法 rr |
ipvsadm -a -t VIP:port -r RIP -g | 添加 DR 模式真实服务器 |
ipvsadm -a -t VIP:port -r RIP -m | 添加 NAT 模式真实服务器 |
ipvsadm -E -t VIP:port -s wrr | 修改调度算法为 wrr |
ipvsadm -e -t VIP:port -r RIP -w 2 | 修改某 RS 权重为 2 |
ipvsadm -d -t VIP:port -r RIP | 删除某 RS |
ipvsadm -D -t VIP:port | 删除整个虚拟服务 |
ipvsadm -C | 清空所有规则 |
ipvsadm -Ln | 查看当前规则(数字格式) |
ipvsadm -Lcn | 查看持久连接表 |
ipvsadm-save -n | 保存规则(标准输出) |
九、总结与最佳实践
- 生产环境首选 DR 模式:性能最高,配置也最复杂(需处理 ARP 问题)。
- NAT 模式适合小规模或混合云场景:RS 可以私有 IP,但 LVS 压力大。
- 调度算法选择:
- 长连接服务(如数据库) → WLC / LC
- 短连接无状态服务(如 HTTP) → RR / WRR
- 需要会话保持 → SH(源地址哈希)或启用持久连接(
-p)
- 高可用:LVS 自身需配合 Keepalived 实现主备(VRRP),否则 LVS 单点故障会导致整个集群不可用。
- 监控:建议对 LVS 的
ipvsadm -Ln输出、连接数、后端 RS 健康状态进行监控。
通过本实验,可以完全掌握 LVS 的核心原理和两种主流模式的部署方法,为搭建高并发、高可用的 Web 或数据库集群打下坚实基础。