首页 > 编程语言 >6种负载均衡算法

6种负载均衡算法

时间:2024-03-25 19:34:21浏览次数:25  
标签:负载 算法 server serverMap keySet serverWeightMap 均衡 new 服务器

6种负载均衡算法

1、轮询法

  

算法将请求按顺序轮流的分配到后端服务器,他均衡的对待后台每一台服务器,而不关心服务器实际的连接数和当前的系统负载

  1. public class RoundRobin {
  2. private static Map<String,Integer> serverWeightMap=new HashMap<String,Integer>();
  3. private static volatile Integer pos=new Integer(0);
  4. static{
  5. serverWeightMap.put("192.168.1.100",1);
  6. serverWeightMap.put("192.168.1.101",1);
  7. serverWeightMap.put("192.168.1.102",4);
  8. serverWeightMap.put("192.168.1.103",1);
  9. serverWeightMap.put("192.168.1.104",1);
  10. serverWeightMap.put("192.168.1.105",3);
  11. serverWeightMap.put("192.168.1.106",1);
  12. serverWeightMap.put("192.168.1.107",2);
  13. serverWeightMap.put("192.168.1.108",1);
  14. serverWeightMap.put("192.168.1.109",1);
  15. serverWeightMap.put("192.168.1.110",1);
  16. }
  17. public static void main(String[] args) {
  18. for(int i=0;i<100;i++){
  19. new Thread(new Runnable() {
  20. @Override
  21. public void run() {
  22. System.out.println(testRoundRobin());
  23. }
  24. }).start();
  25. }
  26. }
  27. public static String testRoundRobin(){
  28. //重新创建一个map,避免出现由于服务器上线和下线导致的并发问题
  29. Map<String,Integer> serverMap=
  30. new HashMap<String,Integer>();
  31. serverMap.putAll(serverWeightMap);
  32. //取得Ip地址list
  33. Set<String> keySet=serverMap.keySet();
  34. ArrayList<String> keyList=new ArrayList<String>();
  35. keyList.addAll(keySet);
  36. String server=null;
  37. synchronized(pos){
  38. if(pos>=keySet.size()){
  39. pos=0;
  40. }
  41. server=keyList.get(pos);
  42. pos++;
  43. }
  44. return server;
  45. }
  46. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

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

  1. public static String testRandom(){
  2. //重新创建一个map,避免出现由于服务器上线和下线导致的并发问题
  3. Map<String,Integer> serverMap=
  4. new HashMap<String,Integer>();
  5. serverMap.putAll(serverWeightMap);
  6. //取得Ip地址list
  7. Set<String> keySet=serverMap.keySet();
  8. ArrayList<String> keyList=new ArrayList<String>();
  9. keyList.addAll(keySet);
  10. int randomPos = new Random().nextInt(keyList.size());
  11. return keyList.get(randomPos);
  12. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3)源地址哈希(Hash)法 
源地址哈希法的思想是获取客户端访问的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是要访问的服务器的序号。采用哈希法进行负载均衡,当后端服务器列表不变时,同一IP地址的客户端,每次都会被影射到同一台后端服务器。

  1. public static String testConsumerHash(String remoteip){
  2. //重新创建一个map,避免出现由于服务器上线和下线导致的并发问题
  3. Map<String,Integer> serverMap=
  4. new HashMap<String,Integer>();
  5. serverMap.putAll(serverWeightMap);
  6. //取得Ip地址list
  7. Set<String> keySet=serverMap.keySet();
  8. ArrayList<String> keyList=new ArrayList<String>();
  9. keyList.addAll(keySet);
  10. int hashCode=remoteip.hashCode();
  11. int size=keyList.size();
  12. int serverPos=hashCode%size;
  13. //此处服务器key是其Ip哈希值(hashCode%size)
  14. return keyList.get(serverPos);
  15. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4)加权轮询法 
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不尽相同。给配置高的、负载低的机器更高的权重,让其处理更多请求,而低配置、负载高的机器,则给其分配较低的权重,降低其系统负载。

  1. public static String testWeightRoundRobin(){
  2. //重新创建一个map,避免出现由于服务器上线和下线导致的并发问题
  3. Map<String,Integer> serverMap=
  4. new HashMap<String,Integer>();
  5. serverMap.putAll(serverWeightMap);
  6. //取得Ip地址list
  7. Set<String> keySet=serverMap.keySet();
  8. Iterator<String> it=keySet.iterator();
  9. ArrayList<String> serverList=new ArrayList<String>();
  10. while(it.hasNext()){
  11. String server=it.next();
  12. Integer weight=serverMap.get(server);
  13. for(int i=0;i<weight;i++){
  14. serverList.add(server);
  15. }
  16. }
  17. String server=null;
  18. synchronized(pos){
  19. if(pos>=serverList.size()){
  20. pos=0;
  21. }
  22. server=serverList.get(pos);
  23. pos++;
  24. }
  25. return server;
  26. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

5)加权随机(Weught Random)法 
与加权轮询法类似,加权随机法也根据后端服务器不同的配置和负载情况,配置不同的权重

  1. public static String testWeightRandom(){
  2. //重新创建一个map,避免出现由于服务器上线和下线导致的并发问题
  3. Map<String,Integer> serverMap=
  4. new HashMap<String,Integer>();
  5. serverMap.putAll(serverWeightMap);
  6. //取得Ip地址list
  7. Set<String> keySet=serverMap.keySet();
  8. Iterator<String> it=keySet.iterator();
  9. ArrayList<String> serverList=new ArrayList<String>();
  10. while(it.hasNext()){
  11. String server=it.next();
  12. Integer weight=serverMap.get(server);
  13. for(int i=0;i<weight;i++){
  14. serverList.add(server);
  15. }
  16. }
  17. String server=null;
  18. int randomPos = new Random().nextInt(serverList.size());
  19. server=serverList.get(randomPos);
  20. return server;
  21. }

6、最小连接数法

     最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前

积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器

原文链接:https://blog.csdn.net/qq_32166531/article/details/76792603

标签:负载,算法,server,serverMap,keySet,serverWeightMap,均衡,new,服务器
From: https://www.cnblogs.com/sunny3158/p/18095120

相关文章

  • Java实现轮询调度算法(Round Robin)
    Java实现轮询调度算法(RoundRobin)Java实现轮询调度算法(RoundRobin)引言在计算机科学中,轮询调度算法(RoundRobin)是一种常见的任务调度算法。它被广泛应用于操作系统、网络路由器、负载均衡器等领域。本文将介绍轮询调度算法的原理、实现以及在Java中的应用。轮询调度算法原理......
  • 【每日算法】理论:AIGC模型 刷题:力扣链表操作
    上期文章【每日算法】理论:图像分割相关刷题:设计链表文章目录上期文章一、上期问题二、理论问题1、LAMAInpaint2、IPadapter模型3、Anydoor4、vit(VisionTransformer)架构5、MAE6、CLIP模型三、力扣刷题回顾-链表操作203.移除链表元素206.反转链表24.两两交换链表......
  • 学习笔记之算法快速排序
    快速排序听说有的公司面试会考?0.0快速排序思想:分治法基本思想:1、从数列中选出一个数2、分区(遍历),比它大的放他右边,比它小的或者等于的,放他左边3、对左右区间重复第2步,直到区间只有一个数(递归)参考:快速排序|菜鸟教程(runoob.com)在该网站......
  • 排序算法练习——最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值
    最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值。解决这个问题可以使用桶排序的思想。具体步骤如下:找到数组中的最大值和最小值。根据数组的长度,将数组划分成一定数量的桶,每个桶存放一定范围内的元素。计算每个桶内元素的最小值和最大值。遍历桶,计算相邻......
  • 排序算法练习——按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺
    按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺序不同的字符串)分组到同一个组中。要按照字符串的异位词分组,可以使用哈希表来将每个字符串排序后作为键,相同键的字符串即为异位词。以下是实现这个算法的Python代码:fromcollectionsimportdefaultdict......
  • 算法基础模板
    目录算法模版——基础篇1、整数二分2、浮点数二分3、高精度加法4、高精度减法5、高精度乘低精度6、高精度除以低精度7、一维前缀和8、二维前缀和9、一维差分10、二维差分11、位运算12、双指针算法13、离散化14、区间合并15、单链表16、双链表17、栈18、队列1.普通队列2.循环队列......
  • 机器学习的核心算法 - CNN的原理探讨
    很悲哀,类似这样的技术性问题讨论,和其他很多我感兴趣的问题,我现在很多时候只能采用异步模式,比如发帖来解决,然后实时的交互,只能跟GPT聊。我找不到合适的朋友,对相关话题感兴趣,并且程度和我相当,能聊得下去。1引子- 梯度爆炸结论:梯度爆炸就是求参失败。sweetie,我是AI运算的小白......
  • 算法模板 v1.10.4.20240325
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • 4.2.2、容器,算法,迭代器 初识
    了解STL中容器、算法、迭代器概念之后,我们利用代码感受STL的魅力STL中最常用的容器为Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器1、vector存放内置数据类型容器:vector算法:for_each迭代器:vector<int>::iteratorvoidMyPrint(intval){ c......
  • 运动规划碰撞检测算法之GJK算法
    运动规划碰撞检测算法之GJK算法在自动驾驶系统运动规划模块的碰撞检测中,通常分为粗略碰撞检测和精细碰撞检测两个步骤。粗略碰撞检测用来将两个明显不相交的物体快速排除,使用外接圆的包围形或轴对齐包围矩形(AxisAlignedBoundingBox,AABB)都是比较好的方式。外接圆......