负载均衡算法概述

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 负载均衡算法概述

我们查询注册中心获得了某个服务的可用节点列表,我们需要从可用节点列表中选择一个发起调用,这就是负载均衡的所用了。

需要考虑两个因素,⼀个是要考虑调⽤的均匀性,也就是要让每个节点都接收到调⽤,发挥所有节点的作⽤,另⼀个是要考虑调⽤的性能,也就是哪个节点响应最快,优先调⽤哪个节点。

常见的负载均衡算法

随机算法(伪随机)

随机算法,顾名思义就是从可⽤的服务节点中,随机挑选⼀个节点来访问。

在实现时,随机算法通常是通过⽣成⼀个随机数来实现,⽐如服务有10个节点,那么就每⼀次⽣成⼀个1~10之间的随机数, 假设⽣成的是2,那么就访问编号为2的节点。

采⽤随机算法,在节点数量⾜够多,并且访问量⽐较⼤的情况下,各个节点被访问的概率是基本相同的。

改算法的核心就是获取一个不超过服务节点列表大小的随机整数。

int idx = (int) (ThreadLocalRandom.current().nextDouble() * servicesList.size());
如何实现真随机

霍金有句名言:“谁跟我提薛定谔的猫,我就去拿我的枪”。因为在我们的宏观世界中薛定谔的猫其实是一个很荒谬的真理,这只猫既是活着的又是死的,在没有开箱之前,一切都是不确定的,同时,我觉得这才是真随机,不同于计算机中的随机数生成,因为大多数语言的随机数生成是基于时钟的,例如c中的srand就是与计算机目前的时刻与1970年1月1日0时0分0秒之间的时间差有关。

假如说我对于时间的掌控足够强大,我就可以在某个特定时刻发起调用,这样使用随机调用的负载均衡算法到底调用了哪个节点,当然就在我的掌控之中了。

所以说在我们的宏观世界,一切所谓的随机都是不存在的,拉普拉斯妖可以根据现有的状态得到我们所谓的随机值。

那么在微观世界呢? 记得在高中物理中,我们学到过光的波粒二象性,光既是波又是粒子,仔细一想,细思极恐,你既是男人又是女人,没有验身之前你有男女太监三种状态,就好像薛定谔的猫,没有开箱前有死活两种状态。这是爱因斯坦发现的,记得课本上说的是使用了双缝实验。在探测仪观察的情况下光是粒子,只通过单缝,在没观察的情况下是波,通过双缝。至于粒子到底通过哪一夹缝,这才是真正的随机。

对于物理学家来说,这种量子随机性是宇宙唯一的随机性,是物理定律不能预测的结果。

建议各位妄图调度方便而使用随机算法的人,先去搞一个光子发射设备,放在计算机里面用来实现随机算法。

轮询算法

轮询算法,顾名思义就是按照固定的顺序,把可⽤的服务节点,挨个访问⼀次。

在实现时,轮询算法通常是把所有可⽤节点放到⼀个数组⾥,然后按照数组编号,挨个访问。

⽐如服务有10个节点,放到数组⾥就是⼀个大小为10的数组,这样的话就可以从序号为0的节点开始访问,访问后序号⾃动加1,下⼀次就会访问序号为1的 节点,以此类推。

轮询算法能够保证所有节点被访问到的概率是相同的。

当然,在我们现实生活中,可能我们不同服务节点的性能不同,我们需要根据其能力进行调度。

加权轮询算法

轮询算法能够保证所有节点被访问的概率相同,⽽加权轮询算法是在此基础上,给每个节点赋予⼀个权重,从⽽使每个节点被访问到的概率不同,权重⼤的节点被访问的概率就⾼,权重⼩的节点被访问的概率就⼩。

在实现时,加权轮询算法是⽣成⼀个节点序列,该序列⾥有n个节点,n是所有节点的权重之和。

在这个序列中,每个节点出现的次数,就是它的权重值。⽐如有三个节点:a、b、c,权重分别是3、2、1,那么⽣成的序列就是{a、a、b、c、b、a}, 这样的话按照这个序列访问,前6次请求就会分别访问节点a三次,节点b两次,节点c⼀次。从第7个请求开始,⼜重新按照这个序列的顺序来访问节点。

在应⽤加权轮询算法的时候,要尽可能保证⽣产的序列的均匀,如果⽣成的不均匀会造成节点访问失衡,⽐如刚才的例⼦,如果⽣成的序列是{a、a、a、b、b、c},就会导致前3次访问的节点都是a。

最少活跃连接算法

最少活跃连接算法,顾名思义就是每⼀次访问都选择连接数最少的节点。

因为不同节点处理请求的速度不同,使得同⼀个服务消费者同每⼀个节点的连接数都不相同。

连接数⼤的节点,可以认为是处理请求慢,⽽连接数小的节点,可以认为是处理请求快。所以在挑选节点时,可以以连接数为依据,选择连接数最少的节点访问。

在实现时,需要记录跟每⼀个节点的连接数,这样在选择节点时,才能⽐较出连接数最⼩的节点。

⼀致性hash算法

⼀致性hash算法,是通过某个hash函数,把同⼀个来源的请求都映射到同⼀个节点上。⼀致性hash算法最⼤的特点就是同⼀个来源的请求,只会映射到同⼀个节点上,可以说是具有记忆功能。只有当这个节点不可⽤时,请求才会被分配到相邻的可⽤节点上。

总结

上面五种负载均衡算法分别可以应用在不同的场景,最近正好在写Zeus的负载均衡策略,考虑之后决定使用改造后的加权轮询算法,在每一个client中会有一个定时任务,去获取所有节点的近期访问的性能统计,根据性能快慢,把服务节点按照二八分为20%慢节点80快节点,动态调整权重。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
11天前
|
存储 负载均衡 算法
负载均衡算法
负载均衡算法
18 1
|
24天前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
112 59
|
3月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
17天前
|
负载均衡 算法 应用服务中间件
5大负载均衡算法及原理,图解易懂!
本文详细介绍负载均衡的5大核心算法:轮询、加权轮询、随机、最少连接和源地址散列,帮助你深入理解分布式架构中的关键技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5大负载均衡算法及原理,图解易懂!
|
16天前
|
负载均衡 算法
SLB-Backend的负载均衡算法
【10月更文挑战第19天】
34 5
|
20天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
22 3
|
1月前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
66 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
负载均衡 监控 算法
每个程序员都应该知道的 6 种负载均衡算法
每个程序员都应该知道的 6 种负载均衡算法
94 2