LVS三种模式及调度算法解析

一、LVS 三种工作模式

1. NAT 模式(Network Address Translation)

工作原理

客户端请求先到达 LVS 调度器(Director),调度器修改目标 IP 为后端某台 Real Server 的 IP,并做 DNAT;Real Server 处理完请求后,把响应包发回给调度器,调度器再做 SNAT 把源 IP 改回 VIP 后返回给客户端。所有流量(请求+响应)都经过调度器

网络拓扑

  • 所有 Real Server 和 Director 在同一个二层网络(如同一个 VLAN)。
  • Real Server 默认网关指向 Director。

优点

  • 配置简单,对 RS 无特殊要求(不需要改内核参数或路由)。
  • 支持端口转换(比如 VIP:80 → RS:8080)。

缺点

  • 调度器成为性能瓶颈(双向流量都要过它)。
  • 扩展性差,一般只适用于后端 RS 数量 ≤ 10 的小规模场景。

适用场景

测试环境、小流量业务、需要端口映射的场景(比如旧系统改造)。


2. DR 模式(Direct Routing)

工作原理

客户端请求到达 Director,Director 通过修改 MAC 地址(不改 IP),将帧直接转发给选定的 Real Server。RS 必须配置 VIP(通常绑在 lo 接口上),并抑制 ARP 响应。响应流量直接从 RS 返回客户端,不经过 Director

网络拓扑

  • Director 和所有 RS 必须在同一个广播域(二层可达)。
  • VIP 在 Director 和所有 RS 上都要配置(RS 上一般配在 lo:0)。
  • RS 的默认网关是正常出口网关,不是 Director。

优点

  • 性能极高,Director 只处理入向流量,出向直通。
  • 扩展性好,可支撑成百上千台 RS。

缺点

  • 要求严格二层同网段,跨机房部署困难。
  • 不支持端口转换(VIP 端口必须和 RS 端口一致)。
  • 需要在 RS 上做 ARP 抑制(arp_ignore=1, arp_announce=2)。

适用场景

这是我们在生产中最常用的模式,尤其适合高并发、低延迟的 Web 服务、API 网关等。


3. TUN 模式(IP Tunneling)

工作原理

Director 将客户端请求封装在新的 IP 包中(IP-in-IP),发送给远端的 Real Server。RS 解封装后处理请求,响应直接返回客户端。响应也不经过 Director

网络拓扑

  • Director 和 RS 可以不在同一机房,只要三层互通即可。
  • RS 必须支持 IP 隧道(加载 ipip 模块),并配置 VIP。

优点

  • 支持跨机房部署,适合异地多活架构。
  • Director 只处理入向流量,性能较好。

缺点

  • 配置复杂,需维护隧道。
  • 包头增加 20 字节,MTU 需要调整避免分片。
  • 对 RS 内核有要求(需支持 IPIP)。

适用场景

我们用在跨 AZ 或同城双活的场景,比如灾备流量调度。但因为运维成本高,如果不是必须跨三层,一般优先选 DR。


二、LVS 调度算法

LVS 内核模块 IPVS 支持多种调度策略,核心就两类:静态(轮询类)和动态(连接数类)。

算法 特点 适用场景
rr(Round Robin) 轮询,依次分配 后端服务器性能一致,且请求处理时间相近
wrr(Weighted RR) 加权轮询,按权重分配 后端服务器性能不均(比如新旧混部)
lc(Least Connections) 谁当前连接数少就分给谁 请求处理时间差异大(如文件上传/下载混合)
wlc(Weighted LC) 加权最少连接,兼顾性能和负载 生产最常用,适应性强,推荐默认使用
lblc / lblcr 基于本地最少连接(带缓存亲和) 适用于 HTTP 缓存集群,但我们基本不用
sh(Source Hashing) 源 IP 哈希,实现会话保持 需要客户端始终打到同一 RS(但更推荐用应用层 sticky session)

补充:我们线上几乎全部用 wlc,因为它能自动适应不同规格机器 + 动态负载,比 rr 更智能,比 lc 考虑了机器能力差异。


三、ipvsadm 的作用和常用命令

作用
ipvsadm 是用户态工具,用于管理内核中的 IPVS 表(类似 iptables 管理 netfilter)。所有 LVS 规则最终都通过它写入内核。

常用命令

复制代码
# 查看当前 VS 和 RS 列表
ipvsadm -ln

# 添加一个虚拟服务(DR 模式,wlc)
ipvsadm -A -t 10.0.0.100:80 -s wlc

# 添加后端真实服务器
ipvsadm -a -t 10.0.0.100:80 -r 10.0.1.10:80 -g  # -g 表示 DR 模式
ipvsadm -a -t 10.0.0.100:80 -r 10.0.1.11:80 -g

# 删除虚拟服务(会连带删除所有 RS)
ipvsadm -D -t 10.0.0.100:80

# 清空所有规则
ipvsadm -C

# 保存规则(重启后失效,需配合脚本持久化)
ipvsadm-save > /etc/sysconfig/ipvsadm

关键选项说明

  • -A:Add virtual service
  • -a:Add real server
  • -t:TCP 服务(-u 是 UDP)
  • -s:调度算法
  • -r:real server 地址
  • -g:DR 模式(-m 是 NAT,-i 是 TUN)

注意:ipvsadm 本身不持久化规则,重启后丢失。我们在线上都是通过 Ansible + systemd 服务启动时自动加载规则,或者用 keepalived 自动管理(更常见)。


总结一下:

  • 小规模、要端口映射 → NAT
  • 同机房、高性能 → DR(首选)
  • 跨机房 → TUN
  • 调度算法首选 wlc
  • ipvsadm 是操作 IPVS 的唯一标准工具,但生产一般配合 keepalived 使用
相关推荐
Evan芙36 分钟前
用fping编写脚本扫描10.0.0.0/24网段在线主机
linux·运维·网络·excel
故事挺秃然40 分钟前
Python异步(Asyncio)(一)
服务器·网络·python
小毛驴85042 分钟前
nrm test 所有源超时解决办法
linux·服务器·网络
qq_479875431 小时前
Linux 网络实验(3)
linux·运维·网络
誰能久伴不乏1 小时前
为什么 TCP 服务端重启会出现 “Address already in use”问题解析
linux·服务器·c语言·网络·c++·tcp/ip
apihz1 小时前
批量获取3位未注册短域名免费API接口每日更新
android·服务器·网络·网络协议·tcp/ip
Ares-Wang1 小时前
Windows 系统下,Microsoft Loopback Adapter(微软环回适配器)
网络
apihz1 小时前
域名注册状态查询免费API接口详细教程
android·服务器·网络·python·tcp/ip
拾忆,想起1 小时前
Dubbo动态服务发现配置指南:从基础到云原生实践
服务器·网络·微服务·云原生·架构·服务发现·dubbo
Maryfang132918915511 小时前
RTL8306MB的国产P2P替代方案用JL5106C的可行性分析
网络·网络协议·p2p