Linux Virtual Server (LVS)
一、LVS基础认知
1.1 LVS简介
LVS(Linux Virtual Server)是Linux内核层实现的高性能、高可用负载均衡集群技术 ,由章文嵩博士开发,现为Linux内核标准模块。其核心作用是将前端请求流量分发到后端多台真实服务器(RS),提升服务的并发处理能力和可用性,阿里四层SLB就是基于LVS+keepalived实现。
1.2 集群与分布式核心区别
系统性能扩展分为向上扩展(Scale UP,增强单台设备性能)和向外扩展(Scale Out,增加设备数量),LVS属于Scale Out方案,核心解决多设备的调度分配问题。
| 特性 | 集群(Cluster) | 分布式(Distributed) |
|---|---|---|
| 部署逻辑 | 同一业务部署在多台服务器,功能/数据/代码一致 | 一个业务拆分为多个子业务,各服务器功能/数据/代码不同 |
| 效率提升方式 | 提高单位时间内执行的任务数 | 缩短单个任务的执行时间 |
| 故障影响 | 单台服务器故障,其他服务器可顶替 | 单台节点故障,对应子业务直接失效 |
| 典型应用 | LVS负载均衡集群、Nginx集群 | Hadoop计算、Ceph存储、微服务架构 |
1.3 LVS核心术语
LVS集群的网络交互依赖以下核心IP/角色定义,访问流程为:CIP <--> VIP == DIP <--> RIP
-
VS:Virtual Server,调度器,核心负责流量分发
-
RS:Real Server,真实服务器,负责实际提供业务服务
-
CIP:Client IP,客户端主机IP
-
VIP:Virtual IP,调度器外网IP,对外开放的客户访问IP
-
DIP:Director IP,调度器内网IP,用于和后端RS通信
-
RIP:Real Server IP,真实服务器的IP地址
二、LVS核心知识点梳理
2.1 LVS四大工作模式
LVS通过不同的报文转发方式实现负载均衡,分为NAT、DR、TUN、FullNAT 四种模式,其中NAT 和DR 为实际应用中最常用的模式,TUN和FullNAT仅作了解。四种模式的核心差异在于报文修改方式、网络拓扑、数据转发路径,核心总结如下:
| 工作模式 | 核心转发原理 | 数据路径特点 | 网络要求 | 端口映射 | 适用场景 |
|---|---|---|---|---|---|
| NAT | 多目标IP的DNAT,修改目标IP/端口 | 请求+响应报文均经过VS | RIP与DIP同网段,RS网关指向DIP | 支持 | 后端服务器数量少的场景 |
| DR(默认) | 重新封装MAC首部,IP/端口不变 | 请求报文经VS,响应报文由RS直连客户端 | VS和RS同物理网络,均配置VIP | 不支持 | 高并发、大流量场景 |
| TUN | 原IP报文外封装新IP首部 | 请求报文经VS,响应报文由RS直连客户端 | DIP/VIP/RIP均为公网IP | 不支持 | 跨地域的RS集群 |
| FullNAT | 同时修改请求报文的源/目标IP | 请求+响应报文均经过VS | RIP与DIP可不同网段 | 支持 | 复杂网络拓扑场景 |
重点模式:DR模式核心特点
DR是LVS默认且应用最广泛 的模式,性能远高于NAT模式(避免VS成为瓶颈),但需解决VIP地址冲突问题(VS和RS均配置VIP,需防止ARP广播导致的地址解析异常),解决方案有3种:
-
前端网关做静态绑定(VIP与VS的MAC地址);
-
RS上使用
arptables工具限制ARP请求; -
RS上修改内核参数
arp_ignore和arp_announce(最常用)。
2.2 LVS调度算法
LVS的调度算法分为静态算法 (仅按算法本身调度,不考虑RS负载)和动态算法 (根据RS实时负载状态调度,负载值Overhead越小越优先),4.15版本内核新增了FO/OVF算法,适用于灰度发布等场景。
2.2.1 静态调度算法
| 算法 | 英文全称 | 核心逻辑 | 适用场景 |
|---|---|---|---|
| RR | Round Robin | 轮询,平均分配请求 | RS配置性能一致的场景 |
| WRR | Weighted RR | 加权轮询,权重越高调度次数越多 | RS配置性能不一致的场景 |
| SH | Source Hashing | 源IP哈希,同一IP请求固定到同一RS | 需会话绑定的场景 |
| DH | Destination Hashing | 目标IP哈希,同一目标地址请求固定到同一RS | 正向代理缓存(如宽带运营商) |
2.2.2 动态调度算法
默认调度算法为WLC(加权最少连接) ,核心计算负载值Overhead,值越小优先级越高:
-
LC :最少连接,
Overhead = 活动连接数×256 + 非活动连接数,适用于长连接应用; -
WLC :加权最少连接,
Overhead = (活动连接数×256 + 非活动连接数)/权重; -
SED :最短预期延迟,
Overhead = (活动连接数+1+非活动连接数)×256/权重,高权重RS优先; -
NQ:永不排队,第一轮均匀分配,后续按SED调度;
-
LBLC/LBLCR:基于本地的最少连接,解决DH算法的负载不均衡问题。
2.2.3 内核新增算法
-
FO :加权故障转移,遍历找到未过载+权重最高的RS,适用于灰度发布;
-
OVF:溢出连接,权重最高的RS直到活动连接数超过权重值,再调度至下一个RS。
2.3 LVS管理工具:ipvsadm
LVS的集群配置与管理依赖ipvsadm工具,其核心功能为集群服务管理、RS管理、规则查看/保存/重载 ,先通过yum install ipvsadm -y安装,核心信息如下:
| 组件 | 路径/命令 | 作用 |
|---|---|---|
| 主程序 | /usr/sbin/ipvsadm | 核心配置命令 |
| 规则保存 | ipvsadm-save / ipvsadm -S | 保存调度规则到文件 |
| 规则重载 | ipvsadm-restore / ipvsadm -R | 从文件重载调度规则 |
| 配置文件 | /etc/sysconfig/ipvsadm | 调度规则持久化文件 |
| 系统服务 | ipvsadm.service | 开机自启LVS规则 |
ipvsadm核心命令
| 功能 | 核心命令格式 | 关键参数说明 |
|---|---|---|
| 添加集群服务 | ipvsadm -A -t | u |
| 添加RS | ipvsadm -a -t | u |
| 查看规则 | ipvsadm -Ln [--rate] |
-n不解析IP,--rate查看流量速率 |
| 保存规则 | ipvsadm -Sn > 配置文件路径 |
持久化规则,防止重启失效 |
| 重载规则 | ipvsadm -R < 配置文件路径 |
从文件恢复规则 |
| 清空规则 | ipvsadm -C |
清空所有调度规则 |
| 持久连接 | ipvsadm -A -t 服务地址 -s 算法 -p 超时时间 |
默认定时360s,实现会话保持 |
三、LVS实验
实验分为NAT模式集群部署 和DR模式集群部署
3.1 实验1:NAT模式LVS集群部署
3.1.1 实验说明
实验目的:掌握NAT模式LVS集群的部署流程,验证RR/WRR调度算法的效果;
实验原理:VS通过DNAT修改请求报文的目标IP/端口,将流量分发到RS,RS响应报文经VS回传给客户端,RS网关必须指向VS的DIP;
实验环境:
| 主机名 | IP地址 | 角色 | 核心配置要求 |
|---|---|---|---|
| VS | 172.25.254.100(DIP) | 调度器(VS) | 双网卡(NAT+仅主机),开启内核路由 |
| RS1 | <192.168.0.10> | 真实服务器(RS1) | 仅主机网卡,网关指向<192.168.0.100> |
| RS2 | <192.168.0.20> | 真实服务器(RS2) | 仅主机网卡,网关指向<192.168.0.100> |
| 预期结果:测试机多次访问VIP,请求会按RR/WRR算法均匀/加权分发到RS1和RS2。 |
3.1.2 操作步骤(所有操作在root用户下执行)
步骤1:VS开启内核路由功能
NAT模式依赖Linux内核的IP转发功能,需开启,执行以下命令:
Bash
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

验证 :执行sysctl -p,输出net.ipv4.ip_forward = 1即为成功。
步骤2:VS安装ipvsadm工具
Bash
yum install ipvsadm -y

步骤3:修改调度算法为WRR,验证加权效果
将RS1权重设为2,RS2权重设为1,请求分发比例应为2:1:
Bash
# 1. 添加集群服务算法为WRR
ipvsadm -A -t 172.25.254.100:80 -s wrr
# 2. 添加RS1权重为2
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
# 3. 添加RS2权重为1
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1
# 4. 查看修改后的规则
ipvsadm -Ln

在测试机执行循环curl命令,验证加权效果:
Bash
for N in {1..6};do curl 172.25.254.100;done

预期效果:RS1被调度4次,RS2被调度2次,比例2:1。
步骤4:持久化LVS调度规则
默认ipvsadm配置为临时生效,重启后丢失,需保存规则并设置开机自启:
Bash
# 1. 保存规则到配置文件
ipvsadm-save -n > /etc/sysconfig/ipvsadm
# 2. 设置ipvsadm服务开机自启并启动
systemctl enable --now ipvsadm.service
# 3. 验证服务状态
systemctl status ipvsadm.service

3.2 实验2:DR模式LVS集群部署
3.2.1 实验说明
实验目的:掌握DR模式LVS集群的部署流程,解决VIP地址冲突问题,验证WRR调度算法;
实验原理:VS仅修改请求报文的MAC地址,RS直接将响应报文回传给客户端,VS和RS均配置VIP,需修改RS内核参数限制ARP解析;
实验环境:
| 主机名 | IP地址 | VIP | 角色 | 核心配置要求 |
|---|---|---|---|---|
| client | 172.25.254.10 | 无 | 测试机 | NAT网卡,可访问路由器 |
| router | 172.25.254.100/192.168.0.10 | 无 | 路由器 | 双网卡(NAT+仅主机) |
| lvs | 192.168.0.100 | 192.168.0.200 | 调度器(VS) | 仅主机网卡,lo口配置VIP |
| RS1 | 192.168.0.100 | 192.168.0.200 | 真实服务器1 | 仅主机网卡,lo口配置VIP,修改内核参数 |
| RS2 | 192.168.0.100 | 192.168.0.200 | 真实服务器2 | 仅主机网卡,lo口配置VIP,修改内核参数 |
| 预期结果:测试机访问VIP,请求经VS分发到RS,响应报文由RS直连测试机,实现高并发负载均衡。 |
3.2.2 操作步骤(核心步骤,省略基础网卡配置)
步骤1:所有RS(RS1/RS2)配置VIP到lo回环口
DR模式要求VS和RS均配置VIP,将VIP绑定到lo口(避免网卡冲突),执行以下命令:
Bash
# 编辑lo口网络配置
vim /etc/NetworkManager/system-connections/lo.nmconnection
# 添加以下配置
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32
method=manual
# 重启lo口连接
nmcli connection up lo
# 验证VIP配置:查看lo口IP
ip addr show lo

步骤2:所有RS(RS1/RS2)修改内核参数,解决VIP地址冲突
修改arp_ignore和arp_announce,限制ARP请求/通告,两台RS操作完全一致:
Bash
# 临时生效(重启后丢失,可写入sysctl配置实现永久生效)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

参数说明:
-
arp_ignore=1:仅对请求的目标IP配置在接收接口上时,才响应ARP; -
arp_announce=2:仅向本网络通告本机接口信息,避免VIP暴露。
步骤3:添加策略
Bash
#router
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.200
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
#vscode
ipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
步骤4:测试机(client)验证DR模式负载均衡效果
在测试机执行循环curl命令,访问VIP,查看请求分发结果:
Bash
for N in {1..10};do curl 192.168.0.200;done

预期效果:请求在RS1和RS2之间交替分发,响应报文由RS直连测试机,VS仅处理请求分发,无响应瓶颈。
步骤5:持久化DR模式调度规则
与NAT模式一致,保存规则并设置ipvsadm服务开机自启:
Bash
ipvsadm -Sn > /etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm.service