一、LVS 基础概述
- 定义:Linux 内核层实现的高性能、高可用负载均衡集群技术,由章文嵩博士开发,现为 Linux 内核标准模块。
- 核心作用:将前端请求流量分发到后端多台真实服务器(RS),提升服务并发处理能力和可用性。
- 行业应用 :阿里四层 SLB 基于LVS+keepalived实现。
- 核心术语
- VS(Virtual Server):调度器,负责请求调度;
- RS(Real Server):真实服务器,负责实际提供服务;
- CIP:客户端 IP;
- VIP:虚拟服务 IP,对外开放的客户访问 IP;
- DIP:调度器内网 IP,用于访问后端内网;
- RIP:真实服务器 IP;
- 访问流程:
CIP <--> VIP == DIP <--> RIP。
二、集群与分布式基础
1. 系统性能扩展方式
- Scale UP(向上扩展):增强单台服务器性能;
- Scale Out(向外扩展):增加服务器设备,通过调度分配负载(集群核心思路)。
2. 集群(Cluster)类型
- LB(负载均衡):多主机组成,各主机承担部分访问,是 LVS 的核心应用场景;
- HA(高可用) :解决单点故障(SPOF),核心指标为可用性
A=MTBF/(MTBF+MTTR),常见要求 3 个 9、4 个 9 或 5 个 9,是运维核心目标 SLA(服务等级协议)的关键; - HPC(高性能计算):属于国家战略资源,非 LVS 相关重点内容。
3. 集群与分布式的核心区别
- 部署方式:集群是同一业务部署在多台服务器上;分布式是将业务拆分为子业务,分别部署在多台服务器上。
- 节点功能:集群中各节点的功能、数据、代码完全一致;分布式中各节点的功能、数据、代码各不相同,需组合实现完整业务。
- 效率提升方式:集群通过提高单位时间处理任务数来提升效率;分布式通过缩短单个任务的执行时间来提升效率。
- 故障影响:集群中单个节点故障,其他节点可接替工作;分布式中单个节点故障,对应的子业务会直接失效。
4. 分布式常见应用
- 存储领域:Ceph、GlusterFs、FastDFS;
- 计算领域:Hadoop、Spark;
- 架构领域:微服务、分布式静态资源、key-value 缓存系统。
三、LVS 核心工作模式
LVS 包含 4 种核心工作模式,核心差异体现在报文转发方式、网络要求和优缺点上,其中 NAT 和 DR 为生产常用模式,TUN 和 FULLNAT 为了解内容,核心信息总结如下:
1. 核心模式核心参数说明
(1)NAT 模式
- 转发核心方式:修改请求报文的目标 IP,即实现 DNAT 功能;
- 网络要求:真实服务器的 RIP 与调度器的 DIP 必须处于同一私网网段;
- 网关指向:真实服务器(RS)的网关需指向调度器(VS)的 DIP;
- 端口映射:支持端口映射;
- 响应报文路径:响应报文必须经过 VS 调度器转发至客户端;
- 调度器瓶颈:调度器易成为系统瓶颈,仅适用于单节点小规模部署。
(2)DR 模式(默认首选)
- 转发核心方式:仅重新封装报文的 MAC 首部,IP 地址和端口保持不变;
- 网络要求:调度器(VS)和所有真实服务器(RS)必须在同一物理网络;
- 网关指向:真实服务器(RS)的网关需指向物理路由,而非 VS 的 DIP;
- 端口映射:不支持端口映射;
- 响应报文路径:真实服务器(RS)直接将响应报文发送至客户端;
- 调度器瓶颈:调度器瓶颈极小,适合大规模部署。
(3)TUN 模式
- 转发核心方式:在原 IP 报文外封装新的 IP 首部;
- 网络要求:调度器的 DIP、VIP,以及真实服务器的 RIP 均需为公网地址;
- 网关指向:真实服务器(RS)的网关需指向物理路由;
- 端口映射:不支持端口映射;
- 响应报文路径:真实服务器(RS)直接将响应报文发送至客户端;
- 调度器瓶颈:调度器瓶颈极小。
(4)FULLNAT 模式
- 转发核心方式:同时修改请求报文的源 IP 和目标 IP;
- 网络要求:真实服务器的 RIP 与调度器的 DIP 可处于不同私网网段;
- 网关指向:真实服务器(RS)的网关需指向物理路由;
- 端口映射:支持端口映射;
- 响应报文路径:响应报文必须经过 VS 调度器转发至客户端;
- 调度器瓶颈:调度器存在较大瓶颈。
2. 关键模式细节
(1)NAT 模式
- 本质:实现多目标 IP 的 DNAT,可同时修改目标端口;
- 特点:VS 必须为 Linux 系统,RS 可以是任意操作系统;请求和响应报文均需经过 VS,易造成调度器性能瓶颈。
(2)DR 模式(应用最广泛)
- 核心:仅修改 MAC 地址,IP 地址和端口保持不变;
- 关键配置:VS 和所有 RS 都需要配置 VIP,需通过以下 3 种方式解决 VIP 地址冲突问题:
- 在前端网关静态绑定 VIP 与 VS 的 MAC 地址;
- 在 RS 上使用 arptables 工具,屏蔽 VIP 的 ARP 请求和响应;
- 在 RS 上修改内核参数,通过
arp_ignore=1和arp_announce=2限制 ARP 通告与应答。
四、LVS 调度算法
调度算法分为静态算法(不考虑真实服务器负载情况)和动态算法(根据真实服务器实时负载进行调度),Linux 4.15 内核后新增 2 种实用算法,核心算法及适用场景如下:
1. 静态调度算法(无负载感知)
(1)RR(轮询)
- 核心逻辑:将请求平均分配给所有真实服务器(RS);
- 适用场景:所有 RS 的硬件配置和性能完全一致的场景。
(2)WRR(加权轮询)
- 核心逻辑:根据 RS 的权重值分配请求,权重越高的 RS,被调度的次数越多;
- 适用场景:RS 的硬件配置和性能不一致的场景。
(3)SH(源 IP 哈希)
- 核心逻辑:同一客户端源 IP 的请求,会始终被调度到同一台 RS;
- 适用场景:业务需要实现会话绑定(session sticky)的场景。
(4)DH(目标 IP 哈希)
- 核心逻辑:同一目标 IP 的请求,会始终被调度到同一台 RS;
- 适用场景:正向代理缓存场景,如宽带运营商的缓存服务。
2. 动态调度算法(基于 RS 负载,Overhead 值越小越优先)
(1)LC(最少连接)
- 核心负载计算公式:Overhead = 活跃连接数 × 256 + 非活跃连接数;
- 适用场景:以长连接为主要业务的应用场景。
(2)WLC(加权最少连接,默认算法)
- 核心负载计算公式:Overhead = (活跃连接数 × 256 + 非活跃连接数) / 权重;
- 适用场景:绝大多数通用业务场景,是生产环境默认选择。
(3)SED(最短预期延迟)
- 核心负载计算公式:Overhead = (活跃连接数 + 1 + 非活跃连接数) × 256 / 权重;
- 适用场景:需要让初始连接优先分配给高权重 RS 的场景。
(4)NQ(永不排队)
- 核心逻辑:第一轮请求会均匀分配给所有 RS,后续请求按照 SED 算法进行调度;
- 适用场景:需要避免低权重 RS 长期处于请求排队状态的场景。
(5)LBLC(基于本地性最少连接)
- 核心逻辑:结合 DH 算法的特性与 RS 实时负载,实现动态目标 IP 哈希调度;
- 适用场景:正向代理业务场景。
(6)LBLCR(带复制的 LBLC)
- 核心逻辑:在 LBLC 算法基础上,解决负载不均问题,将重负载 RS 的请求复制调度至轻负载 RS;
- 适用场景:大规模正向代理业务场景。
3. 4.15 内核新增算法
- FO(加权故障转移):遍历所有 RS,优先选择未过载且权重最高的节点,适合灰度发布场景;
- OVF(溢出连接):当权重最高的 RS 活跃连接数超过其权重值时,将多余请求调度至下一个高权重 RS,可精准控制节点负载。
五、LVS 部署核心工具与命令
1. 核心软件包
- 主程序包:
ipvsadm; - 服务单元:
ipvsadm.service; - 规则管理工具:
ipvsadm-save(用于保存规则)、ipvsadm-restore(用于重载规则); - 配置文件路径:
/etc/sysconfig/ipvsadm(存储调度规则)、/etc/sysconfig/ipvsadm-config(存储基础配置); - 内核状态文件路径:
/proc/net/ip_vs(查看当前调度规则)、/proc/net/ip_vs_conn(查看当前连接状态)。
2. ipvsadm 核心命令(按功能分类)
(1)集群服务管理(增 / 删 / 改 / 清空 / 重载 / 保存)
ipvsadm -A -t 虚拟IP:端口 -s 调度算法 # 添加TCP集群服务
ipvsadm -E -t 虚拟IP:端口 -s 新算法 # 修改集群服务的调度算法
ipvsadm -D -t 虚拟IP:端口 # 删除指定的TCP集群服务
ipvsadm -C # 清空所有LVS调度规则
ipvsadm -R < 规则文件 # 从规则文件中重载调度规则
ipvsadm -Sn > 规则文件 # 保存当前规则到文件(-n:不解析IP,显示数字格式)
(2)真实服务器(RS)管理(增 / 删 / 改)
ipvsadm -a -t 虚拟IP:端口 -r RS_IP:端口 -m/-g/-i -w 权重 # 为集群添加RS
# 模式参数说明:-m代表NAT模式,-g代表DR模式,-i代表TUN模式;-w后接数字表示权重
ipvsadm -e -t 虚拟IP:端口 -r RS_IP:端口 -w 新权重 # 修改已有RS的权重
ipvsadm -d -t 虚拟IP:端口 -r RS_IP:端口 # 从集群中删除指定RS
(3)查看与统计
ipvsadm -Ln # 查看当前LVS规则(-n:不解析IP和端口,显示数字格式)
ipvsadm -Ln --rate # 查看流量统计信息,包含CPS、InPPS、OutPPS、InBPS、OutBPS
ipvsadm -Z # 清空所有流量统计计数器
3. 关键参数说明
-p [timeout]:设置持久连接超时时间,默认 360 秒。开启后,同一源 IP 的请求在超时时间内,会始终调度到同一台 RS,可解决表单提交丢失等会话相关问题;-f 数字:基于防火墙标记(FWM)定义集群服务。可将多个端口(如 80 和 443)标记为同一编号,归为一个集群,解决多端口业务轮询错乱的问题。
六、LVS 经典实战配置要点
1. NAT 模式部署核心步骤
- 调度器(VS)开启内核路由转发:执行
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf && sysctl --system; - 在 VS 上安装
ipvsadm工具,添加集群服务,并指定-m参数添加后端 RS(NAT 模式); - 所有真实服务器(RS)的网关,必须指向 VS 的 DIP,且确保 RS 与 VS 处于同一私网网段;
- 执行保存规则命令,并设置
ipvsadm.service开机自启,确保规则持久化。
2. DR 模式部署核心步骤
- 在 VS 和所有 RS 的 lo 回环接口上,配置 VIP(需设置 32 位掩码);
- 在 RS 上修改内核参数,通过
arp_ignore=1和arp_announce=2解决 VIP 地址冲突问题; - 在 VS 上添加集群服务,指定
-g参数添加后端 RS(DR 模式),RS 的网关需指向物理路由,而非 VS 的 DIP; - 确保 VS 和所有 RS 处于同一物理网络,保障 MAC 地址通信正常。
3. 解决多端口轮询错乱(以 80 和 443 端口为例)
通过防火墙标记(FWM)将多个端口归为一个集群服务,核心步骤如下:
- 为 80 和 443 端口添加防火墙标记:执行
iptables -t mangle -A PREROUTING -d VIP -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666; - 基于标记 6666 创建集群服务:执行
ipvsadm -A -f 6666 -s 调度算法; - 为标记集群添加后端 RS:执行
ipvsadm -a -f 6666 -r RS_IP -g(DR 模式)。
4. 持久连接配置
在创建或修改集群服务时,添加-p参数即可开启持久连接,解决会话中断问题,示例命令:
ipvsadm -E -f 6666 -s rr -p 3000 # 将标记6666的集群算法改为rr,持久连接超时3000秒
七、LVS 核心注意事项
- NAT 模式中,调度器(VS)会成为网络瓶颈,仅适合后端 RS 数量较少的小规模场景;DR 模式无此瓶颈,是生产环境首选模式;
- DR 模式和 TUN 模式不支持端口映射,要求 RS 的服务端口与 VS 的虚拟服务端口完全一致;
- 配置 LVS 时,需清空 iptables 的默认规则,避免 iptables 的 PREROUTING 链干扰 IPVS 的正常工作;
- FULLNAT 模式并非 Linux 内核默认支持功能,需要手动编译内核才能启用;
- 持久连接虽能解决会话问题,但可能导致 RS 负载不均,需根据业务场景合理设置超时时间。