初探负载均衡算法【随机、轮询、加权随机、加权轮询、平滑加权轮询】

您所在的位置:网站首页 权重优先策略的优缺点是什么 初探负载均衡算法【随机、轮询、加权随机、加权轮询、平滑加权轮询】

初探负载均衡算法【随机、轮询、加权随机、加权轮询、平滑加权轮询】

2024-04-01 09:31| 来源: 网络整理| 查看: 265

简介

负载平衡(Load balancing)是一种在多个计算机(网络、CPU、磁盘)之间均匀分配资源,以提高资源利用的技术。使用负载均衡可以最大化服务吞吐量,可能最小化响应时间,同时由于使用负载均衡时,会使用多个服务器节点代单点服务,也提高了服务的可用性。

负载均衡的实现可以软件可以硬件,硬件如大名鼎鼎的 F5 负载均衡设备,软件如 NGINX 中的负载均衡实现,又如 Springcloud Ribbon 组件中的负载均衡实现。本文主要从软件层面来说明其实现算法。

负载均衡算法主要分为以下6大类:

随机轮询加权随机加权轮询一致性哈希平滑加权轮询 在这里插入图片描述

代码示例: 先把三台服务器放在集合中去:

//服务器IP public class ServerIps { //不带权重的三台服务器,用List存储 public static final List LIST = Arrays.asList( "A", "B", "C" ); //带权重,用于加权xx算法 public static final Map WEIGHT_LIST = new LinkedHashMap(); static { WEIGHT_LIST.put("A",2); WEIGHT_LIST.put("B",3); WEIGHT_LIST.put("C",5); } } 随机访问

很简单,对三台服务器随机抽取一个进行访问即可。

//随机 public class RandomSelect { public static String getServer() { Random random = new Random(); int rand = random.nextInt(ServerIps.LIST.size()); return ServerIps.LIST.get(rand); } } 轮询算法

也很简单,每次按照顺序依次对服务器进行访问即可,用一个pos指针来记录轮询的位置。

//轮询 public class RoundRobin { //位置 public static Integer pos = 0; public static String getServer() { String ip = null; synchronized (pos) { if(pos >= ServerIps.LIST.size()) { pos = 0; } else { ip = ServerIps.LIST.get(pos); pos++; } } return ip; } } 加权轮询

在前面ServerIps类的带权重的服务器定义中,每个服务器A、B、C被储存在一个WEIGHT_LIST中,并分别带有权重2、3、5,意思就是服务器C访问的次数可以相对最大…,前面我们的轮询算法中,遍历的集合是A、B、C组成的,现在无非是放入2个A,3个B,5个C即可,如下图所示: 在这里插入图片描述 相当于,10次请求里面有2次是去访问A,3次去访问B,5次去访问C,这样就实现了加权轮询的功能。

加权随机

和加权轮询类似,依旧是按照权重把List集合中放满服务器元素,再去随机取即可,无非是取每个服务器的概率不是均等的罢了。

//缺点 权重大 ips越大 占内存 带权重随机 public class WeightRandom { public static String getServer() { //生成随机数作为List下标 List ips = new ArrayList(); for (String ip: ServerIps.WEIGHT_LIST.keySet()) { Integer weight = ServerIps.WEIGHT_LIST.get(ip); //weight多少 在ips里面存多少 例 A 权重为2 在ips里面存两个 for (int i = 0; i w).sum(); //把请求对总权重和取模,就落在0到9之间 Integer pos = num % totalWeights; for(String ip: ServerIps.WEIGHT_LIST.keySet()) { Integer weight = ServerIps.WEIGHT_LIST.get(ip); if(pos { currWeights.put(ip,new Weight(ip,weight,0)); }); } for(Weight weight: currWeights.values()) { weight.setCurrentWeight(weight.getCurrentWeight() + weight.getWeight()); } //找最大值 Weight maxCurrentWeight = null; for(Weight weight: currWeights.values()) { if(maxCurrentWeight == null || weight.getCurrentWeight() > maxCurrentWeight.getCurrentWeight()) { maxCurrentWeight = weight; } } maxCurrentWeight.setCurrentWeight( maxCurrentWeight.getCurrentWeight() - totalWeights); return maxCurrentWeight.getIp(); } public static void main(String[] args) { for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3