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

LVS负载均衡集群概述

前言:

        在当今互联网应用规模不断扩大、用户访问量激增的背景下,高可用性与高性能服务成为关键需求。负载均衡技术作为分布式系统的核心组件,能够有效分配网络流量,提升资源利用率,保障服务的稳定性和扩展性。Linux Virtual Server(LVS)作为开源负载均衡解决方案的标杆,凭借其基于内核的高效转发能力、灵活的调度算法以及优异的可扩展性,被广泛应用于企业级集群架构中。本文将从LVS的核心原理、集群架构及调度策略出发,探讨其如何通过IP层负载均衡实现高并发场景下的流量分发,为构建高可用服务提供理论支撑。

目录

一、概述

1、集群概述

1.1、集群介绍

1.2、集群类型

1.3、负载均衡技术类型

1.4、负载均衡实现方式

2、LVS介绍

3、LVS和nginx区别

4、LVS相关术语

5、LVS负载均衡算法

5.1、静态负载均衡

5.2、动态负载均衡

二、三种LVS工作模式详解

1、基于NAT的LVS模式负载均衡

1.1、工作原理

1.2、LVS-NAT模型的特性

1.3、NAT的优点

1.4、NAT的缺点

2、基于TUN的LVS负载均衡

2.1、实现原理

2.2、TUN 模式的优点

2.3、TUN 模式的缺点

2.4、TUN 模式的使用场景

3、LVS(DR)负载均衡

3.1、DR 实现原理

3.2、DR 模式的优点

3.3、DR 模式的缺点

3.4、DR 模式的使用场景

三、IPVS模块概述

1、IPVS的介绍

2、IPVS的工作原理

3、ipvsadm命令

3.1、常见选项

3.2、配置案例

总结


一、概述

1、集群概述

1.1、集群介绍

集群是一组相互独立的、通过高速计算机网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。

计算机集群简称集群是一种计算机系统, 它通过一组松散集成的计算机软件/硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。

计算机集群Cluster,可以把多台计算机 连接在一起使用,平分资源或互为保障。其好处不言而喻,群集中的每个计算机被称为一个节点,节点可添加可减少,在这些节点之上虚拟出一台计算机供用户使用;从使用用户的角度看始终是使用一台计算机,无所谓多少节点。

特点:

1.高性能

一些国家重要的计算密集型应用(如天气预报,核试验模拟等),需要计算机有很强的运算处理能力

2.高性价比

通常一套系统集群架构,只需要几台或数十台服务器主机即可,与动则上百万的专用超级计算机相比具有更高的性价比

3.可扩展性

集群的性能不限于单一的服务实体,新的服务实体可以动态的加入到集群,从而增强集群的性能

4.高可用性

当一台节点服务器发生故障的时候,这台服务器上所运行的应用程序将在另一节点服务器上被自动接管。整个系统的服务可以是7*24小时可用的,消除单点故障对于增强数据可用性、可达性和可靠性是非常重要的

5.负载均衡

负载均衡能把任务比较均匀的分布到集群环境下的计算和网络资源,以便提高数据吞吐量

6.错误恢复

如果集群中的某一台服务器由于故障或者维护需要而无法使用,资源和应用程序将转移到可用的集群节点上

7.透明性

多个独立计算机组成的松耦合集群系统构成一个虚拟服务器。用户或客户端程序访问集群系统时,就像访问一台高性能,高可用的服务器一样,集群中一部分服务器的上线,下线不会中断整个系统服务,这对用户也是透明的

8.可管理性

整个系统可能在物理上很大,但是集群系统易管理,就像管理一个单一映像系统一样。在理想状况下,软硬件模块的插入能做到即插即用

9.可编程性

在集群系统上,容易开发及修改各类应用程序

1.2、集群类型

  • 负载均衡集群(Load Balance Cluster)

负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。

负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。

Load Balancing负载均衡,不同节点之间相互独立,不共享任何资源;通过一定算法将客户端的访问请求平分到群集的各个节点上,充分利用每个节点的资源。负载均衡扩展了网络设备和服务器带宽,增加吞吐量,加强网络数据处理能。

每个节点的性能和配置可能不同,根据算法,可以分配不同的权重到不同节点上,以实现不同节点的资源利用。如下图所示网络访问通过负载均衡器,将请求分布到不同节点上。

  • 高可用集群(High Availability Cluster)

常见的就是2个节点做成的HA集群,有很多通俗的不科学的名称,比如”双机热备”, “双机互备”, “双机”。

高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。 (请注意高可用集群既不是用来保护业务数据的,保护的是用户的业务程序对外不间断提供服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。

High availability Cluster高可用群集,简称HAC ;主要用于高可用解决方案的实现,节点间以主备形式,实现容灾;在大型故障(宕机,服务器故障)的情况下实现快速恢复,快速提供服务。如下图所示:当前节点在Node01,所有业务在Node01上运行,若发生故障服务和资源会转移到Node02上。高可用集群的另外一个特点是共享资源,多个节点服务器共享一个存储资源,该存储可在不同节点之间转移。

高可用群集可实现以下三种方式:

  1. 主从方式:主机工作,备机监控。此方式不能有效的利用服务器资源

  2. 互为主从:两服务器同时在线,一台服务器故障可切换到另一台上。此 方式有效的利用服务器资源,但当服务器故障时候,将导致一台服务器上运行多个业务。

  3. 多台服务器主从:大部分服务器在线使用,小部分监控;若有部分服务器故障,可切换到指定的小部分服务器上。此方式为前两种方式的综合。然后多台服务器群集,也增加了管理的复杂度

  • 科学计算集群(High Performance Computing Cluster)

高性能计算(High Perfermance Computing)集群,简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。

并行计算或称平行计算是相对于串行计算来说的。并行计算的能力的目的是提高计算速度。

并行计算分为时间计算和空间计算:

  1. 时间计算既是流水线技术,一个处理器分为多个单元,每个单元负责不同任务,这些单元可并行计算。

  2. 空间计算利用多个处理器并发的执行计算。目前PC机的计算能力越来越强,将大量低廉的PC机互联起来,组成一个"大型计算机"以解决复杂的计算任务。Beowulf computers为最典型的空间并行计算。

高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPCcluster的并行能力。这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。

HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果会影响到其它节点计算结果的情况。

1.3、负载均衡技术类型

四层负载均衡器: 也称为 4 层交换机,主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等;

七层负载均衡器 :也称为 7 层交换机,位于 OSI 的最高层,即应用层,此负载均衡器支持多种协议,如HTTP、FTP、SMTP 等。7 层负载均衡器可根据报文内容,配合一定的负载均衡算法来选择后端服务器,即“内容交换器”。如常见的 HAProxy、Nginx。

1.4、负载均衡实现方式

硬件负载均衡产品:F5 、深信服 、Radware

软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)

2、LVS介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。

为什么要用 LVS?

为了克服服务器的过载压力问题,有两种解决方案:

  • 单服务器解决方案,即将服务器升级到性能更高的服务器,但是当请求增加时,将很快过载,因此必须再次对其进行升级,升级过程复杂且成本高;

  • 多服务器解决方案,即在服务器集群上构建可扩展的网络服务系统。当负载增加时,可以简单地在群集中添加新服务器或更多服务器以满足不断增长的需求,而商用服务器具有最高的性能/成本比。因此,构建用于网络服务的服务器群集系统更具可伸缩性,并且更具成本效益。

3、LVS和nginx区别

  • LVS比nginx具有更强的抗负载能力,性能更高,对内存和cpu资源消耗低。

  • LVS工作在网络层,具体流量由操作系统内核进行处理,nginx工作在应用层,可针对http应用实施一些分流策略。

  • LVS安装配置比较复杂点,网络依赖性较大,稳定性高,lvs不支持正则表达式,不能实现动静分离操作。

  • LVS使用的协议范围广, Nginx 仅支持 HTTP、HTTPS、Email 协议,适用范围小。

4、LVS相关术语

  • DS:Director Server。指的是前端负载均衡器节点。

  • RS:Real Server。后端真实的工作服务器。

  • VIP:Virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址。

  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。

  • RIP:Real Server IP,后端服务器的IP地址。

  • CIP:Client IP,访问客户端的IP地址。

 

5、LVS负载均衡算法

5.1、静态负载均衡

  • rr(round robin,轮询 )

轮询是最简单的负载均衡方法,按照预定的顺序,轮流将请求分配给后端服务器。

  • wrr(weight round robin,加权轮询)

类似于轮询,但是每个后端服务器可以设置一个权重,表示其处理能力。权重高的服务器将接收更多的请求。

  • sh(source hashing,源地址散列算法(HASH))

根据请求的源IP地址,通过散列函数计算出一个槽位,将请求分发到对应的服务器。

  • dh(destination hashing,目标地址 HASH)

与源地址散列算法相反,是根据请求的目标IP地址来进行散列分发的。

5.2、动态负载均衡

  • lc(leash-connection,最少连接 )

简单算法:active * 256 + inactive (谁的小选谁)

哪个服务器当前的活跃连接数最少,就将新的请求分配给它。

  • wlc(加权最少连接)

简单算法:(active * 256 + inactive) / weight(谁的小选谁)

谁的结果最小,就分配给谁。

  • sed(最少期望延迟)

简单算法:(active + 1) * 256 / weight (谁的小选谁)

  • nq(never queue,永不排队)

当没有服务器处于过载状态时,请求直接发送到空闲服务器。一旦服务器达到其容量限制,新的请求将被拒绝。

  • LBLC(基于局部性的最少连接 )

不仅考虑全局的服务器负载,还考虑服务器所在局部的负载情况,从而实现更细致的负载均衡。

  • LBLCR(基于局部性的带复制功能的最少连接)

在LBLC的基础上,当某个服务器过载时,可以选择复制流量到其他服务器,以平衡负载。

二、三种LVS工作模式详解

1、基于NAT的LVS模式负载均衡

NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外王,以及外部用户可以访问位于公司内部的私有的ip主机。

LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。

1.1、工作原理

  • 当用户的请求到达调度器时,请求报文会先到内核空间的PREROUTING链上。此时报文的源IP为CIP,目标IP为VIP

  • PREROUTING检查发现数据包的目标IP是本机,就将数据包送至INPUT链。

  • IPVS工作在INPUT链上,当数据包抵达INPUT链后,IPVS会检查数据包所请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器RIP,然后将数据包送往 POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP。

  • POSTROUTING链通过选路,将数据包转发给Real Server

  • Real Server对比发现目标IP是自己,就会接受这个请求报文,开始构建响应报文发回给调度器。源IP为RIP,目标IP为CIP

  • 调度器在响应客户端前,会将报文的源IP地址修改为自己的VIP,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP

1.2、LVS-NAT模型的特性

  • RS应该使用私有地址,RS的网关必须指向DIP

  • DIP和RIP必须要在同一网段中

  • 请求报文和响应报文都需要经过调度器,高负载场景中,调度器容易成为性能瓶颈。

  • 支持端口映射

  • RS可以使用任意操作系统

1.3、NAT的优点

集群中的物理服务器可以使用任何支持TCP/IP操作系统它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。

1.4、NAT的缺点

伸缩能力有限,当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。

2、基于TUN的LVS负载均衡

IP 隧道:IP Tunnel,简称:TUN 模式,采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。

2.1、实现原理

  • 在原有的ip报文外在封装多一层的ip首部,内部ip首部(原地址为cip,目标ip为vip),外层ip首部原地址为dip,.目标地址为rip

  • 客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。

  • 进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。

  • 到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。

  • 数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。

  • 后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。

2.2、TUN 模式的优点

  • 单臂模式,LVS 负载压力小。

  • 数据包修改小,信息完整性高。

  • 可跨机房。

2.3、TUN 模式的缺点

  • 不支持端口映射。

  • 需在 RS 后端服务器安装模块(ipip)及配置 VIP。

  • 隧道头部 IP 地址固定,RS 后端服务器网卡可能会不均匀。

  • 隧道头部的加入可能会导致分片,最终会影响服务器性能。

2.4、TUN 模式的使用场景

如对转发性要求较高且具有跨机房需求的,可选择 TUN 模式。

3、LVS(DR)负载均衡

直接路由:Direct Routing,简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各个地方,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。它是最常用的工作模式,因为它的功能性强大。

3.1、DR 实现原理

  • 当客户端用户发送请求给 www.baidu.com 网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过网络到百度 LVS 负载均衡服务器。

  • 这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。

  • 数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。

  • 数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务。

  • 如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。

  • 数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。

  • 数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。

  • 此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。

3.2、DR 模式的优点

  • 响应数据不经过 LVS,性能高。

  • 对数据包修改小,信息完整性好。

3.3、DR 模式的缺点

  • LVS 与 RS 必须在同一个物理网络。

  • RS 上必须配置 lo 和其他内核参数。

  • 不支持端口映射。

3.4、DR 模式的使用场景

对性能要求高的,可首选 DR 模式,还可透传客户端源 IP 地址。

三、IPVS模块概述

1、IPVS的介绍

IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查看报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS不用检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。

2、IPVS的工作原理

IPVS是LVS的关键,因为LVS的IP负载平衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。

LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块(工作在Netfilter框架的input链上),其实LVS的功能都是IPVS模块实现的,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块。

3、ipvsadm命令

 ipvsadm -A|E -t|u|f service-address:port [-s scheduler] [-p [timeout]] [-M netmask]ipvsadm -D -t|u|f service-addressipvsadm -Cipvsadm -Ripvsadm -S [-n]ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]ipvsadm -d -t|u|f service-address -r server-addressipvsadm -L|l [options]ipvsadm -Z [-t|u|f service-address]ipvsadm --set tcp tcpfin udpipvsadm --start-daemon state [--mcast-interface interface]ipvsadm --stop-daemonipvsadm -h​#集群服务相关选项:ipvsadm -A -t|u|f service-address:port [-s scheduler] [-p [timeout]] [-M netmask]    ###添加一个集群服务-t :tcp-u:udp-f :firewall make  #防火墙标记(通常应用于将两个或以上的服务绑定为一个服务进行处理时使用)service-address     #集群服务的ip地址,Vip-s  :                        #调度算法,默认为wlc-p                          #持久连接ipvsadm -E -t|u|f service-address:port  [-s scheduler] [-p [timeout]] [-M netmask]    ###修改定义过的集群​ipvsadm -D -t|u|f service-address            ###删除指定的集群服务​#RS相关选项:ipvsadm -a  -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]  ###添加RS-t :tcp-u:udp-f :firewall make  #防火墙标记(通常应用于将两个或以上的服务绑定为一个服务进行处理时使用)service-address     #集群服务的ip地址Vip,向那个集群里添加RS-r  :                        #RS的Rip,在支持端口映射的模型里可以使用额外端口-g                          #使用LVS-DR模型-i                           #使用LVS-TUN模型-m                        #使用LVS-NAT模型-w:                        #指定RS的权重ipvsadm -a  -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]  ###修改定义过的RS​ipvsadm -d -t|u|f service-address -r server-address   ###在指定的集群服务中删除一个指定的RS​#其他相关选项:ipvsadm -C         ###清空所有的集群服务​ipvsadm -R   |   ipvsadmin-restore        ###载入默认文件里的规则或使用输入重定向载入任意规则文件​ipvsadm -S   |    ipvsadm-save  >  #保持规则到默认文件或使用输出重定向至任意文件中​ipvsadm -Z [-t|u|f service-address]       ###虚拟服务表计数器清零(清空当前的连接数量等)​ipvsadm --set tcp tcpfin udp                ###设置连接超时值​ipvsadm --start-daemon state [--mcast-interface interface]    ###启动同步守护进程,它后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能​ipvsadm --stop-daemon      ###停止同步守护进程​ipvsadm -h                          ###显示帮助信息​#查看ipvs规则的相关选项:ipvsadm -L|l [options][options]:-n            ###使用数字格式显示IP地址,不反解-c            ###查看连接数相关信息--stats     ###显示统计数据--rate      ###数据传输速率--timeout   ###显示tcp,udp会话超时时长--daemon   ###显示同步守护进程的信息--sort      ###对虚拟服务进行排序,默认为升序--exact    ###精确显示,不做单位换算

3.1、常见选项

选项作用
-A添加虚拟服务节点
-D删除虚拟服务节点
-L查看虚拟服务节点列表
-n以数字形式显示查看内容
-a添加真实服务节点
-d删除真实服务节点
-l查看真实服务节点列表
-t指定虚拟服务器IP地址
-s指定调度算法
-r指定真实服务器节点IP地址
-w指定权重值
-g直接路由模式(默认)
-mNAT模式
-i隧道模式

3.2、配置案例

LVS的NAT模式实现负载均衡

实现双节点:

初始化部署

[root@web1 ~]# yum install -y nginx
###三台虚拟机分别下载LVS插件
[root@lvs ~]# yum install -y ipvsadm###第二台虚拟机web1、第三台虚拟机web2下载Nginx
[root@web1 ~]# yum install -y nginx###切换到第一台虚拟机lvs查看信息还未进行定义
[root@lvs ~]# modprobe ip_vs
[root@lvs ~]# lsmod | grep ip_vs
ip_vs                 229376  0
nf_conntrack          212992  3 nf_nat,nft_ct,ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              12288  4 nf_conntrack,nf_nat,nf_tables,ip_vs
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn###三台虚拟机分别关闭防火墙和安全上下文
[root@lvs ~]# systemctl disable --now firewalld
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
[root@lvs ~]# setenforce 0
[root@lvs ~]# getenforce
Permissive

 打开VMware将三台虚拟机的网络连接到VMnet1

第一台虚拟机配置静态网络

[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

第一台虚拟机修改配置文件加载路由功能

[root@lvs ~]# vim /etc/sysctl.conf

第一台虚拟机开启路由功能 

[root@lvs ~]# sysctl -p

 

第一台虚拟机将地址生效

第一台虚拟机再添加一块网卡

第一台虚拟机第二块网卡设置静态网

[root@lvs ~]# cd /etc/sysconfig/network-scripts/
[root@lvs ~]# cp ifcfg-ens33 ifcfg-ens36
[root@lvs ~]# vim ifcfg-ens36

第一台虚拟机将第二块网卡地址生效 

第二台虚拟机设置为web1

web1配置静态网络

将网卡生效,测试第一台虚拟机路由功能是否正常开启

第三台主机设置为web2

web2配置静态网络

将网卡生效,测试第一台虚拟机路由功能是否正常开启

切换回本地windows主机修改IPv4 IP地址

切换到web1、web2主机启动nginx

[root@web1 ~]# systemctl start nginx
[root@web2 ~]# systemctl start nginx

web1输入内容到index.html文件中

[root@web1 ~]# echo web1 > /usr/share/nginx/html/index.html 

web2输入内容到index.html文件

[root@web2 ~]# echo web2 > /usr/share/nginx/html/index.html

切换到lvs使用curl命令测试web1和web2后端服务器响应以及负载均衡是否正常工作

[root@lvs ~]# curl 192.168.100.1
web1
[root@lvs ~]# curl 192.168.100.2
web2

在lvs主机配置负载均衡集群

###创建虚拟服务(VIP)
[root@lvs ~]# ipvsadm -A -t 192.168.72.100:80 -s rr###检查当前规则​
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.72.100:80 rr###添加后端服务器(Real Server)​
[root@lvs ~]# ipvsadm -a -t 192.168.72.100:80 -r 192.168.100.1:80 -m
[root@lvs ~]# ipvsadm -a -t 192.168.72.100:80 -r 192.168.100.2:80 -m###检查当前规则
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.72.100:80 rr-> 192.168.100.1:80             Masq    1      0          0         -> 192.168.100.2:80             Masq    1      0          0   

打开火狐浏览器访问192.168.72.100web站点,Ctrl键+F5键深度刷新查看到web1和web2主机中index.html文件内容进行了切换,以上验证流量分发正常!

LVS的DR模式实现负载均衡

初始化部署

lvs主机移除nat网卡

lvs主机关闭路由功能

[root@lvs ~]# vim /etc/sysctl.conf 

[root@lvs ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

修改lvs主机配置文件调整ARP参数

[root@lvs ~]# vim /etc/sysctl.conf 

[root@lvs ~]# !sys
sysctl -p
net.ipv4.conf.ens33.send_redirects = 0
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

配置虚拟IP地址

[root@lvs ~]# ifconfig ens33:0 192.168.100.101/24
[root@lvs ~]# 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 noprefixroute valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:c2:74:d2 brd ff:ff:ff:ff:ff:ffinet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.72.101/24 brd 192.168.72.255 scope global ens33:0valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fec2:74d2/64 scope link noprefixroute valid_lft forever preferred_lft forever###ipvsadm服务设置开机自启
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl enable --now ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.

 配置负载均衡集群

[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn###创建虚拟服务(VIP)​
[root@lvs ~]# ipvsadm -A -t 192.168.100.101:80 -s rr###添加后端服务器(Real Server)
[root@lvs ~]# ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.1:80
[root@lvs ~]# ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.2:80[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.101:80 rr-> 192.168.100.1:80             Route   1      0          0         -> 192.168.100.2:80             Route   1      0          0         ###规则保存到文件,重启后自动加载
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.100.101:http -s rr
-a -t 192.168.100.101:http -r 192.168.100.1:http -g -w 1
-a -t 192.168.100.101:http -r 192.168.100.2:http -g -w 1

 web节点配置:

切换到web1主机调整ARP参数

[root@web1 ~]# vim /etc/sysctl.conf 
###添加以下六条内容
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.default.arp_ignore=1 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce=2

[root@web1 ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

 切换到web2主机调整ARP参数

[root@web2 ~]# vim /etc/sysctl.conf 
###添加以下六条内容
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.default.arp_ignore=1 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce=2

[root@web2 ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

切换到web1主机配置虚拟IP地址

[root@web1 ~]# ifconfig lo:0 192.168.100.101/32
[root@web1 ~]# 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 foreverinet 192.168.100.101/0 scope global lo:0valid_lft forever preferred_lft foreverinet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:b0:07:74 brd ff:ff:ff:ff:ff:ffinet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feb0:774/64 scope link noprefixroute valid_lft forever preferred_lft forever

 切换到web2主机配置虚拟IP地址

[root@web2 ~]# ifconfig lo:0 192.168.100.101/32
[root@web2 ~]# 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 foreverinet 192.168.100.101/0 scope global lo:0valid_lft forever preferred_lft foreverinet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:59:8d:4f brd ff:ff:ff:ff:ff:ffinet 192.168.100.2/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe59:8d4f/64 scope link noprefixroute valid_lft forever preferred_lft forever

web1、web2分别主机添加回环路由  

[root@web1 ~]# route add -host 192.168.100.101/32 dev lo:0
[root@web2 ~]# route add -host 192.168.100.101/32 dev lo:0

打开火狐浏览器访问192.168.100.101web站点,Ctrl键+F5键深度刷新查看到web1和web2主机中index.html文件内容进行了切换,以上验证流量分发正常!

LVS的TUN模式实现负载均衡

lvs主机添加一块新网卡

配置静态IP192.168.72.100

lvs主机加载隧道模块

[root@lvs ~]# modprobe ipip
[root@lvs ~]# 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 noprefixroute valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:c2:74:d2 brd ff:ff:ff:ff:ff:ffinet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fec2:74d2/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:c2:74:dc brd ff:ff:ff:ff:ff:ffinet 192.168.72.100/24 brd 192.168.72.255 scope global noprefixroute ens36valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fec2:74dc/64 scope link noprefixroute valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0

为隧道网卡临时添加IP

[root@lvs ~]# ip addr add 192.168.72.102/24 dev tunl0
[root@lvs ~]# 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 noprefixroute valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:c2:74:d2 brd ff:ff:ff:ff:ff:ffinet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fec2:74d2/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:c2:74:dc brd ff:ff:ff:ff:ff:ffinet 192.168.72.100/24 brd 192.168.72.255 scope global noprefixroute ens36valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fec2:74dc/64 scope link noprefixroute valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0inet 192.168.72.102/24 scope global tunl0valid_lft forever preferred_lft forever###使网卡生效
[root@lvs ~]# ip link set up tunl0

lvs主机开启路由转发功能

[root@lvs ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@lvs ~]# sysctl -p

lvs主机配置负载均衡集群,在隧道模式里面添加策略

###设置轮询调度
[root@lvs ~]# ipvsadm -A -t 192.168.72.102:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.72.102:80 -r 192.168.100.1:80 -i
[root@lvs ~]# ipvsadm -a -t 192.168.72.102:80 -r 192.168.100.2:80 -i
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.72.102:80 rr-> 192.168.100.1:80             Tunnel  1      0          0         -> 192.168.100.2:80             Tunnel  1      0          0         ###保存策略
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm

web1服务器配置

[root@web1 ~]# modprobe ipip
[root@web1 ~]# ip addr add 192.168.72.102/24 dev tunl0
[root@web1 ~]# ip link set up tunl0 
[root@web1 ~]# 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 proto kernel_lo valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:b0:07:74 brd ff:ff:ff:ff:ff:ffinet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:feb0:774/64 scope link noprefixroute valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0inet 192.168.72.102/24 scope global tunl0valid_lft forever preferred_lft forever

 web2服务器配置

[root@web2 ~]# modprobe ipip
[root@web2 ~]# ip addr add 192.168.72.102/24 dev tunl0
[root@web2 ~]# ip link set up tunl0 
[root@web2 ~]# 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 proto kernel_lo valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:59:8d:4f brd ff:ff:ff:ff:ff:ffinet 192.168.100.2/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe59:8d4f/64 scope link noprefixroute valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0inet 192.168.72.102/24 scope global tunl0valid_lft forever preferred_lft forever

同上打开火狐浏览器访问192.168.72.102web站点进行验证! 

总结: 

        LVS负载均衡集群通过将多台服务器虚拟化为单一高性能服务入口,结合NAT、DR或TUN等转发模式,以较低的资源开销实现了流量的高效分发。其模块化设计、丰富的调度算法(如RR、WRR、LC等)以及对高可用架构(如Keepalived)的兼容性,使其成为大规模服务部署的理想选择。未来,随着云计算和微服务架构的普及,LVS在容器化与混合云环境中的优化适配,将进一步拓展其技术边界,持续为分布式系统的高性能与高可靠保驾护航。

http://www.dtcms.com/a/277146.html

相关文章:

  • 论文笔记:AnImitation Learning Approach for Cache Replacement
  • iOS高级开发工程师面试——架构设计
  • MailSpring
  • [Subtitle Edit] 语言文件管理.xml | 测试框架(VSTest) | 构建流程(MSBuild) | AppVeyor(CI/CD)
  • 006_测试评估与安全实践
  • 设计模式之工厂模式:对象创建的智慧之道
  • 设计模式-门面模式
  • CAU数据挖掘第四章 分类问题
  • 【论文阅读47】-微震事件的时间、空间和强度(能量)预测
  • Java设计模式之行为型模式(命令模式)
  • 单例模式:确保全局唯一实例
  • 第三章-提示词-探秘大语言基础模型:认知、分类与前沿洞察(9/36)
  • 数据结构 Map和Set
  • 代理模式:控制对象访问
  • 小车避障功能的实现(第七天)
  • 使用微信免费的图像处理接口,来开发图片智能裁剪和二维码/条码识别功能,爽歪歪
  • Typecho分类导航栏开发指南:从基础到高级实现
  • 【零基础入门unity游戏开发——unity3D篇】光照探针 (Light Probes)实现动态物体的间接光照
  • python爬取新浪财经网站上行业板块股票信息的代码
  • Java 大视界 -- Java 大数据在智能教育学习资源智能分类与标签优化中的应用(346)
  • Pytorch实现感知器并实现分类动画
  • Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)
  • MacOS使用Multipass快速搭建轻量级k3s集群
  • 在Intel Mac的PyCharm中设置‘add bin folder to the path‘的解决方案
  • COZE token刷新
  • mac上BRPC的CMakeLists.txt优化:解决Protobuf路径问题
  • composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
  • 数据结构1:线性表的顺序存储的定义以及基本操作
  • [Linux 入门] Linux 引导过程、系统管理与故障处理全解析
  • Python 数据建模与分析项目实战预备 Day 4 - EDA(探索性数据分析)与可视化