一文读懂“负载均衡”

负载均衡无处不在,无论是分布式,还是中间件,还是微服务,都需要涉及到负载均衡。

一、什么是负载均衡

负载均衡是一种在计算机网络和系统架构中使用的技术,用于均衡分发工作负载到多个资源,比如:服务器、计算节点或存储设备上,以提高系统的性能、可伸缩性。 如下图所示: 在传统的单个服务器架构中,当请求量增加时,单个服务器可能无法处理所有的请求,导致性能下降或系统崩溃。 负载均衡技术通过将负载(请求)分发到多个服务器上,实现资源的合理利用,从而平衡服务器的负载。 这样可以提高系统的处理能力,增加并发处理能力,并减少单点故障的风险。

二、负载均衡作用

负载均衡的作用,主要包含如下几点:

1.提高系统性能

负载均衡技术将负载(请求或任务)分发到多个资源上,使得系统能够处理更多的并发请求,从而提高整体的处理能力和性能。

2.实现高可用性

负载均衡可以将负载分发到多个资源上,当其中一个资源发生故障或不可用时,负载均衡可以自动将请求转发到其他可用的资源。 这样可以降低单点故障的风险,提高系统的可靠性和容错性。

3.提高系统可伸缩性

随着业务的增长,负载均衡技术可以动态地增加或减少资源的数量,根据实际负载情况进行扩展或收缩。 通过自动分配负载到新增的资源上,系统可以实现水平扩展,满足不断增长的需求,提高系统的可伸缩性。

4.优化资源利用

负载均衡技术可以根据资源的性能、可用性和负载情况,合理地分配请求或任务。 这样可以最大限度地利用资源,避免资源的空闲或过载,提高资源的利用率和效率。

三、负载均衡的原理

系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。 比如:纵向扩展,是从单机的角度通过增加硬件处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升。这种情况,不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题。 因此需要采用横向扩展的方式,通过添加机器来满足大型网站服务的处理能力,比如:一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。 如下图所示: 负载均衡器作为一个中间层,接收来自客户端的请求,并根据特定的算法和策略将请求分发给后端的多个资源(如服务器、计算节点或存储设备)。客户端可以直接将请求发送给负载均衡器,或通过域名解析、DNS等方式间接连接到负载均衡器。

四、负载均衡算法

负载均衡算法,主要分为如下5类:

1.Round Robin-轮询

轮询,顾名思义,把请求按顺序分配给每个服务器,然后重复执行这个顺序,进行请求分配。 假设有3台服务器,分别为A,B,C,当客户端有请求过来时,请求会按照A------>B------>C------>A------>B------>C...这种轮训的顺序分配给各个服务器。 原理:

  • 服务器列表:维护一个服务器列表,有服务器加入/剔除时,相应的更新服务器列表;
  • 服务器游标:记录需要处理下一个请求的服务器;
  • 请求分发:新的请求到达,选择当前服务器来处理该请求,然后服务器游标+1;
  • 循环:不断重复步骤三,以确保每个服务器都有机会处理请求;
2.Weighted Round Robin - 加权轮询

在轮询的基础上根据硬件配置不同,按权重分发到不同的服务器,适合场景:跟配置高、负载低的机器分配更高的权重,使其能处理更多的请求。

3.最少连接数

记录每个服务器正在处理的请求数,把新的请求分发到最少连接的服务器上,因为要维护内部状态不推荐。

原理
  • 维护一个所有服务器和连接数的字典(Map);
  • 当新的请求到达时,负载均衡器会检查服务器列表中当前连接数最少的服务器;
  • 请求将被分配给具有最少连接数的服务器,处理请求后该服务器的连接数+1;
  • 如果有多台服务器具有相同的最小连接数,算法可以使用其他标准来选择其中一台,如加权等
优缺点

优点:

  • 动态负载均衡:它根据服务器的当前负载情况来做出决策,这使得它能够有效地分配请求给当前连接数最少的服务器,从而确保了服务器资源的最佳利用。
  • 适应性强:这个算法适用于服务器性能不均匀的情况,因为它关注的是连接数,而不是服务器的硬件配置或性能评估。
  • 避免过载:通过将新请求分配给连接数最少的服务器,"最小连接数"算法有助于防止某些服务器被过度加载,从而提高了系统的稳定性和性能。
  • 自动恢复:如果某台服务器由于故障或重启而导致连接数清零,该算法会自动开始将新请求分配给该服务器,以实现自动恢复。

缺点:

  • 连接数不一定代表负载:"最小连接数"算法假设连接数与服务器的负载成正比,但这并不总是准确。有时候,某台服务器的连接数可能很高,但仍然能够处理更多的请求,而另一台连接数较低的服务器可能已经达到了其性能极限。
  • 不适用于长连接:如果服务器上有大量长期活跃的连接,例如WebSocket连接,该算法可能不太适用,因为长连接不同于短暂的HTTP请求,连接数的统计可能会产生误导。
  • 无法解决服务器性能差异:虽然"最小连接数"算法可以平衡连接数,但它无法解决服务器硬件性能差异的问题。在这种情况下,可能需要其他负载均衡算法,如加权轮询,来更好地适应性能差异。
4.IP/URL Hash-IP/URL散列

IP/URL 散列算法是一种根据客户端 IP 地址或 URL 来分配请求的负载均衡算法,这样相同的IP或者URL就会负载到相同的服务器上。

原理
  • 将客户端 IP 地址或 URL 散列到服务器列表中,
  • 然后将请求分配给散列值对应的服务器。
优缺点

优点:

  • 稳定性:IP/URL Hash 算法可以确保相同的客户端请求总是被分发到相同的服务器上。这可以提高应用程序的稳定性,因为客户端的会话数据在同一服务器上保持一致。
  • 适用于会话保持:当应用程序需要在多次请求之间保持会话状态时,IP/URL Hash 算法非常有用。客户端在一次请求中选择的服务器会在后续请求中保持一致,确保会话数据不会丢失。
  • 负载均衡:IP/URL Hash 算法可以将特定的客户端请求均匀地分配到多个服务器上,从而实现基本的负载均衡,避免了某些服务器被过度请求。

缺点:

  • 不适用于动态环境:IP/URL Hash 算法基于客户端的 IP 地址或 URL,一旦客户端 IP 或请求的 URL 发生变化,请求可能会被分配到不同的服务器上,导致会话数据丢失或不一致。
  • 不考虑服务器负载:IP/URL Hash 算法不考虑服务器的当前负载情况。如果某个服务器的负载过高,IP/URL Hash 无法动态地将请求分发到负载较低的服务器上。
适用场景

静态环境:在静态环境中,即客户端的 IP 地址或请求的 URL 不经常变化的情况下,IP/URL Hash 算法可以提供稳定的负载均衡。 少数服务器的负载均衡:当服务器数量相对较少且不太容易动态扩展时,IP/URL Hash 算法可以用于基本的负载均衡。

5.Least Response Time - 最短响应时间

最短响应时间就是指:处理请求的响应时间最少的服务器,获取的请求就越多。直白讲就是速度快,就干的多。

适用场景

负载均衡的所有服务器,处理能力相差比较大。比如:有3台服务器,服务器A(4C8G,4个CPU,8G内存),服务器B(2C4G,2个CPU,4G内存),服务器C(1C2G,1个CPU,2G内存), 那么就可以采用这种算法,这样可以根据服务器的处理来实现动态负载。 交通控制系统:在城市交通控制系统中,需要及时响应交通信号、路况和车辆检测等信息。最短响应时间算法可以帮助确保交通信号及时适应交通流量的变化。

优缺点

优点:可以充分发挥各个服务器的性能,提高服务器的利用率。 缺点:饥饿问题。比如,服务器A的性能最好,处理速度最快,那么所有的请求都会被分配到服务器A,这样服务器B和服务器C就会一直处于饥饿状态,无法处理请求。这样也就会产生不公平。

五、负载均衡的分类

负载均衡主要分为:二层、三层、四层、以及七层负载均衡。

1.二层负载均衡(mac)

根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应)。

2.三层负载均衡(ip)

一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应。

3.四层负载均衡(tcp)

四层负载均衡就是基于IP 端口的负载均衡,在三次负载均衡的基础上,用ip port接收请求,再转发到对应机器。 实现四层负载均衡的软件有:

  • F5:硬件负载均衡器,功能很好,但是成本很高。
  • lvs:重量级的四层负载软件
  • nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
  • haproxy:模拟四层转发,较灵活
4.七层负载均衡(http)

七层的负载均衡,就是基于虚拟的URL或主机IP的负载均衡,根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。 实现七层负载均衡的软件有:

  • haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
  • nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
  • apache:功能较差
  • Mysql proxy:功能尚可。

总的来说,一般是lvs做4层负载;nginx做7层负载。

六、负载均衡应用场景

负载均衡技术可以应用于多种场景,包括但不限于以下几个方面:

1.Web应用负载均衡

在Web应用中,负载均衡可以将请求分发到多个Web服务器上,以提高并发处理能力和吞吐量,适用于高访问量的网站、电子商务平台等场景。

2.数据库负载均衡

对于数据库集群,负载均衡可以将数据库请求分发到多个数据库节点上,实现数据的分布和负载的均衡,这有助于提高数据库的处理能力、可靠性和可伸缩性。

3.应用服务负载均衡

在分布式应用中,负载均衡可以将请求分发给多个应用服务器实例,以平衡工作负载和提高系统的性能,这适用于微服务架构、分布式计算、消息队列等场景。

4.高性能计算负载均衡

在科学计算、大数据处理和高性能计算领域,负载均衡技术可以将计算任务分发到多个计算节点上,实现任务的并行处理和加速,它适用于集群计算、分布式存储、数据分析等场景。

相关推荐
2301_787328499 小时前
25.负载均衡-Nginx、HAProxy、LVS 全解析
nginx·负载均衡·lvs
siriuuus9 小时前
Nginx 负载均衡调度算法
运维·nginx·负载均衡
川石课堂软件测试12 小时前
全链路Controller压测负载均衡
android·运维·开发语言·python·mysql·adb·负载均衡
舰长11518 小时前
nginx 负载均衡配置
运维·nginx·负载均衡
hzylyh3 天前
【Java实现单例模式的五种方式及其优缺点分析】
负载均衡
Vio7253 天前
Ribbon负载均衡
spring cloud·ribbon·负载均衡
zrande4 天前
Nginx 负载均衡通用方案
nginx·负载均衡
维尔切6 天前
Nginx 反向代理与负载均衡
运维·nginx·负载均衡
知白守黑2676 天前
反向代理和负载均衡
运维·负载均衡
vadvascascass6 天前
平滑加权轮询负载均衡的底层逻辑
java·算法·负载均衡