负载均衡(干货版)
admin
2024-04-26 12:03:07
0
private static Map serviceWeightMap = new HashMap();
static {serviceWeightMap.put("192.168.1.100", 1);serviceWeightMap.put("192.168.1.101", 1);		 // 权重为4serviceWeightMap.put("192.168.1.102", 4);serviceWeightMap.put("192.168.1.103", 1);serviceWeightMap.put("192.168.1.104", 1);        // 权重为3serviceWeightMap.put("192.168.1.105", 3);serviceWeightMap.put("192.168.1.106", 1);        // 权重为2serviceWeightMap.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);
}

一、轮询法(Round Robin)

对所有的服务器节点全部按顺序来,将请求按照顺序轮流地分配到各个服务器上,所以适合用于服务器硬件条件基本都相同的情况

private static Integer pos = 0;public static String testRoundRobin() {   // 重新创建一个map,避免出现由于服务器上线和下线导致的并发问题Map serverMap = new HashMap();serverMap.putAll(serviceWeightMap);// 取得 IP 地址 listSet keySet = serverMap.keySet();ArrayList keyList = new ArrayList();keyList.addAll(keySet);String server = null;synchronized (pos) {if (pos > keySet.size()) {pos = 0;}server = keyList.get(pos);pos++;}return server;
}

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

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

轮询法的优点在于:试图做到请求转移的绝对均衡,缺点在于:为了做到请求转移的绝对均衡,必须付出相当大的代价,因为为了保证 pos 变量修改的互斥性, 需要引入重量级的悲观锁 synchronized,这将会导致该段轮询代码的并发吞吐量发生明显的下降

二、加权轮询法(Weight Robin)

那么加权轮询算法无疑就是对各个服务器有了"高低贵贱之分",没办法,服务器的吃力水平不同,只能让那些强悍的机器优先并多处理一些请求,比较弱的机器就让它稍稍压力小一点

public class WeightRoundRobin {private static Integer pos;public static String getServer() {// 重建一个Map,避免服务器的上下线导致的并发问题Map serverMap = new HashMap();serverMap.putAll(IpMap.serverWeightMap);// 取得 Ip 地址 ListSet keySet = serverMap.keySet();Iterator iterator = keySet.iterator();List serverList = new ArrayList();while (iterator.hasNext()) {String server = iterator.next();int weight = serverMap.get(server);for (int i = 0; i < weight; i++)serverList.add(server);}String server = null;synchronized (pos){if (pos > keySet.size())pos = 0;server = serverList.get(pos);pos ++;}return server;}
}

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

三、随机法(Random)

随机算法也是一种使用场景比较多的负载均衡算法,这种算法基本思想也是很简单的,随机生成一个数字(或者随机挑一个IP地址)出来,然后挑到谁就是谁,当然, 如果随机数是等概况生成的,那时间长了,基本上跟轮询算法没有什么区别,区别最主要的还是在顺序上,随机算法没有那么严格的顺序

public class Random {public static String getServer() {// 重建一个Map,避免服务器的上下线导致的并发问题Map serverMap = new HashMap();serverMap.putAll(IpMap.serverWeightMap);// 取得 Ip 地址 ListSet keySet = serverMap.keySet();ArrayList keyList = new ArrayList();keyList.addAll(keySet);java.util.Random random = new java.util.Random();int randomPos = random.nextInt(keyList.size());return keyList.get(randomPos);}
}

四、加权随机法(Weight Random)

加权随机算法是在随机算法的基础上加了加权的条件,随机法时间长了,基本上跟一般轮询算法就没啥区别了,刚才也说到了,如果服务器的配置都差不多, 可以分配差不多的任务,但是如果服务器吃力能力差异比较大,那水平高的和水平低的服务器都给那么多任务,对于高配置的服务器来说就是有点浪费了, 对于低配置的服务器来说就有点吃不消,所以在这种配置差异性比较大的情况下,加权的工作还是必要的

public class WeightRandom {public static String getServer() {// 重建一个 Map,避免服务器的上下线导致的并发问题Map serverMap = new HashMap();serverMap.putAll(IpMap.serverWeightMap);// 取得 Ip 地址 ListSet keySet = serverMap.keySet();Iterator iterator = keySet.iterator();List serverList = new ArrayList();while (iterator.hasNext()) {String server = iterator.next();int weight = serverMap.get(server);for (int i = 0; i < weight; i++)serverList.add(server);}java.util.Random random = new java.util.Random();int randomPos = random.nextInt(serverList.size());return serverList.get(randomPos);}
}

五、最小连接法(Least Connections)

那个服务器的连接数少,就分配给哪个服务器新的请求,合情合理,这种算法的缺点就是,当一个比较弱的服务器和一个比较彪悍的服务器,本来就是前者连接的要少, 后者要大,如果非要谁的少新请求分配给谁的话,那就是弱服务器的连接要等于强服务器的连接,无疑这样会让弱服务器吃不消,或者造成强服务器的浪费, 所以这里还可以使用加权的方法解决这样的问题------加权最小连接法

六、源地址哈希法(Hash)

源地址哈希法可以把客户端的 IP 地址拿出来,然后计算出 IP 地址的 hash 值,根据 hash 值映射到服务器上

public class Hash {public static String getServer() {// 重建一个 Map,避免服务器的上下线导致的并发问题Map serverMap = new HashMap();serverMap.putAll(IpMap.serverWeightMap);// 取得 Ip 地址 ListSet keySet = serverMap.keySet();ArrayList keyList = new ArrayList();keyList.addAll(keySet);// 在 Web 应用中可通过 HttpServlet 的 getRemoteIp 方法获取String remoteIp = "127.0.0.1";int hashCode = remoteIp.hashCode();int serverListSize = keyList.size();int serverPos = hashCode % serverListSize;return keyList.get(serverPos);}
}

源地址哈希法的优点在于:保证了相同客户端IP地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的 session 会话

源地址哈希算法的缺点在于:除非集群中服务器的非常稳定,基本不会上下线,否则一旦有服务器上线、下线,那么通过源地址哈希算法路由到的服务器是服务器上线、下线前路由到的服务器的概率非常低,如果是 session 则取不到 session,如果是缓存则可能引发 “雪崩”

相关内容

热门资讯

加快完善中央银行制度!国常会讨... 5月21日,国务院总理李强主持召开国务院常务会议,研究推进全国统一大市场建设有关工作,审议通过《现代...
毕业人数历史新高,大城市却还在... 今年的毕业生人数要破纪录了,预计1270万人,和去年相比又增长了48万,再创历史新高。 按理来说,就...
28.5万亿美元——这是Spa... 全球太空探索领军者SpaceX最新发布的这份万众瞩目IPO招股说明书显示,其自行评估的SpaceX总...
乐聚智能冲击IPO,聚焦人形机... 2025年以来全球人形机器人行业进入爆发期,无论是企业数量,还是融资规模均实现跨越式增长。 据人形机...
年轻人把澡堂子玩成了社交顶配 ... 花上几百元,甚至上千元,到澡堂子待一天——这是时下最流行的休闲消费方式。当然,澡堂子们也把名字升级为...
原创 五... 无营生可做,无房产置办,也无心做任何投资,整日里就单纯陪着父亲左右度日。 这话是他说的,5月13日,...
合肥居家闲置黄金整理指南 轻松... 随着近年来黄金市场行情持续向好,合肥不少市民开始整理家中闲置的黄金首饰、金条等物品,希望通过合理处置...
廿载荣耀见证!52位券商领军者... 权威集结,见证行业标杆! 由证券时报主办的“2026中国证券业君鼎奖”活动即将进入专家评审阶段。本届...
小米YU7首战Model Y八... 快科技5月21日消息,今晚小米人车家全生态新品发布会上,雷军宣布正式推出小米YU7标准版,售价23....
小米跑车级SUV YU7 GT... 记者|李星 编辑|陈柯名 裴健如 杜恒峰 校对|程鹏 5月21日晚间,小米YU7 GT正式上市,售价...
霍尔木兹海峡封锁 日本原油进口... 据日本共同社5月21日报道,日本财务省21日公布4月贸易统计初值(通关口径)显示,从中东进口原油38...
鲍威尔任内最后一次会议纪要公布... 当地时间5月20日,美国联邦储备委员会公布的4月货币政策会议纪要表明,如果美国通胀持续高于目标水平,...
晚间开售,非标提价,茅台改革进... 出品|中访网 审核|李晓燕 5月18日,贵州茅台接连抛出两大市场动作,瞬间搅动白酒行业神经。继5月1...
海关律师、走私辩护律师邵丹:罗... 近日,罗湖海关查获旅客走私红酒3支。 某日,罗湖海关关员在对进境旅客进行监管时,发现一名男性旅客进...
原创 三... 目前全球所有的电子产品中,涨的最猛的,就是内存。 最近一年以来,平均涨了四五倍,内存厂商们是大赚特赚...
长鑫科技科创板IPO将于5月2... 观点网讯:5月20日,据上交所网站披露,上交所上市审核委员会定于5月27日召开2026年第27次上市...
345.68亿!上海S基金交易... 来源:看看新闻KNEWS 日前,由上海股权托管交易中心、上海科创中心股权投资基金管理有限公司联合主办...
腾讯云·云上好CP携手六大消费... 当告白季的温柔氛围, 撞上科技赋能的好物狂欢, 腾讯云「云上好 CP」带着六大消费电子企业CP惊喜登...
擎天租与京东集团达成战略合作,... 来源:猎云网 5月21日,擎天租宣布与京东集团达成全面战略合作,双方将围绕产品解决方案共建、渠道供应...
金鹰基金固收老将林暐一次性卸任... 5月19日,金鹰基金管理有限公司(下称“金鹰基金”)发布多份基金经理变更公告,旗下基金经理林暐因个人...