Skip to content

LVS

LVS 基于 Linux 内核 IPVS 实现四层负载均衡,配置重点在调度器、VIP、Real Server、转发模式、调度算法、ipvsadm 和健康检查。

一、LVS 是什么

LVS 全称 Linux Virtual Server。它把一组真实服务器包装成一个虚拟服务,客户端访问 VIP,调度器根据规则把连接分发到后端 Real Server。

基本对象:

对象含义
DirectorLVS 调度器
VIP对外提供服务的虚拟 IP
Real Server真正处理请求的后端服务器
IPVSLinux 内核里的负载均衡模块
ipvsadm管理 IPVS 规则的命令行工具

链路:

LVS 做的是四层转发,不理解 HTTP 域名和路径。它适合 TCP/UDP 层面的高吞吐入口,比如 Web 四层入口、数据库代理前置、一些内部 TCP 服务。

二、三种转发模式

LVS 常见 NAT、DR、TUN 三种模式。

模式请求路径响应路径特点
NAT客户端 -> Director -> Real ServerReal Server -> Director -> 客户端配置直观,Director 承担进出流量
DR客户端 -> Director -> Real ServerReal Server -> 客户端性能好,要求同二层网络处理 ARP
TUN客户端 -> Director -> Real ServerReal Server -> 客户端跨网段,依赖 IP 隧道

NAT 模式好理解,Director 像四层网关。DR 模式性能更常见,入方向经过 Director,回包直接从 Real Server 出去。TUN 模式现在普通业务里见得少一些。

我个人在实验和小环境里先用 NAT 理解流程,生产里如果网络条件合适,DR 模式更常见;但 DR 的 ARP 处理不写清楚,很容易出现 VIP 抢答。

三、安装和内核模块

安装工具:

bash
yum install -y ipvsadm

Debian / 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
VIP192.168.10.100
Real Server 1192.168.10.21:80
Real Server 2192.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:PORTTCP 虚拟服务
-s rr使用轮询算法
-a给虚拟服务添加 Real Server
-r RIP:PORTReal Server 地址
-mNAT 模式

查看:

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=2

Real 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 = 2

DR 模式里,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 仍然可能把连接分过去。

常见做法:

方式说明
Keepalivedvirtual_serverreal_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 规则先对上,再看后端应用。