Appearance
LVS
LVS 基于 Linux 内核 IPVS 实现四层负载均衡,配置重点在调度器、VIP、Real Server、转发模式、调度算法、ipvsadm 和健康检查。
一、LVS 是什么
LVS 全称 Linux Virtual Server。它把一组真实服务器包装成一个虚拟服务,客户端访问 VIP,调度器根据规则把连接分发到后端 Real Server。
基本对象:
| 对象 | 含义 |
|---|---|
| Director | LVS 调度器 |
| VIP | 对外提供服务的虚拟 IP |
| Real Server | 真正处理请求的后端服务器 |
| IPVS | Linux 内核里的负载均衡模块 |
| ipvsadm | 管理 IPVS 规则的命令行工具 |
链路:
LVS 做的是四层转发,不理解 HTTP 域名和路径。它适合 TCP/UDP 层面的高吞吐入口,比如 Web 四层入口、数据库代理前置、一些内部 TCP 服务。
二、三种转发模式
LVS 常见 NAT、DR、TUN 三种模式。
| 模式 | 请求路径 | 响应路径 | 特点 |
|---|---|---|---|
| NAT | 客户端 -> Director -> Real Server | Real Server -> Director -> 客户端 | 配置直观,Director 承担进出流量 |
| DR | 客户端 -> Director -> Real Server | Real Server -> 客户端 | 性能好,要求同二层网络处理 ARP |
| TUN | 客户端 -> Director -> Real Server | Real Server -> 客户端 | 跨网段,依赖 IP 隧道 |
NAT 模式好理解,Director 像四层网关。DR 模式性能更常见,入方向经过 Director,回包直接从 Real Server 出去。TUN 模式现在普通业务里见得少一些。
我个人在实验和小环境里先用 NAT 理解流程,生产里如果网络条件合适,DR 模式更常见;但 DR 的 ARP 处理不写清楚,很容易出现 VIP 抢答。
三、安装和内核模块
安装工具:
bash
yum install -y ipvsadmDebian / Ubuntu:
bash
apt update
apt install -y ipvsadm加载模块:
bash
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh查看:
bash
lsmod | grep ip_vs
ipvsadm -Ln # 查看当前 IPVS 规则,-n 表示不做 DNS 解析四、NAT 模式示例
示例环境:
| 角色 | 地址 |
|---|---|
| Director 内网 | 192.168.10.10 |
| VIP | 192.168.10.100 |
| Real Server 1 | 192.168.10.21:80 |
| Real Server 2 | 192.168.10.22:80 |
Director 开启转发:
bash
sysctl -w net.ipv4.ip_forward=1 # 临时开启内核转发持久配置:
conf
# /etc/sysctl.d/99-lvs.conf
net.ipv4.ip_forward = 1加载:
bash
sysctl --system配置 VIP:
bash
ip addr add 192.168.10.100/24 dev eth0 # 给 Director 绑定 VIP
ip addr show dev eth0添加 LVS 规则:
bash
ipvsadm -A -t 192.168.10.100:80 -s rr
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.21:80 -m
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.22:80 -m参数说明:
| 参数 | 含义 |
|---|---|
-A | 添加虚拟服务 |
-t VIP:PORT | TCP 虚拟服务 |
-s rr | 使用轮询算法 |
-a | 给虚拟服务添加 Real Server |
-r RIP:PORT | Real Server 地址 |
-m | NAT 模式 |
查看:
bash
ipvsadm -Ln
ipvsadm -Ln --stats # 查看连接和流量统计Real Server 默认网关要指向 Director,或者至少回包路径要经过 Director。NAT 模式里响应流量如果不回 Director,连接就会异常。
NAT 模式排查时主要看这几块:
| 检查点 | 说明 |
|---|---|
| 默认网关 | Real Server 的回包路径要回到 Director |
| 内核转发 | Director 上 net.ipv4.ip_forward 要开启 |
| 防火墙 | 客户端到 VIP、Director 到 Real Server、Real Server 回 Director 都要放行 |
| 连接跟踪 | Director 承担进出流量,连接很多时可能要看 conntrack 表 |
conntrack 可以理解成内核记录连接状态的一张表。NAT 模式改写了地址和端口,连接表里会记录改写前后的关系。出现新连接建立慢、访问时通时不通、Director CPU 或内核连接表异常时,NAT 模式比 DR 模式更容易先查到这里。
五、DR 模式示例
DR 模式下,Director 接收请求后改二层 MAC,把包转给 Real Server;Real Server 直接把响应发给客户端。
更细一点看,客户端请求的目标 IP 仍然是 VIP,Director 只是把二层目标 MAC 改成某台 Real Server 的 MAC。Real Server 收到包以后,内核看到目标 IP 是本机 lo 上绑定的 VIP,于是交给本机服务处理。响应回客户端时源 IP 还是 VIP,所以客户端认为一直在和 VIP 通信。
Director 配置:
bash
ip addr add 192.168.10.100/24 dev eth0
ipvsadm -A -t 192.168.10.100:80 -s wrr
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.21:80 -g -w 1
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.22:80 -g -w 1-g 表示 DR 模式,-w 是权重。
Real Server 要在 loopback 上绑定 VIP,并处理 ARP:
bash
ip addr add 192.168.10.100/32 dev lo
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_announce=2Real Server 上的服务要能接住目标地址为 VIP 的请求。Nginx 监听 0.0.0.0:80 通常没问题;如果应用只监听 Real Server 自己的 RIP,抓包能看到请求到机器,但应用不会响应 VIP 流量。
bash
ss -lntp | grep ':80' # 确认服务监听地址,DR 模式下不能只盯 IPVS 规则持久配置:
conf
# /etc/sysctl.d/99-lvs-dr.conf
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 = 2DR 模式里,Real Server 绑定 VIP 是为了能接收目标地址为 VIP 的包;ARP 抑制是为了避免 Real Server 对外宣称自己拥有 VIP。这个点没处理好,VIP 会在网络里变得很怪。
六、调度算法
常见算法:
| 算法 | 含义 |
|---|---|
rr | 轮询 |
wrr | 加权轮询 |
lc | 最少连接 |
wlc | 加权最少连接 |
sh | 源地址哈希 |
dh | 目标地址哈希 |
修改虚拟服务算法:
bash
ipvsadm -E -t 192.168.10.100:80 -s wlc # 把调度算法改成加权最少连接调整权重:
bash
ipvsadm -e -t 192.168.10.100:80 -r 192.168.10.21:80 -g -w 2七、会话保持
LVS 的持久连接是让同一来源在一段时间内尽量落到同一台 Real Server。它解决的是调度层面的“粘住”,不是 session 存储本身。老系统还把 session 放在本机内存里时会用到,但更稳的方式还是把 session 外置到 Redis、数据库或改成无状态 token。
创建虚拟服务时加持久连接:
bash
ipvsadm -A -t 192.168.10.100:80 -s rr -p 300 # 300 秒内同一来源尽量分到同一后端已有虚拟服务可以修改:
bash
ipvsadm -E -t 192.168.10.100:80 -s rr -p 300源地址很多来自同一个 NAT 出口时,持久连接会让大量用户粘到同一台后端。办公室出口、移动网络、上游代理都会造成这种现象,排查单台后端压力高时要把来源 IP 分布一起看。
八、保存和恢复规则
保存规则:
bash
ipvsadm-save > /etc/sysconfig/ipvsadm恢复规则:
bash
ipvsadm-restore < /etc/sysconfig/ipvsadm不同发行版的持久化方式不完全一样。生产里我更习惯把 LVS 规则写进部署脚本或 Keepalived 配置里,而不是只靠手工 ipvsadm 命令留在机器上。
九、健康检查
ipvsadm 本身只管理 IPVS 规则,不负责主动健康检查。后端挂了以后,如果没有其他组件摘除 Real Server,LVS 仍然可能把连接分过去。
常见做法:
| 方式 | 说明 |
|---|---|
| Keepalived | 用 virtual_server 和 real_server 做 LVS 健康检查 |
| 自写脚本 | 探测后端,动态执行 ipvsadm -d/-a |
| 外部平台 | 由配置管理或调度系统维护规则 |
简单脚本示例:
bash
#!/bin/bash
set -euo pipefail
vip="192.168.10.100:80"
rs="192.168.10.21:80"
if curl -fsS "http://192.168.10.21/health" >/dev/null; then
ipvsadm -a -t "$vip" -r "$rs" -g 2>/dev/null || true
else
ipvsadm -d -t "$vip" -r "$rs" 2>/dev/null || true
fi脚本只是说明思路。真实环境里要处理抖动、连续失败次数、恢复确认和操作日志,不然健康检查会反复摘加后端。
十、排查
常用检查:
bash
ipvsadm -Ln
ipvsadm -Ln --stats
ip addr show
sysctl net.ipv4.ip_forward看连接:
bash
ipvsadm -Ln --rate
conntrack -L | head # NAT 模式可能需要看连接跟踪抓包:
bash
tcpdump -nn host 192.168.10.100 and port 80
tcpdump -nn host 192.168.10.21 and port 80常见问题:
| 现象 | 常见方向 |
|---|---|
| VIP 不通 | VIP 没绑定、防火墙、路由 |
| 后端没流量 | IPVS 规则不对、健康检查摘除、算法/权重 |
| NAT 模式回包异常 | Real Server 网关或回包路由不对 |
| DR 模式时通时不通 | ARP 抑制没处理好 |
| 单个后端压力大 | 权重、连接保持、源地址分布 |
LVS 排查里网络层信息比应用日志更早出现。VIP、路由、ARP、抓包和 IPVS 规则先对上,再看后端应用。