LVS 集群技术

发布于:2025-07-22 ⋅ 阅读:(15) ⋅ 点赞:(0)

Linux Virtual Server (LVS) 技术概述

一、LVS 基础概念

1.0 LVS 是什么

想象你去一家热门餐厅吃饭,门口有位服务员会根据餐桌的忙碌程度,把你引导到最合适的空位 —— 这个服务员就相当于 LVS(Linux Virtual Server)。​

LVS 是一种能让多台服务器协同工作的技术,它通过一个 "调度器" 将用户的请求合理分配给后端的多台服务器,让整个系统像一台超级服务器一样高效运转。这种技术能解决单台服务器扛不住大量访问的问题,同时让服务更稳定(一台服务器出问题,其他的能顶上)。

1.1 LVS 的定义与基本功能

Linux Virtual Server (LVS) 是一个高性能、高可用的负载均衡解决方案,旨在通过将客户端请求智能分发到后端的多台真实服务器(Real Server),实现服务器集群的负载均衡。它是一个虚拟的服务器集群系统,通过负载均衡技术将多台服务器组织成一个统一的虚拟服务器,对外表现为单一服务入口。

LVS 由章文嵩博士于 1998 年 5 月发起成立,是中国国内最早出现的自由软件项目之一。如今,LVS 已经成为 Linux 标准内核的一部分,从 Linux 2.4 内核版本开始,系统已经完全内置了 LVS 的各个功能模块,无需额外编译内核即可直接使用 LVS 提供的各种功能。

LVS 的核心功能包括:

负载均衡:根据调度算法(如轮询、最少连接)将请求分发到后端服务器。

高可用性:配合 Keepalived 等工具实现故障转移,避免单点故障。

高性能:基于内核的四层转发,效率极高,适合高并发场景。

可扩展性:支持动态添加或移除后端服务器。

LVS 的主要作用是通过提供的负载均衡技术和 Linux 操作系统实现一个高性能、高可用的服务器集群,具有良好可靠性、可扩展性和可操作性,从而以低廉的成本实现最优的服务性能。

1.2 LVS 的核心组件

LVS 系统主要由以下两个核心组件构成:

IPVS (IP Virtual Server)

这是 Linux 内核中的一个模块,负责实现负载均衡的调度算法和数据包转发功能。

它工作在内核空间,是 LVS 的核心处理单元,负责接收客户端请求并根据配置的规则将请求分发给后端的真实服务器。

ipvsadm

这是用户空间的命令行工具,用于配置和管理 LVS 规则。

它允许系统管理员定义虚拟服务(Virtual Service)和真实服务器(Real Server)的关系,设置负载均衡策略和调度算法。

如果将 LVS 类比于 netfilter,那么 ipvsadm 就类似于 iptables 工具的地位。

1.3 LVS 的优势与不足

LVS 作为一种成熟的负载均衡解决方案,具有以下显著优势:

高并发连接处理能力:LVS 基于内核网络层面工作,有超强的承载能力和并发处理能力。单台 LVS 负载均衡器可支持上万并发连接。

稳定性强:工作在网络 4 层之上仅作分发之用,这个特点决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和 CPU 资源消耗极低。

成本低廉:与硬件负载均衡器(少则十几万,多则几十万上百万)相比,LVS 只需一台服务器就能免费部署使用,性价比极高。

配置简单:LVS 配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。

支持多种算法:支持多种调度算法,可根据业务场景灵活调配使用。

支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

应用范围广:因为 LVS 工作在 4 层,所以它几乎可以对所有应用做负载均衡,包括 HTTP、数据库、DNS、FTP 服务等等。

然而,LVS 也存在一些局限性:

功能局限性:工作在 4 层,不支持 7 层规则修改,机制过于庞大。

不适合小规模应用:对于小规模应用或简单的负载均衡需求,LVS 可能显得过于复杂和重量级。

二、LVS 集群体系结构

2.1 LVS 逻辑架构

LVS 架构从逻辑上可分为三个主要层次:

调度层(Director Server)

也称为负载均衡器或分发器,是整个集群的入口点,负责接收客户端请求并根据配置的调度算法将请求分发给后端的真实服务器。

调度层通常配置有一个虚拟 IP 地址(VIP),这是客户端访问服务的统一入口地址。

服务器集群层(Real Server)

由多台真实服务器组成,负责处理客户端的实际请求。

这些服务器可以是物理服务器或虚拟机,它们通常运行相同的应用程序或服务。

共享存储层(可选)

提供共享存储服务,确保所有真实服务器能够访问相同的数据,实现数据一致性。

共享存储可以是网络附加存储(NAS)、存储区域网络(SAN)或分布式文件系统。

用户  →  [调度器(LVS)]  →  [多台真实服务器]  →  [共享存储]
         (总控中心)      (实际干活的机器)  (共用的仓库)

2.2 LVS 网络组件与术语

在 LVS 集群系统中,涉及一些关键的网络组件和术语:

虚拟 IP 地址(VIP)

用于向客户端提供服务的 IP 地址,配置于负载均衡器上,是客户端访问服务的统一入口。

所有客户端请求都发送到这个 IP 地址。

负载均衡器 IP 地址(DIP)

负载均衡器的实际 IP 地址,通常用于与后端真实服务器通信。

真实服务器 IP 地址(RIP)

集群中各真实服务器的实际 IP 地址。

客户端 IP 地址(CIP)

发送请求的客户端的 IP 地址。

网络接口

LVS 负载均衡器通常需要至少两个网络接口:一个用于连接外部网络(接收客户端请求),另一个用于连接内部网络(与真实服务器通信)。

2.3 LVS 工作流程

LVS 的基本工作流程如下:

客户端向虚拟 IP 地址(VIP)发送请求。

负载均衡器(Director)接收到请求。

Director 根据配置的调度算法选择一台真实服务器(Real Server)。

Director 将请求转发给选中的真实服务器。

真实服务器处理请求并生成响应。

响应数据返回给 Director(根据工作模式的不同,可能直接返回给客户端)。

Director 将响应返回给客户端(或由真实服务器直接返回)。

这个过程对客户端是透明的,客户端感觉就像在与一台服务器通信,而实际上请求是由集群中的多台服务器共同处理的。

三、LVS 工作模式

LVS 支持多种工作模式,每种模式都有其独特的工作原理、优势和适用场景。根据数据包转发方式的不同,主要分为以下三种基本模式:NAT 模式、DR 模式和 TUN 模式。此外,还有一种扩展模式 FULLNAT。

3.1 NAT 模式(Network Address Translation)

3.1.1 NAT 模式工作原理

NAT 模式(Network Address Translation,网络地址转换)是 LVS 最基础的工作模式。在这种模式下,客户端请求发送到 LVS,LVS 修改请求报文的目标 IP 地址为后端服务器的 IP 地址,然后将请求转发到后端服务器。后端服务器处理完请求后,将响应报文发送回 LVS,LVS 再将响应报文的源 IP 地址修改为 LVS 的 IP 地址,最后返回给客户端。

具体工作流程如下:

客户端发送请求数据包,源地址是 CIP(客户端 IP),目标地址是 VIP(虚拟 IP)。

数据包到达 LVS 后,LVS 将目的地址改为真实服务器的 RIP,并将数据包转发给真实服务器。

真实服务器处理请求后,将响应数据包发送回 LVS,源地址是 RIP,目的地址是 VIP。

LVS 将源地址改为 VIP,然后将响应数据包发送给客户端。

NAT 模式工作流程图:

客户端(CIP:192.168.45.10)
   ↓
[请求报文: 源IP:192.168.45.10, 目标IP:192.168.66.10]
   ↓
LVS负载调度器(VIP:192.168.66.10)
   ↓
[DNAT转换: 目标IP改为192.168.88.11]
   ↓
[请求报文: 源IP:192.168.45.10, 目标IP:192.168.88.11]
   ↓
真实服务器(RIP:192.168.88.11)
   ↓处理请求...
   ↓
[响应报文: 源IP:192.168.88.11, 目标IP:192.168.45.10]
   ↓
LVS负载调度器
   ↓
[SNAT转换: 源IP改为192.168.66.10]
   ↓
[响应报文: 源IP:192.168.66.10, 目标IP:192.168.45.10]
   ↓
客户端

3.1.2 NAT 模式特点与适用场景

NAT 模式具有以下特点:

优点

实现简单,配置方便。

后端服务器无需进行特殊配置,只需要处理来自 LVS 的请求即可。

集群中的物理服务器可以使用任何支持 TCP/IP 的操作系统。

仅负载均衡器需要一个合法的公网 IP 地址,后端服务器可以使用私有 IP 地址。

缺点

所有流量必须经过 LVS,LVS 可能成为性能瓶颈。

扩展性有限,当服务器节点过多时,大量的数据包都交汇在 LVS 上,处理速度会变慢。

LVS 需要处理所有的请求和响应数据包,增加了 CPU 和内存的负担。

适用场景

当服务器节点数量不多(建议不超过 20 台)时,可以考虑使用 NAT 模式。

对配置复杂度要求较低,且对性能要求不是特别高的中小型应用场景。

当后端服务器需要共享一个公网 IP 地址时。

3.2 DR 模式(Direct Routing)

3.2.1 DR 模式工作原理

DR 模式(Direct Routing,直接路由模式)是 LVS 中性能最高的工作模式。在这种模式下,客户端请求发送到 LVS,LVS 修改请求报文的目标 MAC 地址为后端服务器的 MAC 地址,而不修改 IP 地址。后端服务器接收到请求后直接响应客户端,绕过 LVS,从而减少 LVS 的负载。

具体工作流程如下:

客户端发送请求数据包,源地址是 CIP,目标地址是 VIP。

数据包到达 LVS 后,LVS 将目的 MAC 地址改为真实服务器的 MAC 地址,然后将数据包转发出去。

真实服务器接收到数据包后,检查目的 IP 地址是否是自己的 IP 地址(或绑定的 VIP),如果是,则处理请求。

真实服务器直接将响应数据包发送给客户端,源地址是 VIP,目的地址是 CIP。

DR模式工作流程图:

客户端(CIP:192.168.45.10)
   ↓
[请求报文: 源IP:192.168.45.10, 目标IP:192.168.50.10]
   ↓
LVS负载调度器(VIP:192.168.50.10)
   ↓
[修改MAC地址: 目标MAC改为192.168.88.11的MAC地址]
   ↓
[请求报文: 源IP:192.168.45.10, 目标IP:192.168.50.10]
   ↓通过局域网
真实服务器(RIP:192.168.88.11, VIP配置在lo接口)
   ↓处理请求...
   ↓
[响应报文: 源IP:192.168.50.10, 目标IP:192.168.45.10]
   ↓直接发送给客户端
客户端

3.2.2 DR 模式特点与适用场景

DR 模式具有以下特点:

优点

后端服务器直接响应客户端,减少了 LVS 的负载,提高了系统的处理能力。

响应速度快,性能高,适用于高并发场景。

LVS 只负责分发请求,不处理响应数据包,大大减轻了 LVS 的负担。

缺点

后端服务器需要配置虚拟 IP 地址,网络配置较为复杂。

LVS 和真实服务器必须位于同一个物理网络段(同一广播域),通常需要连接到同一台交换机。

后端服务器不能响应针对 VIP 的 ARP 请求,需要进行特殊配置(如设置 ARP 抑制)。

适用场景

当负载均衡器和真实服务器在同一个广播域(同一台交换机上)时,可以考虑使用 DR 模式。

对性能要求极高的大型网站或应用,如电商平台、门户网站等。

需要处理大量并发请求的场景。

3.3 TUN 模式(Tunneling)

3.3.1 TUN 模式工作原理

TUN 模式(Tunneling,隧道模式)使用 IP 隧道技术,将请求封装在 IP 包中发送给真实服务器,真实服务器解封装后处理请求并直接响应客户端。这种模式允许真实服务器位于不同的网络中,增加了部署的灵活性。

具体工作流程如下:

客户端发送请求数据包,源地址是 CIP,目标地址是 VIP。

数据包到达 LVS 后,LVS 将数据包封装在一个新的 IP 包中,目标地址为真实服务器的 RIP,然后通过隧道发送给真实服务器。

真实服务器接收到封装的数据包后,解封装得到原始数据包,检查目的 IP 地址是否是自己的 IP 地址(或绑定的 VIP),如果是,则处理请求。

真实服务器直接将响应数据包发送给客户端,源地址是 VIP,目的地址是 CIP。

3.3.2 TUN 模式特点与适用场景

TUN 模式具有以下特点:

优点

真实服务器可以位于不同的网络中,甚至可以跨互联网分布,部署灵活性高。

LVS 只负责分发请求,真实服务器直接响应客户端,减轻了 LVS 的负载。

可以处理非常大的请求量,适用于大规模分布式系统。

缺点

需要额外的隧道封装和解封装操作,增加了系统的复杂性和处理延迟。

真实服务器需要支持 IP 隧道协议(IPTUNNEL),通常只在 Linux 系统上容易实现。

真实服务器必须有合法的公网 IP 地址,或者能够通过其他方式与客户端通信。

适用场景

当服务器分布在不同地域,且需要处理大量请求时,可以考虑使用 TUN 模式。

大型分布式系统,需要将请求分发到多个数据中心的场景。

需要实现全球负载均衡的跨国应用。

3.4 FULLNAT 模式(扩展模式)

FULLNAT 模式是淘宝开发的一种增强版本的 NAT 模式,它解决了传统 NAT 模式和其他模式的一些局限性。

3.4.1 FULLNAT 模式工作原理

在 FULLNAT 模式下,LVS 在入站时将目标 IP 更改为真实服务器的 IP,源 IP 更改为内网的本地 IP(一组内网 IP);出站时,将目标 IP 更改为客户端的 IP,源 IP 更换为 VIP。

具体工作流程如下:

客户端发送请求数据包,源地址是 CIP,目标地址是 VIP。

数据包到达 LVS 后,LVS 将源 IP 和目标 IP 都进行转换:源 IP 转换为 LVS 的一个内网 IP,目标 IP 转换为真实服务器的 RIP。

真实服务器处理请求后,将响应数据包发送回 LVS,源地址是 RIP,目的地址是 LVS 的内网 IP。

LVS 将响应数据包的源 IP 转换为 VIP,目标 IP 转换为 CIP,然后发送给客户端。

3.4.2 FULLNAT 模式特点与适用场景

FULLNAT 模式具有以下特点:

优点

支持跨网段部署,真实服务器可以位于不同的网络中,无需特殊配置。

解决了传统 NAT 模式中 LVS 必须位于客户端和真实服务器之间的限制。

后端服务器不需要配置虚拟 IP 地址,简化了配置过程。

缺点

所有数据包(包括请求和响应)都需要经过 LVS 处理,可能成为性能瓶颈。

增加了 NAT 转换的开销,可能影响系统性能。

适用场景

当真实服务器分布在不同网段,且无法配置在同一广播域时。

需要简化配置,同时又希望利用 LVS 的负载均衡功能的场景。

对性能要求不是特别高,但对部署灵活性要求较高的应用场景。

3.5 四种工作模式的比较

下表对 LVS 的四种工作模式进行了比较:

工作模式

数据包转发方式

优点

缺点

适用场景

NAT

修改 IP 地址

配置简单,后端服务器无需特殊配置

LVS 可能成为性能瓶颈,扩展性有限

中小型应用,服务器数量较少

DR

修改 MAC 地址

性能高,LVS 负载轻

配置复杂,必须同一广播域

大规模高并发应用

TUN

IP 隧道封装

部署灵活,可跨网络

配置复杂,需支持 IP 隧道

分布式系统,跨地域部署

FULLNAT

完全 NAT 转换

部署灵活,支持跨网段

LVS 处理所有流量,可能性能瓶颈

灵活部署需求,跨网段场景

  NAT模式 DR模式 TUN模式
RS操作系统 不限 禁用arp 支持隧道
调度器和服务器网络 可跨网络 不可跨网络 可跨网络
调度服务器数量服务器数量
RS服务器网关 指向到调度器DIP 指向到路由 指向到路由

 

四、LVS 调度算法

LVS 支持多种调度算法,这些算法决定了客户端请求如何分配给后端的真实服务器。根据算法的特性,可以分为静态调度算法和动态调度算法两大类。

4.1 静态调度算法

静态调度算法不考虑服务器当前的负载状态,而是根据固定的规则分配请求。这类算法实现简单,适用于服务器性能相近的场景。

4.1.1 轮询调度(Round Robin, RR)

算法原理:轮询调度算法按依次循环的方式将请求调度到不同的服务器上,即每个请求被顺序分配给下一个服务器。该算法最大的特点是实现简单。

计算公式:无,按顺序分配。

适用场景:当所有服务器处理请求的能力相同时,轮询算法可以将请求平均分配给每个真实服务器,实现负载均衡。

流程示例:

服务器池:RS1(192.168.88.11), RS2(192.168.88.12), RS3(192.168.88.13)
请求序列:R1, R2, R3, R4, R5, R6...
分配结果:
R1 → RS1
R2 → RS2
R3 → RS3
R4 → RS1(完成一轮循环)
R5 → RS2
R6 → RS3

4.1.2 加权轮询调度(Weighted Round Robin, WRR)

算法原理:加权轮询算法是对轮询算法的优化与补充,LVS 会考虑每台服务器的性能,并给每台服务器添加一个权值。权值越高的服务器,处理的请求越多。例如,如果服务器 A 的权值为 1,服务器 B 的权值为 2,则调度器调度到服务器 B 的请求会是服务器 A 的两倍。

计算公式:按权重比例依次分配请求。

适用场景:当后端服务器性能不一致时,使用加权轮询算法可以根据服务器的处理能力分配请求,性能高的服务器处理更多的请求。

流程示例:

服务器池:RS1(权重2), RS2(权重1), RS3(权重3)
请求序列:R1-R6
分配逻辑:按[RS1, RS1, RS2, RS3, RS3, RS3]循环
分配结果:
R1 → RS1
R2 → RS1
R3 → RS2
R4 → RS3
R5 → RS3
R6 → RS3
R7 → RS1(进入下一轮循环)

4.1.3 目标地址散列调度(Destination Hashing, DH)

算法原理:目标地址散列调度算法根据请求的目标 IP 地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。若该服务器是可用的且未超载,将请求发送到该服务器;否则返回空。

计算公式:通过散列函数计算目标 IP 对应的服务器。

适用场景:该算法适用于目标 IP 地址变化的场景,如 Cache 集群系统,可以提高缓存命中率。

流程示例:

服务器池:RS1, RS2, RS3
哈希映射规则:H(ip) = (ip整数表示) mod 3
客户端请求目标IP:
- 10.0.0.1 → H=1 → RS2
- 10.0.0.2 → H=2 → RS3
- 10.0.0.3 → H=0 → RS1
- 10.0.0.1 → 再次请求 → 仍分配至RS2

4.1.4 源地址散列调度(Source Hashing, SH)

算法原理:源地址散列调度算法根据请求的源 IP 地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。若该服务器是可用的且未超载,将请求发送到该服务器;否则返回空。

计算公式:通过散列函数计算源 IP 对应的服务器。

适用场景:该算法可以保证来自同一客户端的请求始终被分配到同一台服务器,适用于需要会话保持的应用场景,如数据库连接池、用户会话管理等。

流程示例:

服务器池:RS1, RS2, RS3
客户端IP与分配关系:
- 192.168.1.100 → H=0 → RS1(所有请求均到RS1)
- 192.168.1.101 → H=1 → RS2(所有请求均到RS2)
- 192.168.1.102 → H=2 → RS3(所有请求均到RS3)

4.2 动态调度算法

动态调度算法考虑服务器当前的负载状态,根据服务器的实时负载情况分配请求,适用于服务器性能不同或负载变化较大的场景。

4.2.1 最小连接调度(Least Connections, LC)

算法原理:最小连接调度算法把新的连接请求分配到当前连接数最小的服务器。这是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加 1;当连接中断或者超时,其连接数减 1。

计算公式:选择当前连接数最少的服务器。

适用场景:当集群系统的真实服务器具有相近的系统性能时,采用最小连接调度算法可以比较好地均衡负载。

流程示例:

初始状态:RS1(3连接), RS2(5连接), RS3(2连接)
新请求R1 → 选择RS3(连接数最少)
状态更新:RS1(3), RS2(5), RS3(3)
新请求R2 → 选择RS1或RS3(均为3连接)
状态更新:RS1(4), RS2(5), RS3(3)
新请求R3 → 选择RS3

4.2.2 加权最小连接调度(Weighted Least Connections, WLC)

算法原理:加权最小连接算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为 1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

计算公式:选择 (当前连接数 / 权重) 最小的服务器。

适用场景:当后端服务器性能差异较大时,加权最小连接算法可以根据服务器的处理能力分配请求,性能高的服务器处理更多的请求。

流程示例:

服务器状态:
RS1:连接数=6,权重=3 → L=6/3=2
RS2:连接数=4,权重=2 → L=4/2=2
RS3:连接数=3,权重=3 → L=3/3=1
新请求分配:选择RS3(L值最小)

4.2.3 最短的期望的延迟(Shortest Expected Delay, SED)

算法原理:最短的期望的延迟算法基于 WLC 算法。它在调度新连接时,会计算每个服务器的预计处理时间,选择预计处理时间最短的服务器。计算公式为:(当前连接数 + 1) / 权重。

计算公式:选择 (当前连接数 + 1) / 权重 最小的服务器。

适用场景:该算法比 WLC 更加保守,适用于服务器处理时间差异较大的场景,可以避免将请求分配给负载过重的服务器。

流程示例:

服务器状态:
RS1:连接数=5,权重=2 → L=(5+1)/2=3
RS2:连接数=3,权重=1 → L=(3+1)/1=4
RS3:连接数=4,权重=3 → L=(4+1)/3≈1.67
新请求分配:选择RS3(期望延迟最低)

4.2.4 最少队列调度(Never Queue, NQ)

算法原理:最少队列调度算法无需队列。如果有真实服务器的连接数等于 0,就直接将请求分配过去,不需要进行 SED 运算。这可以避免在服务器刚启动时,由于连接数为 0 而被分配过多请求。

计算公式:优先选择连接数为 0 的服务器,否则使用 SED 算法。

适用场景:该算法适用于服务器启动阶段或负载变化较大的场景,可以避免新启动的服务器立即承受大量负载。

流程示例:

场景1:存在空闲服务器
RS1(0连接), RS2(5连接), RS3(3连接)
新请求 → 直接分配给RS1

场景2:无空闲服务器
RS1(2连接), RS2(3连接), RS3(1连接)
执行SED计算 → 选择最优服务器

4.2.5 基于局部的最少连接(Locality-Based Least Connections, LBLC)

算法原理:基于局部的最少连接调度算法是针对请求报文的目标 IP 地址的负载均衡调度,主要用于 Cache 集群系统。算法的设计目标是在服务器的负载基本平衡的情况下,将相同目标 IP 地址的请求调度到同一台服务器,提高每台服务器的访问局部性和 Cache 命中率。

计算公式:首先查找目标 IP 对应的最近使用的服务器,若可用且未超载,则分配;否则使用最小连接算法选择服务器。

适用场景:主要用于 Cache 集群系统,如 Web 缓存、DNS 缓存等需要提高缓存命中率的场景。

流程示例:

映射表初始状态:空
请求1(目标IP=10.0.0.1)→ 无映射 → 分配至RS1(连接数最少)
映射表更新:10.0.0.1 → RS1

请求2(目标IP=10.0.0.1)→ 有映射且RS1未超载 → 分配至RS1

请求3(目标IP=10.0.0.1)→ RS1已超载 → 重新选择RS2(当前连接数最少)
映射表更新:10.0.0.1 → RS2

4.2.6 带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication, LBLCR)

算法原理:带复制的基于局部性的最少连接算法也是针对目标 IP 地址的负载均衡,主要用于 Cache 集群系统。它维护从一个目标 IP 地址到一组服务器的映射。按 “最小连接” 原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按 “最小连接” 原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

计算公式:维护目标 IP 到服务器组的映射,使用最小连接算法选择服务器。

适用场景:同样适用于 Cache 集群系统,但比 LBLC 更灵活,能够处理更复杂的负载情况。

流程示例:

初始状态:10.0.0.1的服务器组={RS1}
请求1 → 分配至RS1
RS1超载后:
请求2 → 从全局选择RS2加入组 → 分配至RS2
服务器组更新:{RS1, RS2}

请求3 → 组内选择RS2(负载较低)
长期无请求后:
清理机制触发 → 移除组内负载高的RS1

4.3 调度算法选择指南

选择合适的调度算法对于 LVS 集群的性能至关重要。以下是一些选择调度算法的建议:

服务器性能相同:如果所有服务器的硬件配置和处理能力相同,可以选择轮询(RR)或最小连接(LC)算法。

服务器性能不同:如果服务器性能差异较大,应选择加权轮询(WRR)或加权最小连接(WLC)算法,根据服务器的性能设置相应的权重。

会话保持需求:如果应用需要保持会话(如用户登录状态),可以选择源地址散列(SH)算法,确保来自同一客户端的请求始终被分配到同一台服务器。

缓存系统:对于缓存系统,如 Web 缓存或 DNS 缓存,可以选择目标地址散列(DH)或基于局部的最少连接(LBLC)算法,提高缓存命中率。

动态负载变化:对于负载变化较大的应用,应选择动态调度算法,如最小连接(LC)、加权最小连接(WLC)、最短的期望的延迟(SED)或最少队列调度(NQ),这些算法能够根据服务器的实时负载情况分配请求。

服务器处理时间差异大:如果服务器处理单个请求的时间差异较大,应选择最短的期望的延迟(SED)算法,避免将请求分配给处理时间过长的服务器。

五、lvs部署命令介绍

5.1 LVS 软件相关信息

  • 程序包:ipvsadm

  • Unit File:ipvsadm.service

  • 主程序:/usr/sbin/ipvsadm

  • 规则保存工具:/usr/sbin/ipvsadm-save

  • 规则重载工具:/usr/sbin/ipvsadm-restore

  • 配置文件:/etc/sysconfig/ipvsadm-config

  • IPVS 调度规则文件:/etc/sysconfig/ipvsadm

5.2 ipvsadm 命令详解

核心功能

  1. 集群服务管理:创建、删除、修改虚拟服务
  2. Real Server 管理:添加、移除、调整后端真实服务器
  3. 规则管理:保存、重载、清空 LVS 配置规则
  4. 状态监控:查看集群连接状态、流量统计、计数器信息

    5.3 LVS 集群中的增删改操作

    5.3.1 管理集群服务中的增删改

    核心参数

    • -A:添加新的虚拟服务
    • -E:编辑已存在的虚拟服务
    • -D:删除指定虚拟服务
    • -t:指定 TCP 协议(格式:IP: 端口)
    • -u:指定 UDP 协议(格式:IP: 端口)
    • -f:指定防火墙标记(整数,用于关联 iptables 规则)
    • -s:指定调度算法(rr/wrr/lc/wlc/sh/dh/sed/nq 等)
    • -p:设置持久连接超时(单位:秒,默认 0 表示关闭)
    • -C:清空所有虚拟服务配置
    • -S:保存规则到标准输出(配合重定向保存到文件)
    • -R:从标准输入重载规则(配合重定向读取文件)

    [root@Lvs ~]# dnf install ipvsadm

    [root@Lvs ~]# watch -n1 ipvsadm -Ln                 #周期为1s的IPVS 配置和负载均衡规则监控

    [root@localhost ~]# ipvsadm -A -t 192.168.232.100:80 -s rr                                    #添加服务

    [root@localhost ~]# ipvsadm -E -t 192.168.232.100:80 -s wrr                                 #修改服务

    [root@localhost ~]# ipvsadm -E -t 192.168.232.100:80 -s wrr -p 360       #设置持久连接超时
    [root@localhost ~]# ipvsadm -A -f 11 -s rr                                                        #设置火墙标记

    [root@localhost ~]# ipvsadm -D -f 11                                                               #删除指定指则

     

    [root@localhost ~]# ipvsadm -C                                                                              #全部删除

    #------------------------------------------------------------------------------------------------------------------------------#

    #------------------------------------------------------------------------------------------------------------------------------#

    #------------------------------------------------------------------------------------------------------------------------------#

    5.3.1 管理集群中RealServer的曾增删改

    核心参数:

    • -a:向虚拟服务添加真实服务器​
    • -e:编辑已存在的真实服务器配置​
    • -t:指定 TCP 协议(格式:IP: 端口)
    • -u:指定 UDP 协议(格式:IP: 端口)
    • -d:从虚拟服务移除真实服务器​
    • -r:指定真实服务器地址(格式:IP [: 端口],端口默认与虚拟服务一致)​
    • -g:使用 DR 模式(直接路由,默认模式)​
    • -i:使用 TUN 模式(IP 隧道)​
    • -m:使用 NAT 模式(网络地址转换)​
    • -w:设置权重(整数,0 表示暂停服务,默认 1)
    • -C:清空lvs策略
    • -L:查看lvs策略

    [root@localhost ~]# ipvsadm -a -t 192.168.232.100:80 -r 172.168.232.101:80 -m
    [root@localhost ~]# ipvsadm -a -t 192.168.232.100:80 -r 172.168.232.102:80 -g

    [root@localhost ~]# ipvsadm -e -t 192.168.232.100:80 -r 172.168.232.101:80 -i

    [root@localhost ~]# ipvsadm -e -t 192.168.232.100:80 -r 172.168.232.101:80 -i -w 2
    [root@localhost ~]# ipvsadm -e -t 192.168.232.100:80 -r 172.168.232.102:80 -g -w 4

    #------------------------------------------------------------------------------------------------------------------------------#

    #------------------------------------------------------------------------------------------------------------------------------#

     

    六、LVS实战案例

    6.1 部署NAT模式集群案例

    6.1.1 实验环境

    主机名 IP VIP 角色
    lvs(NAT,仅主机) 192.168.232.102 172.168.232.102 调度器(VS)
    rs1(仅主机) 192.168.232.103,GW192.168.232.102 NULL 真实服务器(RS)
    rs2(仅主机) 192.168.232.104,GW192.168.232.102 NULL 真实服务器(RS)
    client(NAT) 172.168.232.101   测试机

     

    6.1.2 配置命令

    1.在RS1、RS2上部署Apache,修改网关

    [root@rs1 ~]# dnf install httpd

    [root@rs1 ~]# echo RS1 - 192.168.232.103 > /var/www/html/index.html

    [root@rs1 ~]# ip route add default via 192.168.232.102 dev eth0
    [root@rs2 ~]# dnf install httpd

    [root@rs2 ~]# echo RS2 - 192.168.232.104 > /var/www/html/index.html

    [root@rs2 ~]# ip route add default via 192.168.232.102 dev eth0

    2.在LVS上启用内核路由功能

    [root@lvs ~]#  echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf

    3.安装ipvsadm

    [root@lvs ~]#dnf install ipvsadm -y

    4.添加调度策略

    [root@lvs ~]# ipvsadm -A -t 172.168.232.102:80 -s rr
    [root@lvs ~]# ipvsadm -a -t 172.168.232.102:80 -r 192.168.232.103:80 -m
    [root@lvs ~]# ipvsadm -a -t 172.168.232.102:80 -r 192.168.232.104:80 -m

    [root@lvs ~]# ipvsadm -Ln

    [root@lvs ~]# systemctl stop firewall --now

    5.测试

    [root@client ~]# for N in {1..10};do curl 172.168.232.102;done

     

    6.2 部署DR模式集群案例

    6.2.1 实验环境

    主机名 IP VIP 角色
    client 172.168.232.101 vmware NAT NULL 测试主机
    router NAT-eth0:172.168.232.102,仅主机 eth1:192.168.232.102 NULL 路由器
    lvs 192.168.232.105,GW 192.168.232.102 仅主机 lo:192.168.232.100 调度器
    RS1 192.168.232.103,GW 192.168.232.102 仅主机 lo:192.168.232.100 web服务器1
    RS2 192.168.232.104,GW 192.168.232.102 仅主机 lo:192.168.232.100 web服务器2

     

    6.2.2 配置命令

    1.在RS1、RS2上部署Apache,修改网关

    [root@rs1 ~]# dnf install httpd

    [root@rs1 ~]# echo RS1 - 192.168.232.103 > /var/www/html/index.html

    [root@rs1 ~]# ip route add default via 192.168.232.102 dev eth0

    [root@rs1 system-connections]# cat /etc/NetworkManager/system-connections/lo.nmconnection
    [connection]
    id=lo
    type=loopback
    interface-name=lo

    [ipv4]
    method=manual
    address1=127.0.0.1/8
    address2=192.168.232.100/32
     

    [root@rs2 ~]# dnf install httpd

    [root@rs2 ~]# echo RS2 - 192.168.232.104 > /var/www/html/index.html

    [root@rs2 ~]# ip route add default via 192.168.232.102 dev eth0

    [root@rs2 ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
    [connection]
    id=lo
    type=loopback
    interface-name=lo

    [ipv4]
    method=manual
    address1=127.0.0.1/8
    address2=192.168.232.100/32

    2.解决VIP相应问题

    [root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    [root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    [root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    [root@rs1 ~]#  echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
     

    [root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    [root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    [root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    [root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

    3.在LVS上启用内核路由功能

    [root@lvs ~]#  echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf

    [root@lvs ~]# systemctl enable --now firewalld.service

    [root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
    [connection]
    id=eth0
    type=ethernet
    interface-name=eth0

    [ipv4]
    method=manual
    address1=192.168.232.105/24,192.168.232.102
    address2=192.168.232.100/24
    dns=8.8.8.8

    4.添加调度策略

    [root@lvs ~]#dnf install ipvsadm -y

    [root@lvs ~]# ipvsadm -C

    [root@lvs ~]# ipvsadm -A -t 192.168.232.100:80 -s rr
    [root@lvs ~]# ipvsadm -a -t 192.168.232.100:80 -r 192.168.232.103:80 -g
    [root@lvs ~]# ipvsadm -a -t 192.168.232.100:80 -r 192.168.232.104:80 -g

    5.测试

    [root@client ~]# for N in {1..20};do curl 192.168.232.100;done

    6.3 防火墙标签解决轮询错误

    6.3.1 轮询规则中可能会遇到的错误

    以http和https为例,在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题 第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上

    错误情景

    1.在RS1和RS2中安装mod_ssl并重启apache

    [root@rs1 ~]# dnf install mod_ssl -y

    [root@rs1 ~]# systemctl restart httpd
    [root@rs2 ~]# dnf install mod_ssl -y

    [root@rs2 ~]# systemctl restart httpd

    2.在LVS上制定策略

    [root@lvs ~]# ipvsadm -A -t 192.168.232.100:80 -s rr
    [root@lvs ~]# ipvsadm -a -t 192.168.232.100:80 -r 192.168.232.103:80 -g
    [root@lvs ~]# ipvsadm -a -t 192.168.232.100:80 -r 192.168.232.104:80 -g

    [root@lvs ~]# ipvsadm -A -t 192.168.232.100:443 -s rr
    [root@lvs ~]# ipvsadm -a -t 192.168.232.100:443 -r 192.168.232.103:80 -g
    [root@lvs ~]# ipvsadm -a -t 192.168.232.100:443 -r 192.168.232.104:80 -g

    3.问题测试

    [root@client ~]# curl  http://192.168.232.100;curl -k https://192.168.232.100

    6.3.2 防火墙标记解决轮询调度问题

    1.在LVS调度器中设定端口标签,标定80和443是一个整体

    [root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 123

    2.基于标记定义集群服务

    [root@LVS ~]#  ipvsadm -A -f 123 -s rr
    [root@LVS ~]#  ipvsadm  -a -f 123 -r 192.168.232.103 -g
    [root@LVS ~]#  ipvsadm  -a -f 123 -r 192.168.232.104 -g

    3.测试结果

    [root@client ~]# curl  http://192.168.232.100;curl -k https://192.168.232.100

     

     

     

     

     


    网站公告

    今日签到

    点亮在社区的每一天
    去签到