Nginx 和 HAProxy 做负载均衡,都要把数据包从内核态提到用户态、处理完再送回去;LVS 直接在内核里改完地址就转发了,这一步之差就是数量级的差距。这篇不碰实验环境,只把原理讲透:先分清「管理工具」与「转发引擎」谁在干活,再拆开 NAT、DR、TUN、FULLNAT 四种模式的报文改写规则,然后是 10 种调度算法与 ipvsadm 全套命令。动手部署的部分另有一篇《LVS 负载均衡怎么落地?NAT 与 DR 两套实验全记录》。文中命令名与选项均标注英文原意,完整清单见文末《附:命令英文全称速查表》。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | LVS 原理篇:内核态 ipvs 转发机制与工具/引擎分工 → NAT / DR / TUN / FULLNAT 四种工作模式 → 10 种调度算法 → ipvsadm 命令速查 |
| 所属类别 | Linux 系统管理 → Web 服务 → LVS 负载均衡 |
| 知识关键字 | ipvs·ip_vs·ipvsadm·Keepalived·netlink·VIP·DIP·RIP·CIP·-m·-g·-i |
概念图给出「客户端 → Director → 真实服务器」这条主链路。全篇分五章:定位与术语、内核转发路径、四种工作模式、调度算法、命令速查。动手部署的部分见姊妹篇《LVS 负载均衡怎么落地?NAT 与 DR 两套实验全记录》。
一、LVS 是谁,凭什么快
1.1 一句话定位
Linux 虚拟服务器(LVS,Linux Virtual Server)用负载均衡技术把多台服务器组成一台虚拟服务器。它为快速增长的网络访问需求提供了「负载能力易扩展、价格低廉」的解决方案。
LVS 是章文嵩博士 1998 年创建的开源负载均衡软���。它工作在内核空间,按请求报文的目标 IP 与目标端口把请求调度到后端集群中的某个节点。
它和 Nginx、HAProxy 的根本差别就在这里。Nginx 与 HAProxy 跑在用户空间,数据包要「内核 → 用户 → 内核」走两遍;LVS 的转发逻辑全在内核里完成。
1.2 术语先对齐
| 缩写 | 英文全称 | 含义 |
|---|---|---|
| VS / Director | Virtual Server / Director | 调度器,也就是负载均衡器 |
| RS | Real Server | 后端服务器、真实服务器,也叫 Backend Server |
| VIP | Virtual IP | 调度器对外提供服务的 IP 地址 |
| DIP | Director IP | 调度器与后端 RS 通信的 IP 地址 |
| RIP | Real Server IP | 后端真实服务器自己的 IP 地址 |
| CIP | Client IP | 客户端的 IP 地址 |
一台调度器一般配两个地址:VIP 对外提供服务,DIP 对内和后端通信。
1.3 管理工具与转发引擎:两者不是一回事
ipvsadm:跑在用户空间的命令行工具,在 Director 上定义集群服务、添加 Real Server;ipvs:跑在内核空间的代码块(内核模块ip_vs),挂在 netfilter 的 INPUT 钩子上,真正执行转发。
关系可以类比iptables与 netfilter:一个「下命令」,一个「干活」。ipvsadm 自己一个包都不转发,它通过 netlink 把「虚拟服务、RS 列表、调度算法」下发到内核;此后每个进来的包都由ip_vs直接查表转发。
| 对比项 | ipvsadm | ipvs(内核ip_vs) |
|---|---|---|
| 运行位置 | 用户空间 | 内核空间 |
| 是不是进程 | 是,用完即退 | 不是,是内核模块 |
| 职责 | 下发 / 查看 / 保存规则 | 查表、改写报文、转发 |
| 卸载后 | 规则表仍在内核里 | 转发照常,业务不中断 |
包里的那个「服务」是什么
yum install ipvsadm除了主程序还会装一个 systemd 单元,名字容易误导。它的职责只有一条:开机时把规则文件读回内核。
Type=oneshot ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore /etc/sysconfig/ipvsadm" ExecStop=/sbin/ipvsadm -C RemainAfterExit=yesType=oneshot说明它执行一次就结束,不是常驻守护进程;RemainAfterExit=yes让命令跑完后仍标记 active,所以status里看不到进程属正常。这也解释了启动失败的原因:/etc/sysconfig/ipvsadm不存在时ipvsadm-restore返回非零、服务直接报错,所以要先touch它。
卸掉管理工具,转发还能跑吗
能。转发是内核在做,ipvsadm 只是遥控器。
| 动作 | 结果 |
|---|---|
停ipvsadm.service | 执行ipvsadm -C,规则清空、转发停止 |
只删命令(rpm -e ipvsadm)不重启 | 已下发的规则留在内核,转发照常 |
| 重启且规则没存过 | 规则丢失,又无命令恢复,服务起不来 |
⚠️ 删包不会卸载内核模块,ip_vs会一直在内存里。想真停掉转发得ipvsadm -C或modprobe -r ip_vs。一句话记:卸载不会立刻中断服务,但会让你失去全部配置与排查手段。
生产上谁在管这套规则
ipvsadm 不做健康检查,只认当前写进内核的那份规则。生产上真正管 LVS 的是Keepalived。它内置 ipvs 规则管理组件,通过netlink把配置块下发到内核,与 ipvsadm 走同一套内核接口。同时它还负责两件事:用 VRRP 决定谁是主调度器,用健康检查决定摘除哪台 RS。所以双机主备场景里规则由它下发,但仍建议装着 ipvsadm——规则出问题时,ipvsadm -Ln是唯一能直接看到内核规则表的工具。
要把某台主机配成 Director,先确认内核支持 ipvs 并装好 ipvsadm。Director 要转发所有请求、压力较大,生产环境中不要用虚拟机。
二、工作原理:报文在内核里走的四步
ipvs 借助内核 netfilter 子系统处理进入本机的数据包,过程分四步:
- 客户端向调度器 Director Server 发起请求,请求进入内核空间;
- PREROUTING 链先收到请求,判断目标 IP 是本机,于是把数据包送给 INPUT 链;
- IPVS 是挂在 INPUT 链上的代码块。它把请求和自己定义好的集群服务逐个比对;
- 一旦命中集群服务,IPVS 就改掉报文的目标 IP 与端口,再从 POSTROUTING 送出。
第 4 步送出去的时候,POSTROUTING 会发现目标地址正好落在后端服务器网段,于是按路由把包交给那台后端机。
三、四种工作模式
常用的工作模式有四种:lvs-nat、lvs-dr、lvs-tun、lvs-fullnat。差别可以一句话记住:NAT 改目标地址,DR 改 MAC 地址,TUN 再套一层 IP 头。
3.1 NAT 模式:改目标地址
把请求报文的目标地址与目标端口改成某台 RS 的,源地址保持不变。
图:NAT 模式四个阶段的字段对照,蓝底为被改写的字段。
回程要点:RS 以 RIP 为源把响应交给 Director,Director 再把源地址改回 VIP 发给客户端。进出双向都过调度器,这既是 NAT 的瓶颈,也是「RS 网关必须指向 DIP」的由来——回包不经过调度器,进出就不对称。
3.2 DR 模式:只改 MAC
为请求报文重新封装 MAC 首部:源 MAC 换成 DIP 网卡的,目标 MAC 换成某台 RS 接口的。IP 首部一动不动,源 IP 仍是 CIP,目标 IP 始终是 VIP。
图:DR 模式只动二层——源 MAC 与目标 MAC 被改写,IP 首部一字未动。
回程要点:RS 处理完,用 lo 口上的 VIP 作源地址直接把响应发给客户端,不经过 Director。这是 DR 吞吐远高于 NAT 的原因,代价是 RS 与 DS 必须能二层互通、且 RS 的 VIP 不能响应 ARP。
3.3 TUN 模式:外面再套一层 IP
原报文一字不改,只在外面再封装一个 IP 首部:外层源 IP 为 DIP,外层目标 IP 为 RIP。
图:TUN 模式在原报文外再套一层 IP 首部(源 DIP → 目标 RIP),内层一字不改。
回程要点:RS 拆掉最外层 IP 后,发现内层目标是自己的 lo 接口 VIP,处理完直接把响应发给客户端;RS 的网关不能、也不可能指向 DIP。
3.4 FULLNAT 模式:源和目标一起改
NAT 只改目标地址,于是有「RS 网关必须指向 DIP」这条硬约束。fullnat 把源地址与目标地址一起改:源地址改成 DIP,目标地址改成 RIP。
图:FULLNAT 与 NAT 的差别就在第二步——NAT 只改目标 IP,FULLNAT 连源 IP 一起改。
RS 看到的来源变成 DIP 同网段,回包按普通路由就能回到 Director,网关不必再指向调度器。⚠️ 它不在主线内核里,属于 LVS 的扩展实现(阿里巴巴开源的那一套),使用前要确认内核支持。
3.5 四种模式横向对照
| 对比项 | NAT | DR | TUN | FULLNAT |
|---|---|---|---|---|
| 改写什么 | 目标 IP + 端口 | 源 / 目标 MAC | 外层加一个 IP 首部 | 源 IP + 目标 IP |
| 响应经过 Director 吗 | 经过 | 不经过 | 不经过 | 经过 |
| RS 网关要求 | 必须指向 DIP | 不能指向 DIP | 不能指向 DIP | 无要求 |
| 与 DS 二层互通 | 不要求 | 必须同一物理网络 | 不要求(可跨机房) | 不要求 |
| 支持端口映射 | 支持 | 不支持 | 不支持 | 支持 |
| 地址要求 | RS 与 DIP 均私网 | RIP 可公可私 | 三个地址均须公网 | 无特殊要求 |
| 对 RS 的要求 | 任意 OS | lo 口配 VIP + 关 ARP | 支持 IP 隧道 | 任意 OS |
| 内核支持 | 主线自带 | 主线自带 | 主线自带 | 需扩展内核 |
| 典型场景 | 小规模、后端需改端口 | 高吞吐 Web 集群 | 跨机房容灾 | 后端网关不可改的云环境 |
一条选择顺序:能二层互通就上 DR(吞吐最高、配置也不复杂);后端必须跨机房就选 TUN;网关动不了或要端口映射就考虑 NAT,规模大了再上 FULLNAT。
四、10 种调度算法
算法表里rr~sh属静态(不看后端负载),lc~lblcr属动态(参考实际连接数)。几条选择经验:
- 后端性能一致用
rr,性能有差异用wrr或wlc; - 需要同一客户端固定落到同一台,用
sh(缓存命中同理可用dh); - 请求耗时差异大,用
lc或wlc更稳; sed与nq是 WLC 的改良版,nq额外保证不会让某台机器一直空着。
五、ipvsadm 命令速查
ipvsadm 分两件事:管理集群服务(VIP 这一层),管理集群服务里的 Real Server。
| 参数 | 含义 | 英文原意 |
|---|---|---|
-A | 添加一个新的集群服务 | Add |
-E | 编辑一个已有的集群服务 | Edit |
-D | 删除一个集群服务 | Delete |
-C | 清空所有规则 | Clear |
-R | 重新载入规则 | Restore |
-S | 保存规则 | Save |
-a | 添加一条 Real Server 规则 | add |
-e | 编辑一条 Real Server 规则 | edit |
-d | 删除一条 Real Server 规则 | delete |
-L/-l | 列出已定义的规则 | List |
-Z | 清空计数器 | Zero |
-t | 服务使用 TCP 协议 | TCP |
-u | 服务使用 UDP 协议 | UDP |
-f | 防火墙标记(firewall-mark)方式定义服务 | firewall mark |
-s | 指定调度算法 | scheduler |
-p | 持久连接时长,配合ipvsadm -Lcn查看持久连接状态 | persistent |
-M | 定义掩码,配合持久连接按网段做会话保持 | netmask |
-r | 指定后端 Real Server 的地址 | real server |
-g | 定义为 LVS-DR 模型 | gateway |
-i | 定义为 LVS-TUN 模型 | ipip |
-m | 定义为 LVS-NAT 模型 | masquerade |
-w | 定义权重,后面跟具体权值 | weight |
-n | 数字形式显示 IP 与端口,不做域名解析 | numeric |
--stats | 显示累计的连接与流量统计 | statistics |
命令按用途分三组记:
## 定义集群服务(VIP 层)ipvsadm -A|E -t|u|f service-address[-s scheduler][-p[timeout]][-M netmask]ipvsadm-D-t|u|f service-address# 删除一个集群服务ipvsadm-C# 清空所有规则ipvsadm-R# 重新载入规则ipvsadm-S[-n]# 保存规则## 管理集群服务里的 Real Serveripvsadm -a|e -t|u|f service-address-rserver-address[-g|i|m][-w weight]ipvsadm-d-t|u|f service-address-rserver-address# 删除一条 RS 规则## 查看与计数ipvsadm -L|l[options]ipvsadm-L-n# 不解析域名,直接显示 IPipvsadm-Z[-t|u|f service-address]# 清空计数器ipvsadm-Lcn# 查看持久连接状态⚠️
ipvsadm -S的输出重定向到/etc/sysconfig/ipvsadm才会持久保存;ipvsadm.service启动时正是从这个文件读取规则(详见 1.3)。
5.1 装完之后:文件清单与状态检查
包里除主程序/usr/sbin/ipvsadm,还有ipvsadm-save(等价-S)、ipvsadm-restore(等价-R)与单元文件ipvsadm.service。两个配置容易混:/etc/sysconfig/ipvsadm是规则数据(需手工touch),ipvsadm-config才是服务配置。要直接看内核里生效的规则,也可以读/proc/net/ip_vs(连接表在/proc/net/ip_vs_conn)。
规则能生效的前提是ip_vs模块已加载。modprobe解决「内核有没有这个能力」,yum install ipvsadm解决「有没有命令去用它」:
grep-i'ip_vs'/boot/config-$(uname-r)# 检查内核编译时是否带 ipvs 支持lsmod|grepip_vs# 查看模块是否已加载modprobe ip_vs# 手工加载(首次执行 ipvsadm 时也会自动加载)附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
LVS | LinuxVirtualServer | Linux 虚拟服务器,内核态负载均衡方案 |
ipvs | IP VirtualServer | 内核里执行转发的代码,挂在 INPUT 钩子上 |
ipvsadm | IPVSadministration | 用户空间管理工具 |
ipvsadm-save/ipvsadm-restore | IPVS adminsave/restore | 规则导出到文件 / 从文件读回内核 |
ip_vs | IPVirtualServer | 提供转发能力的内核模块名 |
netlink | net link | 用户空间与内核通信的套接字协议,ipvsadm 与 Keepalived 都走它 |
Keepalived | keepalive+daemon | 高可用守护进程,用 VRRP 做主备并用健康检查维护 RS |
VRRP | VirtualRouterRedundancyProtocol | 虚拟路由冗余协议,决定谁是主调度器 |
VS/RS | VirtualServer /RealServer | 虚拟服务器(调度器)/ 后端真实服务器(详见 1.2 术语表) |
VIP/DIP/RIP/CIP | Virtual /Director /Real server /ClientIP | 对外服务地址 / 调度器内网地址 / 后端地址 / 客户端地址 |
NAT | NetworkAddressTranslation | 网络地址转换,NAT 模式改目标地址 |
Masq | masquerade | ipvsadm 回显里 NAT 模式的标记 |
DR | DirectRouting | 直接路由,只改 MAC 的模式 |
TUN | TUNnel | 隧道模式,外层再套一个 IP 头 |
FULLNAT | fullNAT | 源地址与目标地址同时改写 |
oneshot/RemainAfterExit | one shot / remain after exit | systemd 单元类型:执行一次即结束、结束后仍标记 active(见 1.3) |
RR/WRR/LC/WLC | RoundRobin /Weighted RR /LeastConnections /Weighted LC | 轮询 / 加权轮询 / 最少连接 / 加权最少连接(10 种算法详见第四章) |
SED/NQ/LBLC/DH/SH | ShortestExpectedDelay /NeverQueue /Locality-Based LC /DestinationHash /SourceHash | 其余调度算法 |
sysctl | systemctl | 查看与修改内核参数 |
📚 参考资料(官方文档 · 中英双语)
- Linux Virtual Server 官方网站(LVS 三大模式与项目背景的原始文档)
- IPVS 内核参数文档(kernel.org)(连接表、调度器与转发相关内核参数)
- Server Load Balancer overview(Alibaba Cloud)(四层与七层负载均衡的产品化解释)
- 负载均衡 SLB 产品概述(阿里云)(中文版)
其余手册在服务器上直接查,不依赖网络、不占链接数:
man8ipvsadm# 集群服务与 Real Server 的全部选项man5sysctl.conf# 内核参数的写法总结:LVS 这条线的逻辑是「入口统一、转发在内核」。工具与引擎各管一头:
ipvsadm(或接管的 Keepalived)在用户空间通过 netlink 定义「谁是对外入口(VIP)、后面有哪几台机器」,ip_vs内核模块按-s指定的算法挑一台,再按-m、-g、-i决定怎么改写报文。所以卸掉管理工具不会让正在跑的转发停下来,但会失去全部配置与排查手段。NAT 只改目标地址、双向都过调度器;DR 只改 MAC、回程不过调度器,是生产里最常用的那一种;TUN 能跨机房但 RS 要支持隧道。觉得有用可以收藏;如果你也踩过 DR 模式 VIP 被 RS 抢答 ARP 的坑,欢迎在评论区聊聊当时是怎么定位的。