sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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
posted on 2024-03-25 19:20  sunny123456  阅读(100)  评论(0)    收藏  举报