当前位置: 首页 > news >正文

lvs原理及实战部署

一、集群与分布式系统

1 集群

1-1概念

集群式架构是将多个相同或相似的节点组合在一起,形成一个逻辑上的 “整体”,对外提供统一的服务或资源。节点之间通常具有较高的同构性(硬件、软件配置相似),且紧密协作。

1-2 三种类型

高可用(High Availability )
高可用是指系统在长时间内保持稳定运行、减少停机时间的能力,核心是通过容错设计避免单点故障。
核心目标:
  • 减少停机时间:通过冗余、自动故障转移等机制,确保服务 “不间断”(或中断时间极短)。
  • 提升可靠性:即使部分节点故障,系统仍能正常提供服务。
关键指标:

可用性等级,通常用 “几个 9” 表示,例如:

  • 99.9%:每年允许停机约 8.76 小时。
  • 99.99%:每年允许停机约 52.56 分钟。
  • 99.999%:每年允许停机约 5.26 分钟(“五个九”,高可用系统的常见目标)。
负载均衡(Load Balance )
负载均衡是一种分配网络请求或计算任务到多个节点的技术,目的是避免单一节点过载,提升系统整体性能和稳定性。
核心目标:
  • 均衡负载:将流量 / 任务分散到多个节点,防止某节点因压力过大宕机。
  • 提高吞吐量:通过并行处理提升系统的并发能力(如同时处理更多用户请求)。
  • 扩展灵活性:可通过增加节点轻松扩展系统容量(水平扩展)。
高性能计算(High-Performance Computing)
高性能计算是通过多节点并行计算处理复杂、大规模计算任务的技术,核心是提升计算速度和处理能力。
核心目标:
  • 解决大规模问题:处理单台计算机无法完成的复杂任务(如气候模拟、基因测序、流体力学分析)。
  • 并行计算:将任务拆分到多个节点,同时计算并汇总结果,大幅缩短处理时间。

3-3典型应用场景

负载均衡集群:如 Web 服务器集群(Nginx、Apache 集群),通过分发请求避免单点过载。

高可用集群:如数据库集群(MySQL 主从、PostgreSQL 流复制),确保服务不中断。

2 分布式

2-1 概念

分布式架构是将一个复杂的系统拆分为多个独立的子系统(节点),每个节点负责一部分功能,通过网络协同完成整体任务。节点之间可以异构,且分工明确。

2-2 典型应用场景:

  • 分布式服务架构:如微服务系统(Spring Cloud、Dubbo),将业务拆分为独立服务。
  • 分布式存储:如 HDFS(分布式文件系统)、Ceph,将数据分散存储在多个节点。
  • 分布式计算:比如Hadoop集群,将计算任务分发到多个节点并行处理。
  • 分布式数据库:如 MongoDB 分片集群、TiDB,数据分散存储在不同节点,提升读写性能。

区别与联系

分布式是并联工作的,集群是串联工作的。

分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率

分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。

分布式一个业务拆分成多个子业务,每个子业务分别部署在不同的服务器上,如果某台服务器挂掉,那么这块业务会随服务器一快损失

集群则是同一个业务部署在多台服务器上,即便某台服务器挂掉,其他服务器立刻顶上,不会对业务造成过大影响

二、lvs简介

1 概念

LVS(Linux Virtual Server)是一个开源的**负载均衡软件,由中国工程师章文嵩博士主导开发。它基于 Linux 内核,通过 IP 层的流量分发实现高性能负载均衡,广泛应用于大型网站、分布式系统和云计算环境中。

2 名词解释

VS:Virtual Server		 		 调度器
RS:RealServer			 		负责真正提供服务的服务器
CIP:Client IP					客户端IP
VIP: Virtual serve IP 	  		 调度器外网IP
DIP: Director IP 				调度器内网的IP
RIP: Real server IP				真实服务器IP

3 lvs集群体系结构

在这里插入图片描述

工作原理

VS根据请求报文的目标IP和目标协议及端口进行修改(根据模式更改)并调度转发到某一个RS(根据调度算法挑选)。

访问流程

CIP<->VIP==DIP<->RIP

架构

负载均衡层(Load Balancer):
一台或多台LVS服务器构成负载调度器,也称为Director Server。
负责接收客户端的请求,并根据调度算法将请求分发给后端的Real Server。
监控Real Server的健康状况,动态地从LVS路由表中添加或剔除不健康的服务器。

服务器群组层(Server Array):
由一台或多台实际运行的应用服务器构成,也称为Real Server。
负责处理LVS分发过来的请求,并将处理结果返回给客户端。
Real Server之间可以通过有效网络互连,实现数据的共享和通信。

共享存储层(Shared Storage)(可选):
提供共享存储空间和内容一致性的存储区域,如数据库、OSS存储、FS文件服务器等。
在需要共享数据或资源的分布式系统中,共享存储层是不可或缺的。

三、工作模式

NAT模式

地址转换:Network Address Translation,简称:NAT 模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,作为客户机的访问入口,也是各节点回应客户机的访问出口,服务器节点使用私有 IP 地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式

  • 双向地址转换:请求阶段用 DNAT,响应阶段用 SNAT,所有数据必须经过 LVS。
  • 后端服务器隐藏:RS 仅需与 LVS 私网通信,无需暴露公网,安全性高。
  • 性能瓶颈:LVS 是数据传输的唯一出入口,高并发场景下可能成为带宽或处理能力瓶颈。
  • 适用场景:小规模后端集群(通常 RS 数量≤10 台),对成本敏感且安全性要求较高的场景。

实现原理

在这里插入图片描述

5Cnat2.jpg&pos_id=img-UbxrOZQ7-1752905953983)

1、 客户端发出的请求数据包经过网络到达 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。

2、然后进入 PREROUTING 链中,根据目的 IP 查找路由,确定是否为本机 IP 地址,随后将数据包转发至 INPUT 链中,源 IP 和 目的 IP 不变。

3、 到达 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 来作为后端服务器,数据包的目的 IP 地址将会修改为 RIP,这时并以 RIP 为目的 IP 去查找路由,确定下一跳及 PORT 信息后,数据包将会转发至 OUTPUT 链中。

4、 被修改过的数据包经过 POSTROUTING 链后,到达 RS 服务器,数据包源 IP 为 CIP,目的 IP 为 RIP。

5、 RS 服务器经过处理后,将会把数据包发送至用户空间的应用程序,待处理完成后,发送响应数据包,RS 服务器的默认网关为 LVS 的 IP,应用程序将会把数据包转发至下一跳 LVS 服务器,数据包源 IP 为 RIP,目的 IP 为 CIP。

6、 LVS 服务器收到 RS 服务器响应的数据包后,查找路由,目的 IP 不是本机 IP并且 LVS 服务器开启了 FORWARD 模式,会将数据包转发给它,数据包不变。

7、 LVS 服务器收到响应数据包后,根据目的 IP 和 目的 PORT 查找相应的服务,这时,源 IP 为 VIP,通过查找路由,确定下一跳信息

注意

1.RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
2.请求报文和响应报文都必须经由Director转发,Director易成为系统瓶颈
3.支持端口映射,可修改请求报文的目标PORT
4.VS必须是Linux系统,RS可以是任意OS系统

NAT 模式的优缺点

一、优点

  1. 部署简单,网络架构要求低:后端服务器(RS)只需将默认网关指向 LVS 的 DIP,对 RS 的操作系统和应用无特殊要求,兼容性强(支持 Linux、Windows 等)。LVS 与 RS 可不在同一网段,网络拓扑灵活,适合跨网段部署场景。
  2. 安全性较高:后端服务器隐藏在私有网络中,不直接暴露公网,仅通过 LVS 的 VIP 对外提供服务,可减少 RS 被直接攻击的风险。
  3. 支持端口映射:可在 LVS 上配置 VIP 端口与 RS 端口的映射,适合后端服务端口不一致的场景。

二、缺点

  1. 性能瓶颈明显:所有数据包必须经过 LVS,LVS 需对每个包进行 IP 地址转换,计算开销大,容易成为系统瓶颈。
  2. 网络延迟较高:响应数据包需从 RS→LVS→客户端,比 DR 模式的 “RS 直接回客户端” 多一次转发,增加了网络延迟,对实时性要求高的业务(如视频通话、高频交易)不友好。

DR模式

DR(Direct Routing,直接路由)模式是一种高性能的负载均衡技术,其核心通过修改数据包的 MAC 地址实现请求分发,且响应数据直接从后端服务器返回给客户端,大幅减少了负载均衡器的流量压力。

  • 高性能:LVS 仅处理请求分发(改 MAC),响应数据不经过 LVS,避免了带宽瓶颈,支持大规模后端集群(通常可承载数百台 RS)。
  • 网络限制:LVS 与 RS 必须在同一二层网段(共享交换机),否则无法通过 MAC 地址转发。
  • 安全性:RS 需绑定 VIP,若配置不当可能导致 VIP 冲突;且 RS 可直接与客户端通信,需做好安全隔离。
  • 适用场景:高并发、大流量场景(如 Web 服务、视频点播),对性能要求极高的业务。

实现原理

在这里插入图片描述

  1. 客户端发出的请求数据包经过网络到达 LVS 网卡,数据包源 IP 为 CIP(客户端 IP),目的 IP 为 VIP(虚拟服务 IP)。
  2. 数据包进入 PREROUTING 链,LVS 根据目的 IP(VIP)查找路由,确认 VIP 为本机服务 IP 后,将数据包转发至 INPUT 链,此时源 IP(CIP)和目的 IP(VIP)均保持不变。
  3. 到达 LVS 后,通过目的 IP(VIP)和目的 PORT(服务端口)匹配到 IPVS 服务,LVS 根据负载均衡算法选择一台 RS(后端服务器)。与 NAT 模式不同,DR 模式不修改目的 IP(仍为 VIP),仅将数据包的目的 MAC 地址修改为选中 RS 的 MAC 地址(R-MAC),随后以该 MAC 地址为目标查找二层路由,确定下一跳后将数据包转发至 OUTPUT 链。
  4. 被修改 MAC 地址的数据包经过 POSTROUTING 链后,通过二层网络(同网段交换机)送达 RS 服务器。此时数据包的源 IP 仍为 CIP,目的 IP 仍为 VIP(因 RS 的回环网卡已绑定 VIP,可正常接收该数据包)。
  5. RS 服务器接收数据包后,经处理转发至用户空间的应用程序,处理完成后生成响应数据包。由于 RS 的默认网关指向客户端所在网络的网关(而非 LVS),响应数据包直接通过三层路由发送,源 IP 为 VIP(RS 回环网卡上的 VIP,确保客户端识别),目的 IP 为 CIP。
  6. 响应数据包不经过 LVS,直接通过公网路由到达客户端所在网络,最终送达客户端。
  7. 客户端接收响应数据包,其源 IP 为 VIP(与请求的目标 IP 一致),目的 IP 为 CIP,整个过程对客户端透明,感知不到后端 RS 的存在。

注意

由于所有 RS 的回环网卡都绑定了 VIP,可能导致局域网内的 ARP 冲突(当交换机询问 “VIP 对应的 MAC 是哪个” 时,多台 RS 会同时响应)。因此需在 RS 上做ARP 抑制配置
不支持端口映射(端口不能修改)
Director 与所有 RS 必须在同一物理网段(共享二层交换机),依赖 MAC 地址转发,跨网段会导致失败。
RS 的默认网关需指向客户端所在网络的网关(而非 DIP),确保响应数据包能直接回传客户端,不经过 Director。
RS 的lo网卡绑定 VIP 时,需设置子网掩码为255.255.255.255,避免广播冲突。

DR模式优缺点

一、优点

  1. 性能极高,吞吐量巨大:DR 模式下,LVS 仅负责修改数据包的 MAC 地址,不修改 IP 地址,避免了 IP 地址转换的开销。响应数据包从 RS 直接返回给客户端,LVS 仅处理入站请求,极大降低了负载均衡器的压力,可支持大规模并发访问。
  2. 网络路径短,延迟低:客户端请求经 LVS 转发至 RS 后,RS 直接回包给客户端,减少了 “客户端→LVS→RS→LVS→客户端” 的冗余路径,降低了网络延迟。
  3. 可扩展性强:由于 LVS 负载较轻,理论上可挂载大量后端 RS,适合高并发场景(如电商秒杀、视频直播等)。

二、缺点

  1. 网络环境限制严格:LVS 和所有 RS 必须在同一物理局域网内,且共享同一个 VIP,因为数据包通过 MAC 地址转发
  2. VIP 冲突与 ARP 广播问题需特殊处理:所有 RS 和 LVS 都需配置 VIP(RS 通常在回环接口 lo 上配置 VIP,且需关闭 ARP 响应和广播,避免客户端或网关收到多个 VIP 的 ARP 应答导致冲突)。
  3. 后端服务器需与 LVS 同网段,灵活性低:无法像 NAT 模式那样通过网关跨网段转发,RS 必须和 LVS 在同一子网,限制了网络架构的灵活性。

TUN模式

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部
(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP
是CIP)

实现原理

在这里插入图片描述

1.客户端发送请求数据包,包内有源IP+vip+dport
2.到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含
TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
3.RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)
+port,响应数据包通过网络直接回传给client
注意

1.DIP, VIP, RIP都应该是公网地址
2.RS的网关一般不能指向DIP
3.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能

四、lvs调度算法

类型

静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

静态算法

  1. 轮询(Round Robin, rr)
    • 原理:按顺序依次将请求分配给 RS,循环往复。
    • 优点:实现简单,公平分配请求。
    • 缺点:忽略服务器性能差异,可能导致性能弱的服务器过载。
    • 适用场景:后端服务器性能相近的场景。
  2. 加权轮询(Weighted Round Robin, wrr)
    • 原理:为每个 RS 分配权重(如性能强的服务器权重高),按权重比例分配请求。
    • 优点:根据服务器性能差异化分配,利用率更高。
    • 缺点:权重需人工预设,无法动态适应服务器负载变化。
    • 适用场景:服务器性能差异明显(如新旧服务器混用)。
  3. 源地址哈希(Source Hashing, sh)
    • 原理:根据客户端 IP 地址计算哈希值,将同一客户端的请求始终路由到固定 RS。
    • 优点:实现会话粘性(Session Affinity),适合需保持会话状态的业务(如购物车)。
    • 缺点:可能导致负载不均(如部分客户端请求特别频繁)。
    • 适用场景:有会话保持需求的业务(如 PHP Session、无状态服务除外)。
  4. 目标地址哈希(Destination Hashing, dh)
    • 原理:根据目标 IP(如 VIP)或端口计算哈希值,将请求路由到固定 RS。
    • 优点:适合内容缓存场景(如 CDN),确保相同内容始终由同一 RS 处理。
    • 缺点:灵活性低,不适合动态业务。
    • 适用场景:内容分发网络(CDN)、静态资源缓存。

动态算法

  1. 最小连接(Least Connections, lc)
    • 原理:将请求分配给当前连接数最少的 RS,认为连接数少的服务器负载低。
    • 优点:自动平衡服务器负载,避免单台服务器过载。
    • 缺点:未考虑连接的活跃程度(如长连接与短连接的差异)。
    • 适用场景:连接生命周期差异不大的业务。
  2. 加权最小连接(Weighted Least Connections, wlc)
    • 原理:在最小连接基础上,结合服务器性能权重(如active_conns/weight),优先分配给 “单位权重连接数” 最少的 RS。
    • 优点:综合考虑服务器性能和实时负载,分配更精准。
    • 缺点:需预设权重,且计算复杂度略高。
    • 适用场景:服务器性能差异明显,且连接生命周期相近的业务。
  3. 最短期望延迟(Shortest Expected Delay, sed)
    • 原理:计算每个 RS 的预期处理时间(overhead=(activeconns+1+inactiveconns) x 256/weight),选择预期延迟最小的 RS。
    • 优点:相比 wlc,更倾向于为低负载服务器分配新请求,避免高负载服务器堆积请求。
    • 缺点:仍依赖预设权重。
    • 适用场景:连接建立成本较高的业务(如数据库连接)。
  4. 永不排队(Never Queue, nq)
    • 原理:若 RS 的连接数为 0,直接分配;否则选择连接数最少的 RS。
    • 优点:避免新请求在高负载服务器排队,快速响应。
    • 缺点:可能导致部分服务器过载,部分闲置。
    • 适用场景:对响应时间敏感、请求处理时间差异大的业务。
  5. 基于局部性的最小连接(Locality-Based Least Connections, lblc)
    • 原理:结合源地址哈希和最小连接算法,优先将请求分配给已处理过该客户端请求且负载较低的 RS,否则选择全局连接数最少的 RS。
    • 优点:兼顾会话粘性和负载均衡,适合缓存集群(如 Redis 集群)。
    • 缺点:实现复杂度较高。
    • 适用场景:内容缓存、分布式存储系统。

4.15内核后新增调度算法

1.FO(Weighted Fai Over)调度算法:常用作灰度发布

  • 在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_FOVERLOAD标志)的且权重最高的真实服务器,进行调度
  • 当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。

2.OVF(Overflow-connection)调度算法
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动
连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关
联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条
件:

  • 未过载(未设置IP_VS_DEST_F OVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

五、lvs部署命令介绍

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

ipvsadm命令

虚拟服务

ipvsadm -A|E -t|u|f 服务/IP/火墙标记 [-s 算法] [-p [超时时间]]
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-f #firewall mask 火墙标记,是一个数字
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver

真实服务器

ipvsadm -a|e -t|u|f 服务/IP/火墙标记 -r realserver-address [-g|i|m] [-w weight]
-a #添加realserver
-e #更改realserver-t #tcp协议
-u #udp协议
-f #火墙 标签-r #realserver地址-g #DR模式
-i #TUN模式
-m #NAT模式-w #设定权重

其他

ipvsadm 
-Z #清空计数器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :输出速率信息

部署NAT模式集群案例

在这里插入图片描述

实验环境

主机ip及网卡模式角色
client192.168.60.100 GW:192.168.60.2 NAT模式测试机
lvsvip:eth0 192.168.60.200 NAT模式
dip:eth1 192.168.182.200 仅主机模式
调度器(VS)
rs1192.168.182.210 GW:192.168.60.200 仅主机模式真实服务器(RS)
rs2192.168.182.220 GW:192.168.60.200 仅主机模式真实服务器(RS)

网络部署

client

vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.100/24,192.168.60.2
dns=8.8.8.8#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 #重启网卡

lvs

#编辑eth0网卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.200/24
dns=8.8.8.8#编辑eth1网卡配置文件
vim /etc/NetworkManager/system-connections/eth1.nmconnection
#写入配置
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.182.200/24
dns=8.8.8.8#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 	#重启网卡
nmcli connection up eth1#开启内核路由功能
#编辑内核参数文件
vim /etc/sysctl.conf
#启用IP转发,让主机内网卡可以通信,使Linux系统充当路由器
net.ipv4.ip_forward = 1
#是配置立即生效
sysctl -p

rs1

vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.210/24,192.168.182.200 #网关设置为dip, 
dns=8.8.8.8#关闭防火墙
systemctl disable --now firewalld.service

rs2

vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.220/24,192.168.182.200
dns=8.8.8.8nmcli connection reload #重新加载网络配置
nmcli connection up eth0 #重启网卡

程序、文件部署

lvs

#安装ipvsadm
dnf install ipvsadm-1.31-6.el9.x86_64 -y#关闭防火墙
systemctl disable --now firewalld.service

rs1

#安装httpd
dnf install httpd
#开启服务,启用80端口
systemctl start httpd
#写入apache默认页面
echo RS1 192.168.182.210 > /var/www/html/index.html#关闭防火墙
systemctl disable --now firewalld.service

rs2

#安装httpd
dnf install httpd
#开启服务,启用80端口
systemctl start httpd
#写入apache默认页面
echo RS2 192.168.182.220 > /var/www/html/index.html#关闭防火墙
systemctl disable --now firewalld.service

添加调度策略

lvs

#添加虚拟服务器 指定其ip和端口192.168.60.200:80 算法为Round Robin(轮询)
ipvsadm -A -t 192.168.60.200:80 -s rr
#为虚拟服务器指定后端真实服务器 模式为nat
ipvsadm -a -t 192.168.60.200:80 -r 192.168.182.210:80 -m
ipvsadm -a -t 192.168.60.200:80 -r 192.168.182.220:80 -m#保存规则
ipvsadm -Sn > /etc/sysconfig/ipvsadm#设置开机自启动,需要先将文件规则/etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm.service

测试

client

在这里插入图片描述

lvs

在这里插入图片描述

部署DR模式集群案例

在这里插入图片描述

实验环境

#五台主机环境相同
[root@RS2 ~]# hostnamectlStatic hostname: RS2Icon name: computer-vmChassis: vm 🖴Machine ID: a4903574870e4a5680ed175ce460853aBoot ID: 987e45e2cdbe4679833e155842096ebbVirtualization: vmware
Operating System: Red Hat Enterprise Linux 9.4 (Plow)     CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseosKernel: Linux 5.14.0-427.13.1.el9_4.x86_64Architecture: x86-64Hardware Vendor: VMware, Inc.Hardware Model: VMware Virtual Platform
Firmware Version: 6.00

网络部署

主机ip及网卡模式角色
client
eth0:192.168.60.100 NAT模式
GW:192.168.60.200
测试机
routeeth0:192.168.60.200 NAT模式
eth1:192.168.182.200 仅主机模式
路由器
lvseth0:192.168.60.230 仅主机模式
vip:192.168.182.100
GW:192.168.182.200
调度器
rs1eth0:192.168.60.210 仅主机模式
vip:192.168.182.100
GW:192.168.182.2
真实服务器
rs2eth0:192.168.60.220 仅主机模式
vip:192.168.182.100
GW:192.168.182.2
真实服务器

client

vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.100/24,192.168.60.200#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 #重启网卡

route

#编辑eth0网卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.200/24#编辑eth1网卡配置文件
vim /etc/NetworkManager/system-connections/eth1.nmconnection
#写入配置
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.182.200/24#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 	#重启网卡
nmcli connection up eth1#开启内核路由功能
#编辑内核参数文件
vim /etc/sysctl.conf
#启用IP转发,让主机内网卡可以通信,使Linux系统充当路由器
net.ipv4.ip_forward = 1
#是配置立即生效
sysctl -p

lvs

#编辑eth0网卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.230/24,192.168.182.200#编辑lo网卡配置文件
vim /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.182.100/32 #vip#修改权限
chmod 600 /etc/NetworkManager/system-connections/lo.nmconnection#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 	#重启网卡
nmcli connection up lo#ip 查看配置是否生效,如果ip未添加 
[root@RS1 system-connections]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:1d:88:df brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.182.210/24 brd 192.168.182.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::869f:ac0c:2ae7:302e/64 scope link noprefixroute valid_lft forever preferred_lft forever#查看连接 可以看到有两个lo
[root@RS1 system-connections]# nmcli connetcion show   
NAME  UUID                                  TYPE      DEVICE 
eth0  7ba00b1d-8cdd-30da-91ad-bb83ed4f7474  ethernet  eth0   
lo    d4597a3b-5641-4c5a-81cd-ccf60082d7f8  loopback  lo
lo    b2baf1f3-48fa-398c-a8e1-e2e1f6a15e21  loopback  -- #删除第一个lo 配置生效
[root@RS1 system-connections]# nmcli c delete d4597a3b-5641-4c5a-81cd-ccf60082d7f8 
Connection 'lo' (d4597a3b-5641-4c5a-81cd-ccf60082d7f8) successfully deleted.

rs1

#编辑eth0网卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.210/24,192.168.182.2#编辑lo网卡配置文件
vim /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.182.100/32 #vip#修改权限
chmod 600 /etc/NetworkManager/system-connections/lo.nmconnection#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 	#重启网卡
nmcli connection up lo#设定lo不对外响应 
vim /etc/sysctl.conf
#写入
#arp_ignore(ARP 忽略策略):仅当 ARP 请求的目标 IP 配置在接收请求的网卡上时,才响应;否则忽略。
#arp_announce(ARP 宣告策略):强制使用与目标 IP 同网段的本地 IP 作为源 IP(必须同网段,否则不发送)。
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
#
sysctl -p

rs2

vim /etc/NetworkManager/system-connections/eth0.nmconnection
#写入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.220/24,192.168.182.2#编辑lo网卡配置文件
vim /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.182.100/32 #vip#修改权限
chmod 600 /etc/NetworkManager/system-connections/lo.nmconnection#使配置生效
nmcli connection reload #重新加载网络配置
nmcli connection up eth0 	#重启网卡
nmcli connection up lo#设定lo不对外响应 
vim /etc/sysctl.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
#
sysctl -p

程序、文件部署

lvs

#安装ipvsadm
dnf install ipvsadm-1.31-6.el9.x86_64 -y#关闭防火墙
systemctl disable --now firewalld.service

rs1

#安装httpd
dnf install httpd
#开启服务,启用80端口
systemctl start httpd
#写入apache默认页面
echo RS1 192.168.182.210 > /var/www/html/index.html#关闭防火墙
systemctl disable --now firewalld.service

rs2

#安装httpd
dnf install httpd
#开启服务,启用80端口
systemctl start httpd
#写入apache默认页面
echo RS2 192.168.182.220 > /var/www/html/index.html#关闭防火墙
systemctl disable --now firewalld.service

添加调度策略

#添加虚拟服务器 指定其ip和端口192.168.182.100:80 算法为Round Robin(轮询)
ipvsadm -A -t 192.168.182.100:80 -s rr
#为虚拟服务器指定后端真实服务器 模式为DR
ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.210:80 -g
ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.220:80 -g#保存规则
ipvsadm -Sn > /etc/sysconfig/ipvsadm#设置开机自启动,需要先将文件规则/etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm.service

测试

client

在这里插入图片描述

lvs

在这里插入图片描述

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

现象

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

原因

LVS 内核模块将每个虚拟服务(VIP:Port)视为独立实体,并且每个实体都拥有自己的:

  • 调度算法实例(如 RR 计数器)
  • 活动连接列表
  • 服务器权重配置

这意味这80和443端口的轮询序列都是独立的

解决方法

1.合并端口

本质:让所有请求(无论是原始 80 还是 443)最终都通过同一个端口(443) 进入负载均衡系统,共享同一套调度上下文

ipvs

# 创建虚拟服务,监听443端口,使用轮询(RR)算法
ipvsadm -A -t 192.168.1.1:443 -s rr# 添加后端RS服务器,注意端口为443(假设RS1和RS2都提供HTTPS服务)
ipvsadm -a -t 192.168.1.1:443 -r 192.168.10.1:443 -g  # -g表示DR模式
ipvsadm -a -t 192.168.1.1:443 -r 192.168.10.2:443 -g

iptables 重定向规则(将 80→443)

# 将80端口请求重定向到443
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 443#

rs仅监听443端口

2.iptables mark 标记

无论合并端口还是标记,核心目标都是打破 “VIP:Port 独立调度” 的限制

iptables mark

本质通过标记将不同端口的请求逻辑上归为同一组,让 LVS 对它们使用同一个调度上下文(共享 RR 计数器)。

MARK 属于 iptables 的一种目标(target),借助它能够给通过规则的数据包附上特定数值。这些被标记的数据包可以在后续的规则或者其他网络子系统(像路由表)中被识别出来,进而实现有针对性的处理。

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

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

环境

配置于此不过多赘述,参考DR集群案例

新增配置

rs1,rs2

#安装加密模块,实现https协议服务
yum install mod_ssl -y
#重启httpd,是配置生效
systemctl restart httpd

lvs

# 向mangele PREROUTING链 添加规则 用于匹配ip-192.168.182.100 协议-tcp 端口:80\443 ,满足以上条件者打上标记666
#将80和443归为同一组,使用同一个集群服务调度
iptables -t mangle -A PREROUTING -d 192.168.182.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666#写入规则
ipvsadm -A -f 666 -s rr
ipvsadm -a -f 666 -r 192.168.182.210 -g
ipvsadm -a -f 666 -r 192.168.182.220 -g

测试

连续访问80,443五次,可以从每次结果看出,完全遵照rr算法结果,每次访问的主机不同

在这里插入图片描述

http://www.xdnf.cn/news/1150741.html

相关文章:

  • 【I2C】01.I2C硬件连接I2C总线时序图讲解
  • Go语言pprof性能分析指南
  • Temperature 是在LLM中的每一层发挥作用,还是最后一层? LLM中的 Temperature 参数 是怎么计算的
  • 操作系统-分布式同步
  • TCP/UDP协议深度解析(四):TCP的粘包问题以及异常情况处理
  • GaussDB 数据库架构师修炼(六) 集群工具管理-1
  • 异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql
  • 深入解析 Amazon Q:AWS 推出的企业级生成式 AI 助手
  • 【设计模式C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)
  • LangGraph教程10:LangGraph ReAct应用
  • 访问 gitlab 跳转 0.0.0.0
  • 深入理解设计模式:策略模式的艺术与实践
  • XSS原型与原型链
  • 告别项目混乱:基于 pnpm + Turborepo 的现代化 Monorepo 工程化最佳实践
  • C++控制台贪吃蛇开发:从0到1绘制游戏世界
  • Git 完全手册:从入门到团队协作实战(2)
  • GaussDB union 的用法
  • Maven 依赖管理
  • Java从入门到精通:全面学习路线指南
  • uniapp props、$ref、$emit、$parent、$child、$on
  • MySQL练习3
  • 【橘子分布式】gRPC(编程篇-中)
  • 《Origin画百图》之多分类矩阵散点图
  • 从零开始学Tailwind CSS : 颜色配置原理与实践
  • (后者可以节约内存/GPU显存)Pytorch中求逆torch.inverse和解线性方程组torch.linalg.solve有什么关系
  • 93.数字信号处理相关的一些问题
  • 发明专利怎么写,与学术文章异同点与注意事项
  • 月舟科技近调记录
  • Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等
  • 实验-华为综合