Linux中的LVS集群技术

发布于:2025-07-19 ⋅ 阅读:(10) ⋅ 点赞:(0)

一、实验环境(RHEL 9)

1、NAT模式的实验环境

主机名 IP地址 网关 网络适配器 功能 角色
client 172.25.254.111/24(NAT模式的接口) 172.25.254.2 NAT模式 客户机
lvs

172.25.254.100/24(NAT模式的接口)

192.168.0.100/24(仅主机模式的接口)

172.25.254.2

192.168.0.2

NAT模式

仅主机模式

开启内核路由功能:

echo net.ipv4.ip_forward = 1 > /etc/sysctl.conf

负载均衡器
RS1 192.168.0.10/24(仅主机模式的接口) 192.168.0.100 仅主机模式 后端服务器1
RS2 192.168.0.20/24(仅主机模式的接口) 192.168.0.100 仅主机模式 后端服务器2

在RS1和RS2中下载http,并且在默认发布目录文件中写入对应的内容,例如RS1写入RS1 - 192.168.0.10,RS2写入RS2 - 192.168.0.20。

[root@RS1 桌面]# dnf install httpd -y
[root@RS1 桌面]# systemctl disable --now firewalld.service 
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@RS1 桌面]# echo RS1 - 192.168.0.10 > /var/www/html/index.html
[root@RS1 桌面]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 桌面]# dnf install httpd -y
[root@RS2 桌面]# systemctl disable --now firewalld.service 
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@RS2 桌面]# echo RS2 - 192.168.0.20 > /var/www/html/index.html
[root@RS2 桌面]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

确保lvs可以通过curl访问RS1和RS2。

2、DR模式的实验环境

主机名 IP地址 网关 网络适配器 功能 角色
client 172.25.254.111/24(NAT模式的接口) 172.25.254.100 NAT模式 客户机
router

172.25.254.100/24(NAT模式的接口)

192.168.0.100/24(仅主机模式的接口)

不需要网关

NAT模式

仅主机模式

开启内核路由功能:

echo net.ipv4.ip_forward = 1 > /etc/sysctl.conf

路由器
DR-lvs

192.168.0.200/24和192.168.0.220/24(仅主机模式的接口)

127.0.0.1/8和192.168.0.220/32(回环接口)

192.168.0.100

仅主机模式

回环接口

负载均衡器
RS1

192.168.0.10/24(仅主机模式的接口)

127.0.0.1/8和192.168.0.220/32(回环接口)

192.168.0.100

仅主机模式

回环接口

后端服务器1
RS2

192.168.0.20/24(仅主机模式的接口)

127.0.0.1/8和192.168.0.220/32(回环接口)

192.168.0.100

仅主机模式

回环接口

后服务器2

配置回环接口IP地址的示例:

此回环接口IP地址的配置在DR-lvs、RS1、RS2上都要进行配置。

在DR-lvs上的额外配置:

需要在仅主机模式的这个接口上新添加一个192.168.0.220/24的IP地址

二、LVS集群的4种类型

LVS(Linux Virtual Server)是基于 Linux 内核的开源负载均衡解决方案,通过将多个服务器组成一个集群,实现高可用、高性能的服务。LVS 支持四种核心的集群类型(工作模式),它们在数据包转发方式、架构复杂度和适用场景上有显著区别:

1. NAT 模式(Virtual Server via Network Address Translation)

核心原理

LVS 负载均衡器作为流量的「双向网关」,通过修改数据包的 IP 地址实现转发,具体流程如下:

  • 客户端请求(入站)
    客户端向 LVS 的 VIP(虚拟 IP)发送请求,数据包源 IP 为客户端 IP,目标 IP 为 VIP。
    LVS 接收后,仅修改目标 IP(将 VIP 替换为后端 RS 的私有 IP),源 IP 保持不变(仍为客户端 IP),然后转发给选定的 RS。

  • RS 响应(出站)
    RS 处理请求后,生成响应包,目标 IP 为客户端 IP(因源 IP 未被修改),源 IP 为自身私有 IP。
    由于 RS 的默认网关指向 LVS,响应包会先回传给 LVS。
    LVS 接收后,修改源 IP(将 RS 的私有 IP 替换为 VIP),再将数据包转发给客户端。

架构特点

  • 流量路径:所有入站和出站流量必须经过 LVS,形成「客户端 → LVS → RS → LVS → 客户端」的闭环。

  • 网络要求:LVS 与 RS 必须在同一子网(因依赖 LVS 作为网关),RS 的网关必须手动指向 LVS 的 IP。

  • VIP 配置:仅 LVS 需配置 VIP,RS 无需绑定 VIP(隐藏在私有子网中)。

优缺点

  • 优点

    • 配置简单,RS 无需特殊设置(仅需指向 LVS 为网关)。

    • 支持任意 TCP/UDP 服务(如数据库、FTP 等),兼容性强。

    • 安全性高,RS 隐藏在私有网络,不直接暴露给客户端。

  • 缺点

    • LVS 是流量瓶颈(所有数据需经其转发),性能受限于 LVS 的带宽和处理能力。

    • 仅适用于小规模集群(通常 RS 数量 ≤ 20 台)。

适用场景

  • 小规模集群(如内部业务系统、低并发服务)。

  • 对安全性要求高(需隐藏 RS 真实 IP)。

  • 服务类型复杂(如需要双向交互的协议)。

2. DR 模式(Virtual Server via Direct Routing)

核心原理

LVS 仅处理入站请求,通过修改数据包的 MAC 地址 而非 IP 地址转发,出站流量由 RS 直接返回客户端,流程如下:

  • 客户端请求(入站)
    客户端向 VIP 发送请求,数据包源 IP 为客户端 IP,目标 IP 为 VIP,目标 MAC 地址为 LVS 的 MAC。
    LVS 接收后,不修改 IP 地址(源 IP 和目标 IP 保持不变),仅将目标 MAC 地址替换为选定 RS 的 MAC 地址,然后通过二层网络(交换机)转发给 RS。

  • RS 响应(出站)
    RS 已预先绑定 VIP(需配置在回环接口或禁用 ARP 响应,避免冲突),因此会接收目标 IP 为 VIP 的数据包。
    RS 处理后,直接以客户端 IP 为目标、VIP 为源 IP 发送响应包,通过自身网络接口直接返回给客户端,无需经过 LVS

架构特点

  • 流量分离:入站流量经 LVS,出站流量由 RS 直连客户端,LVS 负载极大降低。

  • VIP 配置:LVS 和所有 RS 必须绑定相同的 VIP(LVS 用于接收请求,RS 用于响应客户端)。

  • 网络要求:LVS 与 RS 必须在同一物理子网(二层可达),因依赖 MAC 地址转发。

  • ARP 抑制:RS 需配置内核参数(如 arp_ignore=1arp_announce=2),避免对 VIP 的 ARP 请求做出响应,防止客户端直接连接 RS。

优缺点

  • 优点

    • 性能极高(LVS 仅处理入站流量,无 IP 修改开销),支持大规模集群(RS 可达数百台)。

    • 出站流量不经过 LVS,避免瓶颈。

  • 缺点

    • 网络拓扑受限(必须同一子网),跨网段部署困难。

    • RS 配置较复杂(需绑定 VIP 并抑制 ARP)。

适用场景

  • 高并发 Web 服务(如 HTTP/HTTPS)。

  • 大规模集群(如电商平台、内容分发节点)。

  • 对响应速度要求极高的场景(如实时交互服务)。

3. TUN 模式(Virtual Server via IP Tunneling)

核心原理

通过 IP 隧道技术(如 IPIP、GRE)将客户端请求封装后转发给 RS,突破子网限制,流程如下:

  • 客户端请求(入站)
    客户端向 VIP 发送请求,LVS 接收后,将原始数据包(源 IP:客户端 IP,目标 IP:VIP)封装在新的 IP 隧道中:

    • 外层隧道的源 IP 为 LVS 的 IP,目标 IP 为 RS 的隧道 IP(RS 预先配置的公网或跨网段 IP)。
      LVS 将封装后的数据包发送给 RS。

  • RS 响应(出站)
    RS 解封装隧道包,获取原始请求(目标 IP 为 VIP),因自身已绑定 VIP,可直接处理请求。
    响应包以客户端 IP 为目标、VIP 为源 IP,通过自身网络直接返回客户端,无需经过 LVS

架构特点

  • 跨网络部署:LVS 与 RS 可位于不同子网、不同机房甚至跨公网(依赖隧道协议)。

  • 流量分离:入站流量经隧道转发,出站流量由 RS 直连客户端。

  • VIP 配置:LVS 和所有 RS 需绑定相同的 VIP(RS 绑定在隧道接口或回环接口)。

优缺点

  • 优点

    • 扩展性极强,支持跨地域集群(如多机房部署)。

    • 性能优于 NAT 模式(出站流量不经过 LVS)。

  • 缺点

    • 隧道封装增加网络开销(约 20-40 字节 / 包),对高频小数据包影响较明显。

    • 需配置隧道协议(如 IPIP、GRE),RS 配置较复杂。

适用场景

  • 跨地域分布式集群(如 CDN 节点、多区域云服务)。

  • 突破子网限制的大规模集群(如跨数据中心负载均衡)。

4. Full-NAT 模式(Virtual Server via Full Network Address Translation)

核心原理

LVS 同时修改数据包的 源 IP 和目标 IP,实现「双向地址转换」,流程如下:

  • 客户端请求(入站)
    客户端向 VIP 发送请求,源 IP 为客户端 IP,目标 IP 为 VIP。
    LVS 接收后,同时修改源 IP 和目标 IP

    • 源 IP:客户端 IP → LVS 的私有 IP(避免 RS 直接与客户端通信)。

    • 目标 IP:VIP → RS 的私有 IP。
      然后将修改后的数据包转发给 RS。

  • RS 响应(出站)
    RS 处理后,生成响应包,源 IP 为自身私有 IP,目标 IP 为 LVS 的私有 IP(因入站时源 IP 已被修改)。
    响应包回传给 LVS 后,LVS 将源 IP 替换为 VIP,目标 IP 替换为客户端 IP,再返回给客户端。

架构特点

  • 网络灵活性:LVS 与 RS 无需同一子网,RS 的网关无需指向 LVS(只需能与 LVS 通信即可)。

  • 双向流量经过 LVS:因源 IP 被修改,RS 无法直接响应客户端,必须经 LVS 转发。

  • 状态跟踪:LVS 需维护连接状态表(记录客户端 IP 与 RS 的映射),确保响应包正确转发。

优缺点

  • 优点

    • 网络部署灵活,支持复杂拓扑(如 LVS 在公网、RS 在内网不同子网)。

    • 可隐藏客户端真实 IP(RS 仅能看到 LVS 的私有 IP),安全性高于 DR/TUN 模式。

  • 缺点

    • LVS 处理所有双向流量,性能低于 DR/TUN 模式,易成为瓶颈。

    • 需内核支持 ip_vs_fullnat 模块(部分 Linux 发行版默认不启用)。

适用场景

  • 网络架构复杂(LVS 与 RS 跨子网、跨 VLAN)。

  • 需隐藏客户端 IP(如防止 RS 被直接攻击)。

  • 无法使用 DR/TUN 模式的场景(如 RS 无法绑定 VIP)。

四种模式核心差异对比表

维度 NAT 模式 DR 模式 TUN 模式 Full-NAT 模式
IP 修改 入站改目标 IP,出站改源 IP 不修改 IP,改 MAC 地址 不修改 IP,隧道封装 入站同时改源 IP 和目标 IP
流量路径 双向经 LVS 入站经 LVS,出站 RS 直连 入站经隧道,出站 RS 直连 双向经 LVS
网络范围 同一子网 同一物理子网(二层可达) 跨子网 / 跨地域(依赖隧道) 任意网络(可跨子网)
性能 低(瓶颈在 LVS) 极高(仅入站经 LVS) 中高(隧道有开销) 中(双向经 LVS)
RS 网关配置 必须指向 LVS 的内网 IP 无需指向 LVS(可独立设置网关) 无需指向 LVS(可独立设置网关) 无需指向 LVS(独立网关)
RS 配置复杂度 低(仅需设网关) 中(需抑制 ARP + 绑定 VIP) 高(需配置隧道 + 绑定 VIP) 低(无需绑定 VIP)
典型场景 小规模集群、数据库 Web 服务、大规模集群 跨地域集群、CDN 复杂网络架构、安全需求

三、LVS中的13种调度算法

LVS(Linux Virtual Server)提供了多种调度算法,用于决定如何将客户端请求分配给后端服务器(RS)。这些算法可分为静态调度(不考虑服务器负载)和动态调度(基于服务器实时负载)两类,共 13 种核心算法。以下是详细解析:

1、静态调度算法(不考虑服务器负载)

1. 轮询(Round Robin, rr)

  • 原理:按顺序依次将请求分配给 RS,循环往复。

  • 优点:实现简单,适用于各 RS 性能相近的场景。

  • 缺点:忽略服务器实际负载和处理能力差异,可能导致性能不均衡。

  • 示例:有三台RS:访问顺序为RS1 → RS2 → RS3 → RS1 → RS2 → RS3 → ...

2. 加权轮询(Weighted Round Robin, wrr)

  • 原理:根据 RS 的性能(如 CPU、内存、带宽)分配权重,权重高的服务器接收更多请求。

  • 公式:请求数分配比例 = 服务器权重 / 总权重。

  • 优点:优化资源利用率,适合硬件配置差异较大的集群。

  • 示例:根据权重,访问RS1三次后,访问RS2两次,最后再访问RS31次,然后就是重复以上访问顺序。RS1(3) → RS2(2) → RS3(1) → RS1(3) → RS2(2) → ...

3. 源地址哈希(Source Hashing, sh)

  • 原理:根据客户端 IP 地址计算哈希值,将同一 IP 的请求始终路由到固定 RS。

  • 公式:RS = Hash (Client_IP) % 服务器数量。

  • 优点:实现会话粘滞(Sticky Session),适合需保持会话状态的服务(如购物车)。

  • 缺点:可能导致负载分布不均(如大量请求来自同一 IP 段)。

4. 目标地址哈希(Destination Hashing, dh)

  • 原理:根据请求的目标 IP(如 VIP)或端口计算哈希值,固定路由到同一 RS。

  • 适用场景:内容分发网络(CDN)、反向代理缓存(如缓存服务器集群)。

  • 区别:与源地址哈希的方向相反,常用于服务器间负载均衡。

5. IP 链(IP Link, ipip)

  • 原理:基于 IP 地址的前缀匹配,将特定 IP 段的请求路由到指定 RS。

  • 配置:需手动指定 IP 段与 RS 的映射关系。

  • 示例

    plaintext

    192.168.1.0/24 → RS1  
    192.168.2.0/24 → RS2  
    

6. 通用哈希(Generic Hashing, gh)

  • 原理:允许用户自定义哈希函数,基于任意请求参数(如 URL、HTTP 头)进行调度。

  • 优点:灵活性高,适合特殊业务需求(如按 URL 路径分流)。

  • 实现:需通过内核模块或自定义代码扩展。

2、动态调度算法(基于服务器负载)

7. 最小连接(Least Connections, lc)

  • 原理:优先将请求分配给当前活跃连接数最少的 RS。

  • 公式:选择 Active_Connections / Weight 值最小的服务器。

  • 优点:自动平衡负载,适合长连接服务(如数据库、SSH)。

  • 缺点:对短连接服务(如 HTTP)效果有限。

8. 加权最小连接(Weighted Least Connections, wlc)

  • 原理:在最小连接基础上,考虑服务器权重(权重高的服务器可承受更多连接)。

  • 公式:选择 Active_Connections / Weight 值最小的服务器。

  • 示例:RS1 (权重 5) 当前 50 连接,RS2 (权重 1) 当前 10 连接,则优先分配给 RS2(50/5 > 10/1)。

9. 基于局部性的最小连接(Locality-Based Least Connections, lblc)

  • 原理:结合源地址哈希和最小连接算法:

    • 优先将同一 IP 的请求路由到上次处理的 RS(会话粘滞)。

    • 若该 RS 过载(连接数超过阈值),则分配给连接数最少的 RS。

  • 适用场景:缓存集群(如 Redis),减少缓存失效。

10. 带复制的基于局部性的最小连接(Locality-Based Least Connections with Replication, lblcr)

  • 原理:在 lblc 基础上,增加 “复制” 机制:

    • 当请求频繁访问某 RS 时,将该 RS 的内容复制到其他服务器(降低单点负载)。

  • 适用场景:内容分发网络(CDN),通过复制热点内容提升响应速度。

11. 目标地址哈希的最小连接(Destination Hashing with Least Connections, dh-lc)

  • 原理:结合目标地址哈希和最小连接算法:

    • 先按目标 IP 哈希选择候选 RS 列表。

    • 再从候选列表中选择连接数最少的 RS。

  • 适用场景:负载均衡器后端连接多个上游服务器(如反向代理)。

12. 最短预期延迟(Shortest Expected Delay, sed)

  • 原理:计算每个 RS 的预期处理延迟,选择延迟最小的服务器。

  • 公式:预期延迟 = (Active_Connections + 1) / Weight。

  • 特点:相比 wlc,更倾向于分配请求给轻载服务器(避免重载服务器持续过载)。

13. 最少队列调度(Never Queue, nq)

  • 原理:若有服务器处于空闲状态(连接数为 0),直接分配;否则使用 sed 算法。

  • 优点:避免请求排队,适合对响应时间敏感的服务。

3、内核 4.15 版本后的新增调度算法

1. 加权故障转移(Weighted Fail Over, FO)

原理:遍历虚拟服务关联的真实服务器(RS)链表,优先选择未过载权重最高的 RS 进行调度。当 RS 被标记为 “过载”(通过设置IP_VS_DEST_F_OVERLOAD标志)时,调度器会自动跳过该 RS,将请求转发至其他符合条件的 RS。

优点:

  • 支持通过 “过载标记” 主动剔除故障或负载过高的节点,提高集群稳定性。

  • 权重机制可优先调度性能更强的 RS(权重高的节点优先处理请求),资源利用率更合理。

  • 适合灰度发布场景:可通过调整权重或标记过载,逐步将流量切换到新节点。

缺点:

  • 依赖人工或外部监控系统标记 “过载” 状态,若标记不及时可能导致请求分配不合理。

  • 未考虑 RS 实时连接数等动态负载,仅通过权重和过载状态调度,可能在高负载时不够灵活。

适用场景:

  • 灰度发布、A/B 测试(通过权重控制流量比例)。

  • 需要手动干预节点状态的场景(如临时下线维护)。

  • 对节点故障敏感的服务(快速剔除异常节点)。

2. 溢出连接(Overflow-connection, OVF)

原理:基于 RS 的权重值当前活动连接数调度,优先选择权重最高的 RS,直到其活动连接数超过权重值(即 “溢出”),再依次调度下一个权重最高的 RS。判断条件为:

  • RS 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)。

  • 活动连接数 < 权重值(权重值不为 0)。

优点:

  • 自动根据 RS 的承载能力(权重)分配连接,避免单一节点负载过高(活动连接数不超过权重上限)。

  • 权重机制确保性能强的 RS(高权重)能处理更多连接,资源分配更均衡。

  • 无需复杂的负载计算,调度逻辑简单,性能开销低。

缺点:

  • 仅依赖活动连接数和权重,未考虑非活动连接等其他负载指标,对长连接场景的适应性有限。

  • 若所有高权重 RS 均 “溢出”,低权重 RS 可能因突然承接大量请求而压力骤增。

适用场景:

  • 短连接服务(如 Web 服务),活动连接数能较好反映负载状态。

  • 对调度效率要求高、节点性能差异明显的集群。

  • 需要限制单节点最大连接数的场景(通过权重控制上限)。

四、ipvsadm命令

ipvsadm的操作类型参数

用于指定要执行的操作(必选):

参数 全称 作用
-A --add-service 添加虚拟服务(VIP + 端口)。
-E --edit-service 修改已存在的虚拟服务配置。
-D --delete-service 删除虚拟服务。
-a --add-server 为虚拟服务添加后端服务器(Real Server)。
-e --edit-server 修改后端服务器配置。
-d --delete-server 删除后端服务器。
-L --list 显示当前 IPVS 配置(需配合 -t-u 或 -f 指定服务类型)。
-Z --zero 清空所有服务和服务器的统计信息(连接数、流量等)。
-S --save 导出当前 IPVS 配置为脚本(用于备份)。
-R --restore 从脚本恢复 IPVS 配置。

ipvsadm的服务类型参数

用于指定虚拟服务的协议类型(配合 -A-D-L 等使用):

参数 作用
-t TCP 服务,格式:-t IP:port(如 -t 192.168.1.1:80)。
-u UDP 服务,格式:-u IP:port(如 -u 192.168.1.1:53)。
-f 防火墙标记服务,用于基于 iptables 标记的负载均衡。

ipvsadm的负载均衡算法参数

通过 -s 指定调度算法(添加虚拟服务时使用):

参数值 全称 算法说明
rr Round Robin 轮询,按顺序依次分发请求。
wrr Weighted RR 加权轮询,根据服务器性能分配权重。
lc Least Connections 最少连接,优先将请求分发到连接数最少的服务器。
wlc Weighted LC 加权最少连接,默认算法,在最少连接基础上考虑权重。
sh Source Hashing 源 IP 哈希,相同 IP 的客户端总是被分发到同一服务器(适用于会话保持)。
dh Destination Hashing 目标 IP 哈希,根据目标 IP 进行哈希(适用于缓存集群)。
lblc Locality-Based LC 基于位置的最少连接,用于缓存集群。

ipvsadm的工作模式参数

通过 -m-g-i 指定后端服务器的工作模式(添加 Real Server 时使用):

参数 全称 模式说明
-m --masquerading NAT 模式,负载均衡器处理请求和响应,需与 RS 在同一网络。
-g --gatewaying DR 模式(直接路由),负载均衡器仅处理请求,响应直接由 RS 返回。
-i --ipip TUN 模式(IP 隧道),通过隧道连接负载均衡器和 RS,适合跨地域部署。

ipvsadm的其他常用参数

参数 作用
-n 以数字形式显示 IP 和端口(如 192.168.1.1:80 而非域名)。
-c 显示当前 IPVS 连接信息(配合 -L 使用)。
-p [秒数] 设置会话保持时间(如 -p 3600 表示 1 小时内同一客户端请求到同一 RS)。
-w [权重] 设置后端服务器的权重(如 -w 3 表示权重为 3,默认 1)。
--persistent-conn-timeout [秒数] 持久连接超时时间(如 -p 360)。
--scheduler [算法] 替代 -s 指定调度算法(如 --scheduler wrr)。

核心功能:

        1、集群服务管理:增、删、改。        对应下面的定义虚拟服务(Virtual Service)--- 即管理集群服务。

        2、集群服务的RS管理:增、删、改。        对应下面的添加 / 删除后端服务器(Real Server)--- 即管理集群服务中的Real Server服务器。

        3、查看配置

1、负载均衡配置

1. 定义虚拟服务(Virtual Service)

创建对外提供服务的虚拟 IP(VIP)和端口,并指定负载均衡算法:

# 添加 TCP 虚拟服务(VIP:192.168.1.100,端口:80,轮询算法)
ipvsadm -A -t 192.168.1.100:80 -s rr

# 添加 UDP 虚拟服务(如 DNS 负载均衡)
ipvsadm -A -u 192.168.1.100:53 -s wrr  # 加权轮询
2. 添加 / 删除后端服务器(Real Server)

将实际提供服务的服务器加入或移出负载均衡池:

# 添加后端服务器(-m: NAT 模式;-g: DR 模式;-i: TUN 模式)
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -m -w 1  # 权重为 1

# 删除后端服务器
ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.101:80

2、负载均衡算法及其适用场景

通过 -s 参数指定调度算法,支持多种策略:

算法 缩写 说明
轮询 rr 按顺序依次分发请求,适用于服务器性能相近的场景。
加权轮询 wrr 根据服务器性能分配权重(-w 参数),性能强者处理更多请求。
最少连接 lc 将请求分发到当前连接数最少的服务器,动态平衡负载。
加权最少连接 wlc 在最少连接基础上考虑服务器权重,默认算法。
源 IP 哈希 sh 相同 IP 的客户端总是被分发到同一服务器,适用于会话保持。
目标 IP 哈希 dh 根据目标 IP 进行哈希,适用于缓存服务器集群。

3、工作模式配置

通过 -m-g-i 参数指定工作模式:

模式 参数 说明
NAT -m 网络地址转换,负载均衡器处理请求和响应,需与 RS 在同一网络。
DR(直接路由) -g 负载均衡器仅处理请求,响应直接由 RS 返回给客户端,性能最优。
TUN(IP 隧道) -i 通过 IP 隧道连接负载均衡器和 RS,适合跨地域部署。

4、查看与管理

1. 显示当前配置
ipvsadm -L -n  # 查看所有虚拟服务和后端服务器(数字形式显示 IP:Port)
ipvsadm -L -n -c  # 查看当前连接和统计信息
ipvsadm -L -t 192.168.1.100:80  # 查看特定虚拟服务的配置
2. 清空统计信息
ipvsadm -Z  # 重置所有服务和服务器的连接计数器和流量统计
3. 持久化配置
ipvsadm-save > /etc/sysconfig/ipvsadm  # 保存当前配置到文件
ipvsadm-restore < /etc/sysconfig/ipvsadm  # 从文件恢复配置

5、高级功能

1. 会话保持(Persistence)

让同一客户端的请求始终被转发到同一服务器:

# 设置 3600 秒的会话保持时间
ipvsadm -A -t 192.168.1.100:80 -s rr -p 3600
2. 健康检查

结合外部监控工具(如 keepalived)自动检测服务器状态,失效时自动移除:

# 配置 keepalived 监控 RS 状态(示例片段)
real_server 192.168.1.101 80 {
    weight 1
    SSL_GET {
        url { path /healthcheck }
        url { path / }
        connect_timeout 3
        retry 3
        delay_before_retry 3
    }
}

五、部署NAT模式的LVS集群示例 

LVS NAT 模式

  • 工作层级第 3 层(网络层)

  • 原因
    NAT 模式中,负载均衡器需要对数据包的 源 IP 和目标 IP 进行修改(网络层操作)。

    • 客户端请求到达负载均衡器时,目标 IP 被修改为后端服务器的私有 IP;

    • 后端服务器响应时,源 IP 被修改为负载均衡器的公网 IP,再返回给客户端。
      整个过程仅涉及 IP 地址的转换,不处理端口(传输层)或应用层数据,因此工作在网络层。

注意:如果有类似下图的错误,可能是防火墙没有关闭,可以使用 systemctl disable --now firewalld.service 这条命令关闭防火墙后再试。

1、在lvs调度机中开启内核路由功能

2、在lvs调度机中安装ipvsadm

ipvsadm 是 Linux 系统中用于管理 IP 虚拟服务器(IP Virtual Server,IPVS) 的工具,它是 LVS(Linux Virtual Server)项目的核心组件。IPVS 是 Linux 内核的一部分,提供高性能的负载均衡功能,常用于构建大规模、高可用的服务器集群。

3、在lvs调度机中添加调度策略

4、查看添加的调度策略

[root@lvs 桌面]# watch -n1 ipvsadm -Ln  #可以使用这条命令监视调度策略的改动

字段 含义说明
RemoteAddress:Port 后端真实服务器(Real Server)的 IP 地址和端口号。
Forward LVS 采用的转发模式(调度算法的转发方式),常见值包括:
Route:DR 模式(直接路由)
Tunnel:TUN 模式(隧道)
Masq:NAT 模式(网络地址转换)
Weight 后端服务器的权重值(正数)。权重越高,分配到的请求越多;权重为 0 时,该服务器暂时不接收新请求。
ActiveConn 当前活跃连接数(正在处理的请求数)。
InActConn 当前非活跃连接数(已关闭或超时的连接数,用于统计历史连接)。

字段 含义
Pro 协议类型(如 TCPUDP)。
FromIP 客户端源 IP 地址。
FPrt 客户端源端口。
ToIP 目标 IP 地址(即虚拟服务 VIP)。
TPrt 目标端口(即虚拟服务端口)。
DestIP 实际转发到的后端服务器(Real Server)IP 地址。
DPrt 后端服务器端口。
State 连接状态,常见值包括:
ESTABLISHED:已建立的连接
SYN_SENT:已发送 SYN 包
SYN_RECV:已接收 SYN 包
FIN_WAIT:等待 FIN 包
CLOSE_WAIT:等待关闭
TIME_WAIT:等待超时关闭
Expires 连接超时剩余秒数(连接保持时间)。
PEName 持久化引擎名称(如 sh 表示源 IP 哈希),用于会话保持。
PEData 持久化引擎数据(如哈希值或会话 ID)。

5、测试:使用client主机循环访问lvs调度机六次之后,再查看调度策略中连接数的改变

6、保存调度策略

7、删除所有调度策略

8、重新加载调度策略

9、以上操作均为临时的重新加载调度策略的操作,如果想要让ipvsadm开机启动时自动加载策略

需要设置此服务开机自启动,而且需要/etc/sysconfig/ipvsadm 文件存在。

因为在大多数 Linux 发行版中,ipvsadm 服务的默认配置通常会加载 /etc/sysconfig/ipvsadm(或类似路径)中的规则。例如:

CentOS/RHEL 系统
ipvsadm 服务脚本默认读取 /etc/sysconfig/ipvsadm 文件:

# 服务脚本片段(通常位于 /usr/lib/systemd/system/ipvsadm.service)
ExecStart=/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm

Ubuntu/Debian 系统
可能使用不同的路径(如 /etc/ipvsadm.rules),需检查服务配置。

测试:

重启后发现调度策略仍然存在,说明设置成功

10、再次测试:修改为权重调用算法后,修改real server的权重,然后再次测试

因为我们上面的示例用的就是权重调用算法,所以可以不需要修改策略的算法,只需要修改real server的权重来进行测试。

修改权重后进行测试:

此结果说明权重调用算法和real server的权重修改成功。

六、部署DR模式的LVS集群示例

 LVS DR 模式

  • 工作层级第 2 层(数据链路层)

  • 原因
    DR 模式中,负载均衡器仅修改数据包的 目标 MAC 地址(数据链路层操作),不改变 IP 地址。

    • 客户端请求的目标 IP 始终是 VIP(负载均衡器和后端服务器共享的虚拟 IP);

    • 负载均衡器通过修改 MAC 地址,将数据包转发到选定的后端服务器;

    • 后端服务器直接使用 VIP 作为源 IP 响应客户端,无需经过负载均衡器。
      由于核心操作是 MAC 地址的替换,因此工作在数据链路层。

1、配置好网络环境,确保主机能互通(具体配置看第一大点的实验环境)

2、在router主机中的防火墙中启用 IP 伪装(Masquerading)功能,实现网络地址转换(NAT)。

3、DR模式中需要在LVS集群的各主机上均需要配置VIP,所以我们需要解决地址冲突。

在 LVS 的 DR 模式(Direct Routing)中,VIP(虚拟 IP)需要同时配置在 负载均衡器(Director) 和 所有后端服务器(Real Server) 上,但为了避免 ARP 地址冲突(多个设备响应同一个 VIP 的 ARP 请求),需要通过特殊配置确保:

  1. 只有负载均衡器响应 VIP 的 ARP 请求

  2. 后端服务器静默处理 VIP,不响应 ARP 请求

解决方案:ARP 抑制配置

参数作用详解
参数 作用
arp_ignore 0 只要本地 IP 存在,无论哪个接口收到 ARP 请求,都响应。
1 仅当请求的 IP 严格配置在接收 ARP 请求的接口上时,才响应
arp_announce 0 允许使用任意接口的 MAC 地址响应 ARP(可能导致混乱)。
2 仅使用严格配置了该 IP 的接口的 MAC 地址响应 ARP(最严格模式)。

通过调整内核参数 arp_ignore 和 arp_announce 来控制 ARP 响应行为:

1. 后端服务器配置(关键!)

在每个 后端服务器(Real Server) 上添加以下配置:

# 永久生效,直接写入文件
echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf

# 应用配置
sysctl -p 

为什么需要同时配置 all 和 lo

all 的作用范围是所有网络接口。

lo 的作用范围是仅针对回环接口 lo

在 LVS DR 模式中:

  1. VIP 配置在后端服务器的 lo 接口,但流量实际通过 eth0 收发。

  2. all 配置:防止所有接口(包括 eth0)响应 VIP 的 ARP 请求。

  3. lo 配置:进一步强化对回环接口的控制,确保 VIP 的 ARP 响应只由负载均衡器发出。

这里在两个后端服务器RS1和RS2上都要进行配置 

2. 负载均衡器配置

在 负载均衡器(Director) 上,通常只需将 VIP 配置在物理网卡(如 eth0)上,无需特殊 ARP 参数。但若 VIP 也配置在回环接口(lo),则需确保:

net.ipv4.conf.lo.arp_ignore = 0  # 允许回环接口响应 VIP 的 ARP
net.ipv4.conf.lo.arp_announce = 0  # 允许使用物理网卡的 MAC 响应

4、在负载均衡器上进行lvs调度策略的编写

5、测试:

七、TUN模式的LVS集群(只做了解)

LVS(Linux Virtual Server)的 TUN 模式(IP Tunneling) 是一种高性能的负载均衡实现方式,通过 IP 隧道技术将负载均衡器和后端服务器连接起来。

1、核心原理:

  1. 工作机制

    • 负载均衡器(Director)接收客户端请求后,不修改原数据包,而是将其封装在一个新的 IP 包中(外层 IP 为 Director 和 Real Server 的 IP),通过隧道发送给后端服务器。

    • 后端服务器(Real Server)解封装后处理请求,并直接将响应返回给客户端(无需经过 Director)。

  2. 关键特点

    • 网络层封装:使用 IPIP 协议(IP 协议号 4)或 GRE(Generic Routing Encapsulation)进行数据包封装。

    • 跨地域部署:Director 和 Real Server 可以位于不同网络,只需路由可达。

    • 高性能:请求和响应路径分离,Director 仅处理入站流量,避免成为瓶颈。

2、优缺点与适用场景

优点

  • 高性能:Director 仅处理请求,响应直接返回客户端,吞吐量高。

  • 跨地域部署:支持将后端服务器分布在不同地理位置。

  • 扩展性强:可轻松添加或移除后端服务器,不影响服务。

缺点

  • 配置复杂:需在所有服务器上配置隧道,维护成本高。

  • 依赖 IPIP 协议:部分网络环境可能封禁 IPIP 协议(IP 协议号 4)。

  • 故障排查困难:隧道封装可能导致数据包追踪复杂。

适用场景

  • 大规模负载均衡集群(如电商平台、CDN)。

  • 跨数据中心部署的高可用服务。

  • 需卸载 Director 压力的高并发场景。

八、FullNAT模式的LVS集群(只做了解)

FullNAT 是 LVS 的一种特殊负载均衡模式,由华为对 Linux 内核进行扩展实现(最早在 2.6.32 内核中引入)。它通过同时修改请求的源 IP 和目标 IP,突破了传统 DR 模式的网络限制,允许后端服务器(Real Server)部署在任意网络中。

1、核心原理:

1. 工作机制

  • 请求路径
    客户端 → Director(修改源 IP 为 Director 的内网 IP,目标 IP 为 RS 的内网 IP)→ RS

  • 响应路径
    RS → Director(修改源 IP 为 VIP,目标 IP 为客户端 IP)→ 客户端

2. 关键特性

  • 双向 NAT:同时修改请求和响应的源 / 目标 IP,实现跨网段负载均衡。

  • 对称路径:请求和响应必须经过 Director,保证连接跟踪一致性。

  • 解除网络限制:RS 可以部署在任意网络(如私有云、公有云),只需与 Director 路由可达。

2、优缺点与适用场景

优点

  • 网络灵活性:突破 DR 模式的同网段限制,支持混合云部署。

  • 部署简单:RS 无需配置 VIP 和复杂的 ARP 参数。

  • 故障隔离:Director 可作为网络边界,增强安全性。

缺点

  • Director 负载较高:需处理双向流量,吞吐量低于 DR/TUN 模式。

  • 内核依赖:非标准内核模块,需特殊编译或使用华为内核。

  • 连接跟踪限制:依赖内核连接跟踪表,大规模集群需优化内存。

适用场景

  • 混合云架构:后端服务器分布在公有云与私有云。

  • 数据中心互联:跨地域数据中心的负载均衡。

  • 网络架构复杂:无法满足 DR 模式同网段要求的场景。

九、添加防火墙标签解决轮询错误的问题

注:此实验的实验环境为上面DR模式的实验环境。

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

场景 RR 算法行为
未做标记(独立 VS) 80 和 443 独立轮询,可能因计数器同步 “巧合” 到同一 RS
做了标记(合并 VS) 80 和 443 严格按请求顺序轮询,导致同一客户端请求分散

以 HTTP 和 HTTPS 为例,当我们在RS中同时开放80443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题。

当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。

RS1RS2中安装mod_ssl并重启apache。

添加如下的LVS策略:

测试发现两次访问都轮询到了同一个real server。

未做标记时:两个独立虚拟服务的 RR 可能 “同步”

关键点在于

  • 每个虚拟服务(80 和 443)独立维护自己的 RR 计数器

  • 若客户端的 80 和 443 请求几乎同时到达,两个虚拟服务的 RR 计数器可能恰好处于相同状态(例如都指向 RS1)。

例如:

  1. 客户端首次访问 80 端口时,VS1 的 RR 计数器指向 RS1,请求被转发到 RS1。

  2. 紧接着客户端访问 443 端口,此时 VS2 的 RR 计数器也指向 RS1(因初始状态相同),请求也被转发到 RS1。

这种 “巧合” 会让您误以为 “同一客户端的请求总被分到同一 RS”,但实际上只是 RR 计数器同步的结果。若两个请求的时间间隔较长,或中间有其他客户端的请求插入,RR 计数器可能错开,导致同一客户端的请求被分到不同 RS。

2、使用防火墙标记来解决轮询调度问题

FWM:FireWall Mark。

MARK target 可用于给特定的报文打标记, --set-mark value。

其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度。

如何实现防火墙标记:

Director主机打标记(即负载均衡器上打标记):
命令:iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports
$portl,$port2,..-j MARK --set-mark NUMBER

#它的作用是:对发往特定 VIP(虚拟 IP)和端口的流量打标记(MARK),以便后续基于标记进行路由或调度。

关键参数说明
-t mangle:使用 mangle 表,该表专门用于修改数据包元数据(如 TOS、MARK)。
-A PREROUTING:将规则添加到 PREROUTING 链,该链在路由决策前处理数据包。
-d $vip:目标地址为变量 $vip(通常是 LVS 的虚拟 IP)。
-p $proto:协议类型(如 tcp 或 udp)。
-m multiport --dports $port1,$port2,...:匹配多个目标端口(如 80,443)。
-j MARK --set-mark NUMBER:给匹配的数据包打标记(NUMBER 是 0-4294967295 之间的整数)。

Director主机基于标记定义集群服务:

命令:ipvsadm -A -f NUMBER [options] 

这是 LVS (Linux Virtual Server) 中用于创建基于防火墙标记 (firewall mark) 的虚拟服务器的命令。
这种方式允许您根据 iptables 标记的流量来调度请求,而不是传统的 IP 地址和端口。

关键参数说明
除了 -f NUMBER,常用的选项包括:
-s scheduler      # 指定调度算法 (rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-p [timeout]      # 持久连接的超时时间 (秒)
-M netmask        # 持久连接的子网掩码

实验示例如下:

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

设定调度规则

测试结果如下:

发现可以成功轮询了,则实验成功。

做了标记后:合并虚拟服务导致 RR 按请求顺序分配

此时的行为差异

  • 80 和 443 端口的请求被视为同一个虚拟服务的流量,共享同一个 RR 计数器。

  • RR 算法会严格按请求到达顺序轮询所有后端服务器,而不区分客户端。

例如:

  1. 客户端 A 发送 80 端口请求,RR 计数器指向 RS1,请求被转发到 RS1。

  2. 客户端 A 紧接着发送 443 端口请求,此时 RR 计数器已更新为 RS2,请求被转发到 RS2。

这就导致了 “做标记后同一客户端的请求被分到不同 RS” 的现象。

十、LVS持久链接

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单 纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单 粗暴,可能会导致调度失衡。

解决方案

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把 这个源的主机调度到了那个RS上。

如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。

如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上。

命令:ipvsadm-A|E -t|u|f service-address[-s scheduler] [-p [timeout]]默认360秒

参数分组:

    操作类型:
    -A:添加新的虚拟服务(Add)
    -E:编辑已存在的虚拟服务(Edit)

    服务类型:
    -t:TCP 服务(如 HTTP、HTTPS)
    -u:UDP 服务(如 DNS、NTP)
    -f:基于防火墙标记(Firewall Mark)的服务(您之前配置的就是这种)

    服务地址:
    对于 -t 和 -u:格式为 IP:Port(如 192.168.0.220:80)
    对于 -f:格式为标记值(如 6666)

    调度算法:
    -s scheduler:指定负载均衡算法(默认是 wlc,即加权最小连接数)
    常用值:rr(轮询)、wrr(加权轮询)、lc(最小连接数)、sh(源地址哈希)等

    持久连接:
    -p [timeout]:启用会话保持(默认超时时间 360 秒,即 6 分钟)
    若省略 timeout,则默认使用 360 秒

现象(HTTP 和 HTTPS 请求都被调度到同一台 RS)是由于 LVS 的会话保持(persistent)机制生效。当您使用 -p 3000 参数时,LVS 会在 3000 秒内将同一客户端的所有请求强制路由到同一台 RS,从而覆盖了 RR(轮询)算法的默认行为。

详细解释:

1. 会话保持(-p 参数)的工作原理

  • 当执行 ipvsadm -E -f 6666 -s rr -p 3000 时,LVS 会:

    • 忽略 RR 算法的轮询逻辑,转而使用客户端 IP 作为哈希键。

    • 在 3000 秒内,将同一客户端 IP 的所有请求(无论端口)强制发送到首次选择的 RS

  • 因此,客户端先访问 HTTP(80 端口)时被分配到 RS2,后续 HTTPS(443 端口)请求也会被强制路由到 RS2,导致输出:

    RS2 - 192.168.0.20
    RS2 - 192.168.0.20
    

2. 与之前配置的差异

  • 未使用 -p 参数时:LVS 按 RR 算法独立调度 80 和 443 端口的请求,可能导致同一客户端的请求被分到不同 RS。

  • 使用 -p 参数后:LVS 会确保同一客户端的所有请求在超时时间内被发送到同一 RS,避免会话丢失。

LVS工作模式的总结对比

维度 NAT 模式 DR 模式 TUN 模式 Full-NAT 模式
IP 修改 入站改目标 IP,出站改源 IP 不修改 IP,改 MAC 地址 不修改 IP,隧道封装 入站同时改源 IP 和目标 IP
流量路径 双向经 LVS 入站经 LVS,出站 RS 直连 入站经隧道,出站 RS 直连 双向经 LVS
网络范围 同一子网 同一物理子网(二层可达) 跨子网 / 跨地域(依赖隧道) 任意网络(可跨子网)
RS 网关配置 必须指向 LVS 的内网 IP 无需指向 LVS(可独立设置网关) 无需指向 LVS(可独立设置网关) 无需指向 LVS(独立网关)
性能 低(瓶颈在 LVS) 极高(仅入站经 LVS) 中高(隧道有开销) 中(双向经 LVS)
Director 负载 高(处理双向流量) 低(仅处理请求) 低(仅处理请求) 中(处理双向流量)
RS 配置复杂度 低(仅需设网关) 中(需抑制 ARP + 绑定 VIP) 高(需配置隧道 + 绑定 VIP) 低(无需绑定 VIP)
典型场景 小规模集群、数据库 Web 服务、大规模集群 跨地域集群、CDN 复杂网络架构、安全需求

网站公告

今日签到

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