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 使用
