过载保护+异构服务器的负载均衡,怎么设计?

简介: 负载均衡是指,将请求/数据分摊到多个操作单元上执行,关键在于均衡。

负载均衡是指,将请求/数据分摊到多个操作单元上执行,关键在于均衡。

然而,后端的服务器有可能硬件条件不同:

  • 如果对标低配的服务器“均匀”分摊负载,高配的服务器利用率会不足
  • 如果对标高配的服务器“均匀”分摊负载,低配的服务器会扛不住

能否根据异构服务器的处理能力来动态、自适应进行负载均衡,以及过载保护呢?

负载均衡通常是怎么做的?

image.png
service层的负载均衡,一般是通过service连接池来实现的,调用方连接池会建立与下游服务多个连接,每次请求“随机”获取连接,来保证访问的均衡性。

负载均衡、故障转移、超时处理等细节也都是通过调用方连接池来实现的。

调用方连接池能否,根据service的处理能力,动态+自适应的进行负载调度呢?

方案一:可以通过“静态权重”标识service的处理能力。
image.png

最容易想到的方法,可以为每个下游service设置一个“权重”,代表service的处理能力,来调整访问到每个service的概率,如上图所示:

(1) 假设ip1,ip2,ip3的处理能力相同,可以设置weight1=1,weight2=1,weight3=1,这样三个service连接被获取到的概率分别就是1/3,1/3,1/3,能够保证均衡访问;

(2) 假设ip1的处理能力是ip2,ip3的处理能力的2倍,可以设置weight1=2,weight2=1,weight3=1,这样三个service连接被获取到的概率分别就是2/4,1/4,1/4,能够保证处理能力强的service分到等比的流量,不至于资源浪费;

Nginx就具备类似的能力。

方案优点:简单粗暴,能够快速的实现异构服务器的负载均衡。

方案缺点:权重是固定的,无法自适应动态调整,而很多时候,服务器的处理能力是很难用一个固定的数值量化。

方案二:通过“动态权重”标识service的处理能力。

如何来标识一个service的处理能力呢?

服务能不能处理得过来,该由调用方说了算:

调用服务,快速处理,处理能力跟得上

调用服务,处理超时,处理能力很有可能跟不上了

如何来设计动态权重?

可以这么玩:

(1) 用一个动态权重,来标识每个service的处理能力,默认初始处理能力相同,即分配给每个service的概率相等;

(2) 每当service成功处理一个请求,认为service处理能力足够,权重动态+1;

(3) 每当service超时处理一个请求,认为service处理能力可能要跟不上了,权重动态-10;

画外音:

  • 权重下降,会比权重上升更快。
  • 为了方便权重的处理,可以把权重的范围限定为[0, 100],把权重的初始值设为60分。

举例说明:

假设service-ip1,service-ip2,service-ip3的动态权重初始值:

  • weight1=60
  • weight2=60
  • weight3=60

刚开始时,请求分配给这3台service的概率分别是60/180,60/180,60/180,即负载是均衡的。

随着时间的推移:

  • 处理能力强的service成功处理的请求越来越多
  • 处理能力弱的service偶尔有超时

随着动态权重的增减,权重会发生变化:

  • weight1=100
  • weight2=60
  • weight3=40

那么此时,请求分配给这3台service的概率分别是100/200,60/200,40/200,即处理能力强的service会被分配到更多的流量。

那什么是过载保护?

image.png

如上图所示,如果没有过载保护:

  • 随着外部负载的不断升高,系统实际处理负载会增加
  • 外部负载升高到一个临界值,系统会被压垮,实际处理能力会降为0

画外音:这就是所谓的“掉底”。

过载保护,是指当外部负载超过系统处理能力时,系统会进行自我保护,依然能对外提供有损的稳定服务。

image.png

如上图所示,如果进行了过载保护:

随着外部负载的不断升高,系统实际处理负载会增加

外部负载即使超过一个临界值,系统不会被压垮,而能保持一定的处理能力

画外音:外部负载无限大,系统也不会“掉底”。

那如何进行过载保护?

方案一:可以通过“静态权重”标识service的处理能力。

这是最简易的方式,服务端设定一个负载阈值,超过这个阈值的请求压过来,全部抛弃。

画外音:这个方式不是特别优雅。

方案二:借助“动态权重”来实施过载保护。

如同异构服务器负载均衡,仍然通过:

成功处理加分(+1)

处理超时扣分(-10)

这种动态权重,来标识后端的处理能力。

画外音:仍然是在连接池层面实现的。

当一个服务端屡次处理超时,权重不断降低时,连接池只要实施一些策略,就能够对“疑似过载”的服务器进行降压,而不用服务器“抛弃请求”这么粗暴的实施过载保护。

应该实施什么样的策略,来对“疑似过载”的服务器进行降压保护呢?

可以这么玩:

(1) 如果某一个服务器,连续3个请求都超时,即连续-10分三次,就可以认为,服务器处理不过来了,得给这个服务器喘一小口气,于是设定策略:接下来的若干时间内,例如1秒,负载不再分配给这个服务器;

画外音:休息1秒后,再分给它。

(2) 如果某一个service的动态权重,降为了0(休息了3次还超时),就可以认为,服务器完全处理不过来了,得给这个服务器喘一大口气,于是设定策略:接下来的若干时间内,例如1分钟,请求不再分配给这个服务器;

画外音:根据经验,此时服务器一般在fullGC,差不多1分钟能回过神来。

这样的话,不但能借助“动态权重”来实施动态自适应的异构服务器负载均衡,还能在客户端层面更优雅的实施过载保护,在某个下游服务器快要响应不过来的时候,给其喘息的机会。

过载保护要注意什么问题?

要防止过载保护引起服务器的雪崩,如果“整体负载”已经超过了“服务器集群”的处理能力,怎么转移请求也是处理不过来的。这时,还是得通过抛弃请求来实施自我保护。

总结

负载均衡、故障转移、超时处理通常是连接池层面来实施的

异构服务器负载均衡,最简单的方式是静态权重法,缺点是无法自适应动态调整

动态权重法,可以动态的根据服务器的处理能力来分配负载,需要有连接池层面的微小改动

过载保护,是在负载过高时,服务器为了保护自己,保证一定处理能力的一种自救方式

动态权重法,还可以用做服务器的过载保护

image.png
架构师之路-分享可落地的技术文章

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
25天前
|
弹性计算 运维 监控
slb后端服务器组(Backend Server Group)关联
阿里云SLB的后端服务器组提供逻辑分组、精细化路由、端口隔离、权重分配与会话保持等功能,便于资源管理、流量控制和故障隔离。通过监听规则、健康检查、标签和API关联,实现灵活的后端资源配置,适应多变的业务需求,确保服务稳定性和资源利用率。
15 1
|
29天前
|
弹性计算 负载均衡 容灾
slb配置后端服务器组
配置阿里云SLB后端服务器组涉及四个主要步骤:创建服务器组、添加ECS实例、关联监听规则和设定负载均衡策略。这使得流量根据业务需求和服务器特性进行转发,便于应用架构的灵活管理和扩展,支持蓝绿部署、灰度发布,并通过多可用区提升系统可用性和容灾能力。
25 3
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(四)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(二)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(一)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(三)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
28天前
|
弹性计算 负载均衡
slb添加后端服务器
阿里云SLB服务用于流量分发,提升系统可用性和响应速度。添加ECS实例到SLB的步骤包括:登录控制台,选择“弹性计算”->“负载均衡”,找到目标SLB实例,进入详情页,点击“添加后端服务器”。挑选ECS实例,可按ID、名称或标签筛选,设置权重(默认100),并确保ECS实例状态正常,与SLB在同一地域,安全组允许SLB连接。添加后可考虑配置健康检查等高级选项。
14 1
|
28天前
|
弹性计算 负载均衡 网络安全
slb创建后端服务器组
在阿里云SLB服务中创建后端服务器组,需登录控制台,选择目标SLB实例,进入监听器设置,添加后端服务器。选择ECS实例或ENI,设定服务器端口和权重,然后保存设置。此操作将ECS实例纳入SLB的负载均衡与健康检查管理。
15 1
|
30天前
|
弹性计算 负载均衡
slb添加后端服务器
阿里云SLB服务实现流量分发,提升业务可用性和响应速度。添加后端服务器步骤包括:登录控制台,选择“弹性计算”->“负载均衡”,点击目标SLB实例进入详情,点击“后端服务器”->“添加ECS实例”。筛选并选择ECS实例,设置权重,确认后点击“确定”。添加后检查健康检查状态,确保ECS实例状态正常,同地域、可用区,并配置好安全组规则。
16 2
|
5月前
|
缓存 负载均衡 应用服务中间件
Nginx服务器之负载均衡策略(6种)
Nginx服务器之负载均衡策略(6种)
134 0