一、LVS 是什么
LVS(Linux Virtual Server,Linux 虚拟服务器)是由章文嵩博士开发的内核级四层负载均衡技术,工作在 OSI 模型的传输层(TCP/UDP),只处理 IP 和端口的转发,不解析 HTTP 等应用层内容,因此性能极高,单台调度器可支撑上万并发连接。
LVS 集群中有两类核心角色:
Director(调度器):接收客户端请求,按照调度算法将数据包转发给后端真实服务器,本身不处理业务。
Real Server(RS,真实服务器):真正处理业务请求,并将响应结果返回给客户端。
LVS 是四层负载均衡,Nginx 是七层负载均衡。LVS 只看 IP + 端口,Nginx 可以看 URL、Cookie、Header 等应用层信息。
二、LVS 三种工作模式详解
LVS 支持三种工作模式:NAT 模式、DR 模式、TUN 模式。三者的本质区别在于数据包的转发方式和回包路径不同。
2.1 NAT 模式(网络地址转换,参数-m)
工作原理
客户端请求 VIP,数据包到达调度器。
调度器修改数据包的目标 IP(DNAT),将 VIP 改为某台 RS 的真实 IP,转发给后端。
RS 处理请求后,将响应包发给调度器(RS 的默认网关必须指向调度器)。
调度器修改响应包的源 IP(SNAT),将 RS 真实 IP 替换回 VIP,返回给客户端。
特点
请求和响应全部流量都经过调度器,调度器容易成为性能瓶颈。
RS 可以和 VIP 不在同一个网段,RS 只需要内网 IP,不需要公网 IP。
不需要在 RS 上配置 lo 回环网卡 VIP,也不需要 ARP 抑制。
支持任意操作系统的 RS。
适用场景
小规模集群、对性能要求不高的场景。
配置示例
ipvsadm-A-t10.1.8.100:80-srr ipvsadm-a-t10.1.8.100:80-r10.1.8.11:80-mipvsadm-a-t10.1.8.100:80-r10.1.8.12:80-mipvsadm-a-t10.1.8.100:80-r10.1.8.13:80-m关键:所有 RS 的默认网关必须配置为调度器的内网 IP。
2.2 DR 模式(直接路由,参数-g,生产最常用)
工作原理
客户端访问 VIP,请求报文到达调度器。
调度器不修改 IP,只修改数据帧的目标 MAC 地址,将其改为选中 RS 的物理网卡 MAC,在二层转发给 RS。
RS 收到数据包,由于本机 lo 回环网卡绑定了 VIP,能够识别并处理该请求。
响应报文由 RS 直接返回给客户端,不经过调度器。
特点
只有入方向请求经过调度器,响应包 RS 直回客户端,调度器压力小,性能最高。
调度器和所有 RS必须在同一个局域网(因为是二层 MAC 转发)。
硬性约束(踩坑重点)
VIP 必须绑定在 RS 的lo 回环网卡上,掩码为
/32,绝对不能绑定在物理网卡(如 ens33)上。必须配置 ARP 抑制内核参数,防止 RS 对外广播 VIP 的 ARP 响应,否则客户端会绕过调度器直接访问某台 RS,导致负载均衡失效。
net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2适用场景
同一局域网内的大规模 Web 集群,生产环境中最常用。
配置示例
ipvsadm-A-t10.1.8.100:80-srr ipvsadm-a-t10.1.8.100:80-r10.1.8.11:80-gipvsadm-a-t10.1.8.100:80-r10.1.8.12:80-gipvsadm-a-t10.1.8.100:80-r10.1.8.13:80-g2.3 TUN 模式(IP 隧道,参数-i)
工作原理
客户端请求 VIP,数据包到达调度器。
调度器在原有 IP 报文外面再封装一层新的 IP 头部(IP 隧道封装),将封装后的包发给 RS。
RS 解开隧道外层 IP,拿到原始请求包;本机 lo 网卡配置了 VIP,处理业务。
RS 直接将响应返回客户端,回包不经过调度器。
特点
RS 和调度器可以跨网段、跨机房,不要求同一局域网。
回包不走调度器,性能较高。
RS 内核必须支持并开启
ipip隧道模块。
硬性约束
RS 主机内核必须加载
ipip模块。VIP 配置在 RS 的 lo 回环网卡上。
同样需要配置 ARP 抑制。
适用场景
跨机房、跨地域的分布式集群。
配置示例
ipvsadm-A-t10.1.8.100:80-srr ipvsadm-a-t10.1.8.100:80-r10.1.8.11:80-iipvsadm-a-t10.1.8.100:80-r10.1.8.12:80-iipvsadm-a-t10.1.8.100:80-r10.1.8.13:80-i2.4 三种模式对比汇总
| 对比项 | NAT 模式 | DR 模式 | TUN 模式 |
|---|---|---|---|
| ipvsadm 参数 | -m | -g | -i |
| 入流量 | 经过调度器 | 经过调度器 | 经过调度器 |
| 出流量 | 经过调度器 | RS 直回客户端 | RS 直回客户端 |
| RS 与调度器网段 | 可不同网段 | 必须同一局域网 | 可跨网段 / 跨机房 |
| RS 是否需要 VIP | 不需要 | lo 绑定 VIP | lo 绑定 VIP |
| 是否需要 ARP 抑制 | 不需要 | 必须 | 必须 |
| 特殊要求 | RS 网关指向调度器 | 同局域网 | ipip 隧道模块 |
| 性能 | 较低(调度器瓶颈) | 最高 | 高 |
| 适用场景 | 小规模集群 | 同网段大规模集群(最常用) | 跨机房集群 |
三、LVS 常用调度算法
| 算法 | 名称 | 说明 |
|---|---|---|
rr | 轮询 | 按顺序依次分配,每台 RS 轮流处理 |
wrr | 加权轮询 | 根据 RS 权重分配,权重高的处理更多请求 |
lc | 最少连接 | 优先分配给当前连接数最少的 RS |
wlc | 加权最少连接 | 结合权重和连接数综合分配(默认算法) |
lblc | 基于局部性的最少连接 | 同一目标 IP 尽量分配给同一 RS |
四、DR 模式完整实战配置
4.1 实验环境
| 主机 | IP 地址 | 角色 |
|---|---|---|
| lvs-dir | [10.1.8.10](10.1.8.10) | 调度器 Director |
| web1 | [10.1.8.11](10.1.8.11) | RS 节点 |
| web2 | [10.1.8.12](10.1.8.12) | RS 节点 |
| web3 | [10.1.8.13](10.1.8.13) | RS 节点 |
| VIP | [10.1.8.100](10.1.8.100) | 虚拟 IP |
4.2 调度器配置
# 1. 绑定VIP到物理网卡ipaddradd10.1.8.100/24 dev ens33# 2. 安装ipvsadmyuminstall-yipvsadm# 3. 配置LVS规则ipvsadm-C# 清空旧规则ipvsadm-A-t10.1.8.100:80-srr# 添加虚拟服务,轮询算法ipvsadm-a-t10.1.8.100:80-r10.1.8.11:80-g# 添加web1,DR模式ipvsadm-a-t10.1.8.100:80-r10.1.8.12:80-g# 添加web2,DR模式ipvsadm-a-t10.1.8.100:80-r10.1.8.13:80-g# 添加web3,DR模式# 4. 查看规则ipvsadm-Ln4.3 所有 RS 节点配置(web1/web2/web3 全部执行)
# 1. 绑定VIP到lo回环网卡(/32掩码,重点!)ipaddradd10.1.8.100/32 dev lo# 2. 配置ARP抑制echo1>/proc/sys/net/ipv4/conf/all/arp_ignoreecho2>/proc/sys/net/ipv4/conf/all/arp_announceecho1>/proc/sys/net/ipv4/conf/lo/arp_ignoreecho2>/proc/sys/net/ipv4/conf/lo/arp_announce# 3. 持久化ARP参数(写入/etc/sysctl.conf,防止重启失效)cat>>/etc/sysctl.conf<<EOF net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 EOFsysctl-p4.4 验证负载均衡
# 客户端执行90次请求,统计各节点处理次数foriin{1..90};docurl-s10.1.8.100;done|sort|uniq-c正常结果:三台 RS 各处理 30 次请求。
五、实战踩坑总结
坑 1:流量全部落到同一台 RS
现象:90 次请求全部打到 web1,web2 和 web3 零流量。
原因:RS 的 lo 网卡 ARP 抑制参数未生效(arp_ignore=0、arp_announce=0),RS 对外广播了 VIP 的 ARP 响应,客户端 ARP 缓存直接指向 web1,绕过了 LVS 调度器。
解决:
# 检查ARP参数sysctlnet.ipv4.conf.lo.arp_ignore net.ipv4.conf.lo.arp_announce# 修正为1和2echo1>/proc/sys/net/ipv4/conf/lo/arp_ignoreecho2>/proc/sys/net/ipv4/conf/lo/arp_announce# 客户端清空ARP缓存arp-d10.1.8.100坑 2:sysctl: invalid syntax 报错
现象:执行sysctl -p时报/etc/sysctl.conf(11): invalid syntax。
原因:配置文件中键值对等号两侧有空格,或参数名拼写错误。
解决:sysctl.conf中键值对严格使用参数名=值格式,等号左右不要加空格,注释行以#开头。
坑 3:ipvsadm: unexpected argument 报错
现象:添加 RS 时报unexpected argument。
原因:混淆了-A(添加虚拟服务)和-a(添加后端 RS),后端 RS 地址前缺少-r参数。
解决:大写-A只配 VIP,小写-a配 RS 且必须加-r指定后端地址。
坑 4:nmcli 命令拼接报错
现象:invalid <setting>.<property> 'nmcli'。
原因:两条独立的 nmcli 命令写在同一行,被当成一条命令解析。
解决:每条 nmcli 命令单独执行,不要同行拼接。
六、总结
DR 模式是生产环境最常用的 LVS 模式,性能最高,但必须配置 lo 绑定 VIP 和 ARP 抑制。
NAT 模式配置最简单,但调度器是瓶颈,适合小规模场景。
TUN 模式支持跨机房,但需要 ipip 隧道支持,使用较少。
DR 模式下最常见的问题就是 ARP 抑制配置不到位,导致客户端绕过调度器直接访问 RS,表现为流量不均。
排障思路:先看
ipvsadm -Ln确认规则正确,再检查 RS 的 lo VIP 绑定和 ARP 参数,最后清空客户端 ARP 缓存复测。