常见的负载均衡算法有哪些问答

常见的负载均衡算法有:1、轮询法RoundRobin,将请求按顺序轮流分配到后台服务器上,从而均衡的对待每一台服务器;2、随机法,通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问;3、源地址哈希法,主要是根据服务消费者请求客户端的IP地址实现;4、加权轮询法,将请求按照顺序且根据权重分配给后端;5、加权随机法,根据后台服务器不同的配置和负载情况,配置不同的权重;6、最小连接法,根据最小连接数的服务器来实现负载均衡。

负载均衡算法

在分布式系统中,多台服务器同时提供一个服务,并统一到服务配置中心进行管理,如下图所示。

消费者通过查询服务配置中心,获取到服务到地址列表,需要选取其中一台来发起RPC远程调用。如何选择,则取决于具体的负载均衡算法,对应于不同的场景,选择的负载均衡算法也不尽相同。负载均衡算法的种类有很多种,常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等,应根据具体的使用场景选取对应的算法。

1、轮询(RoundRobin)法

轮询很容易实现,将请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

这里通过实例化一个serviceWeightMap的Map变量来服务器地址和权重的映射,以此来模拟轮询算法的实现,其中设置的权重值在以后的加权算法中会使用到,这里先不做过多介绍,该变量初始化如下:

privatestaticMapserviceWeightMap=newHashMap();

static{

serviceWeightMap.put("192.168.1.100",1);

serviceWeightMap.put("192.168.1.101",1);
//权重为4

serviceWeightMap.put("192.168.1.102",4);

serviceWeightMap.put("192.168.1.103",1);

serviceWeightMap.put("192.168.1.104",1);
//权重为3

serviceWeightMap.put("192.168.1.105",3);

serviceWeightMap.put("192.168.1.106",1);
//权重为2

serviceWeightMap.put("192.168.1.107",2);

serviceWeightMap.put("192.168.1.108",1);

serviceWeightMap.put("192.168.1.109",1);

serviceWeightMap.put("192.168.1.110",1);

}通过该地址列表,实现的轮询算法的部分关键代码如下

privatestaticIntegerpos=0;

publicstaticStringtestRoundRobin(){

//重新创建一个map,避免出现由于服务器上线和下线导致的并发问题

MapserverMap=newHashMap();

serverMap.putAll(serviceWeightMap);

//取得IP地址list

SetkeySet=serverMap.keySet();

ArrayListkeyList=newArrayList();

keyList.addAll(keySet);

Stringserver=null;

synchronized(pos){

if(pos>keySet.size()){

pos=0;

}

server=keyList.get(pos);

pos++;

returnserver;

}由于serviceWeightMap中的地址列表是动态的,随时可能由机器上线、下线或者宕机,因此,为了避免可能出现的并发问题,比如数组越界,通过在方法内新建局部变量serverMap,先将域变量拷贝到线程本地,避免被其他线程修改。这样可能会引入新的问题,当被拷贝之后,serviceWeightMap的修改将无法被serverMap感知,也就是说,在这一轮的选择服务器中,新增服务器或者下线服务器,负载均衡算法中将无法获知。新增比较好处理,而当服务器下线或者宕机时,服务消费者将有可能访问不到不存在的地址。因此,在服务消费者服务端需要考虑该问题,并且进行相应的容错处理,比如重新发起一次调用。

对于当前轮询的位置变量pos,为了保证服务器选择的顺序性,需要对其在操作时加上synchronized锁,使得同一时刻只有一个线程能够修改pos的值,否则当pos变量被并发修改,将无法保证服务器选择的顺序性,甚至有可能导致keyList数组越界。

使用轮询策略的目的是,希望做到请求转移的绝对均衡,但付出的代价性能也是相当大的。为了保证pos变量的并发互斥,引入了重量级悲观锁synchronized,将会导致该轮询代码的并发吞吐量明显下降。

2、随机法

通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问。由概率概率统计理论可以得知,随着调用量的增大,其实际效果越来越接近于平均分配流量到后台的每一台服务器,也就是轮询法的效果。

随机算法的部分关键代码如下:

publicstaticStringtestRandom(){

Randomrandom=newRandom();

intrandomPos=random.nextInt(keyList.size());

Stringserver=keyList.get(randomPos);

}跟前面类似,为了避免并发的问题,需要将serviceWeightMap拷贝到serverMap中。通过Random的nextInt函数,取到0~keyList.size之间的随机值,从而从服务器列表中随机取到一台服务器的地址,进行返回。根据概率统计理论,吞吐量越大,随机算法的效果越接近于轮询算法的效果。

3、源地址哈希法

源地址哈希法的思想是根据服务消费者请求客户端的IP地址,通过哈希函数计算得到一个哈希值,将此哈希值和服务器列表的大小进行取模运算,得到的结果便是要访问的服务器地址的序号。采用源地址哈希法进行负载均衡,相同的IP客户端,如果服务器列表不变,将映射到同一个后台服务器进行访问。

源地址哈希法部分关键代码如下:

publicstaticStringtestConsumerHash(StringremoteIp){

inthashCode=remoteIp.hashCode();

intpos=hashCode%keyList.size();

returnkeyList.get(pos);

}4、加权轮询(WeightRoundRobin)法

不同的后台服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不一样。跟配置高、负载低的机器分配更高的权重,使其能处理更多的请求,而配置低、负载高的机器,则给其分配较低的权重,降低其系统负载,加权轮询很好的处理了这一问题,并将请求按照顺序且根据权重分配给后端。

加权轮询法部分关键代码如下:

publicstaticStringtestWeightRoundRobin(){

Iteratorit=keySet.iterator();

ListserverList=newArrayList();

while(it.hasNext()){

Stringserver=it.next();

Integerweight=serverMap.get(server);

for(inti=0;i

serverList.add(server);

if(pos>serverList.size()){

server=serverList.get(pos);

}与轮询算法类似,只是在获取服务器地址之前增加了一段权重计算代码,根据权重的大小,将地址重复增加到服务器地址列表中,权重越大,该服务器每轮所获得的请求数量越多。

5、加权随机(WeightRandom)法

加权随机法跟加权轮询法类似,根据后台服务器不同的配置和负载情况,配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序。

部分关键代码如下:

publicstaticStringtestWeightRandom(){

intrandomPos=random.nextInt(serverList.size());

Stringserver=serverList.get(randomPos);

}6、最小连接数法

前面我们费尽心思来实现服务消费者请求次数分配的均衡,我们知道这样做是没错的,可以为后端的多台服务器平均分配工作量,最大程度地提高服务器的利用率,但是,实际上,请求次数的均衡并不代表负载的均衡。因此我们需要介绍最小连接数法,最小连接数法比较灵活和智能,由于后台服务器的配置不尽相同,对请求的处理有快有慢,它正是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器。

THE END
1.小学数学简便算法方法归类,分享给孩子!(附14个计算技巧)小学数学简便算法方法归类,分享给孩子!(附14个计算技巧) 小学数学的学习也决定着孩子将来的学习生涯,所以作为家长我们需要还孩子提供最适合的学习方法,帮助他们提高学习成绩。今天给大家分享一下数学中经常遇到的简便计算的解题方法,希望对大家有帮助。https://mp.weixin.qq.com/s?__biz=MzA5Mjc5MjI5Ng==&mid=2652579985&idx=2&sn=4fc63a760f38a4cda3749f018860926a&chksm=8ae487608eda872604b26214ae7c69b46bcbf92bface200866b79b0e0d63df5bf2dec2f03055&scene=27
2.这8种算法,必须掌握——程序员算法一:快速排序法 快速排序法是对冒泡排序的一种改进,是通过一趟排序将要排序的数据,分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后在按此方法,对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。对于快速排序算法来说,实际上大量的时间https://baijiahao.baidu.com/s?id=1771832733532542126&wfr=spider&for=pc
3.简述几种常用的排序算法归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分治的思想,代码都通过递归来实现,过程非常相似。理解归并排序的重点是理解递推公式和 merge() 合并函数。 一,冒泡排序(Bubble Sort) 排序算法是程序员必须了解和熟悉的一类算法,排序算法有很多种,基础的如:冒泡、插入、选择、快速、归并、计数、基数和桶排https://zhuanlan.zhihu.com/p/617318046
4.数据挖掘的常见算法有哪些?数据挖掘的常见算法有哪些? 数据挖掘是一种通过从大量数据中提取知识和信息的方法,以支持业务决策、市场分析和科学研究等领域。在数据挖掘过程中,算法是最重要的组成部分之一。以下是常见的数据挖掘算法。 1.分类算法 分类算法是一类用于将数据样本分为不同类别的算法。这些算法通常使用监督学习方法,其中模型基于已标记https://www.cda.cn/bigdata/202782.html
5.常见的经典算法有哪些Python常见的经典算法有哪些 在计算机科学领域,有一些经典算法被广泛应用于各种问题的解决。这些算法经过长期的研究和实践,被证明是高效且有效的。本文将介绍几个常见的经典算法,并提供相应的Python源代码。 一、冒泡排序算法(Bubble Sort) 冒泡排序是一种简单但效率较低的排序算法。它的基本思想是通过相邻元素之间的比较和交https://download.csdn.net/blog/column/12405713/133216600
6.什么是哈希算法?常见的哈希算法有哪些?区块链技术区块链这篇文章主要介绍了什么是哈希算法?常见的哈希算法有哪些?的相关资料,需要的朋友可以参考下本文详细内容介绍 哈希算法是一种数学函数或者算法,它可以将任意长度的数据(称为“消息”)转换为固定长度的字符串(称为“哈希值”或者简称“哈希”)。哈希算法的作用是将数据进行一次性的加密,从而生成一个唯一且不可逆的标识https://www.jb51.net/blockchain/891421.html
7.什么是哈希算法?常见的哈希算法有哪些?常见的哈希算法有哪些? 币界网报道: 哈希算法,也被称为散列算法,是一种将输入数据转换为固定长度的输出值的算法。它通过对输入数据进行一系列复杂的计算和操作,生成一个唯一的哈希值。哈希算法的最大特点是快速和高效,能够快速地确定数据是否被篡改或者检索数据。https://www.528btc.com/college/1695140495130670.html
8.常见的排序算法有哪些?如何实现这些算法?常见的排序算法有哪些?如何实现这些算法? 1.背景介绍 在计算机科学与数学中,排序算法(Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法。 最常用到的排序方式是数值顺序以及字典顺序。 有效的排序算法在一些算法(例如搜寻算法与合并算法)中是重要的, 如此这些算法才能得到正确解答。 排序算法也https://www.pianshen.com/article/7707638722/
9.加密算法可以归结为哪几类常见的加密算法有哪些对称加密是指加密和解密使用同一个密钥的加密方式,其中最常见的算法包括DES、3DES、AES等。 2.非对称加密 非对称加密是指加密和解密使用不同密钥的加密方式,常规算法包括RSA、DSA、ECC等。 3.哈希函数 哈希函数是指将任意长度的消息压缩成固定长度摘要的函数,常见算法有MD5、SHA-1、SHA-256等。 https://www.eefocus.com/e/528368.html
10.2022年最新出品“68道Redis+168道MySQL”精品面试题43. Redis 持久化机制有哪些? 44. Redis 持久化机制 AOF 和 RDB 有哪些不同之处? 45. 请介绍一下 RDB 持久化机制的优缺点 46. 请介绍一下 AOF 持久化机制的优缺点 47. 如果 AOF 文件的数据出现异常, Redis 服务怎么处理? 48. 常见的淘汰算法有哪些? https://maimai.cn/article/detail?fid=1726703164&efid=-tABoLbWyf4LHUqCpif90g
11.自动驾驶路径规划五大常用算法汽车技术以上为几大常见规划算法分享,欢迎评论区各位工程师们一起探讨不同规划算法的使用情况。 后面也会持续分享基于不同规划算法的公式推导、建模的干货。https://www.auto-testing.net/news/show-116633.html
12.TensorFlow机器学习常用算法解析和入门集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行。常见的算法包括:Boosting, Bootstrapped Aggregation(Bagging), AdaBoost,堆叠泛化(Stacked Generalihttps://www.w3cschool.cn/tensorflow/tensorflow-s8uq24ti.html
13.面试宝典2021性能测试经典面试题(三)56:垃圾收集算法有哪些 常见的垃圾收集算法有以下几种: a、标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。 b、复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小http://www.chuansinfo.com/index.php?m=home&c=View&a=index&aid=1600
14.关于查找有哪些常见的算法?查找算法有两种:一种只作查找操作,我们称之为静态查找。一种在查找过程种同时插入或删除数据元素,我们称之为动态查找。 静态查找 它的功能如下: 查询某个“特定的”数据元素是否在查找表中; 检索某个“特定的”数据元素和各种属性。 常见的查找方法有:顺序查找、折半查找、插值查找、斐波那契查找等,容我细细讲来https://www.jianshu.com/p/6c1afbeb9b96