当前位置: 首页 > 科技观察

常见的负载均衡算法,你知道几个?

时间:2023-03-18 00:24:56 科技观察

冷备与热备冷备(coolstandby)是指提供不正常运行的备用设备。当运行设备发生故障时,备用设备用于替代。双机热备(hotstandby)是指在设备运行的同时运行备用设备。当运行设备出现故障时,可自动更换备用设备。Fail-over和fail-back故障转移,在备用结构中,停止运行中的设备,使用备用设备工作的过程称为替换,英文称为fail-over或switch-over。fail-back,更换后恢复到原运行设备的过程,即从运行备用设备切换到原运行设备的过程,称为fallback,在中称为fail-back或switch-back英语。冗余类型1.主备模式(Active-Standby)准备两台路由器,其中一台作为正常业务运行的主设备(active),也可以称为主设备(master)或主设备(基本的)。另一台作为备用设备(standby),发生故障时更换,也可称为备用机(backup)、从设备(slave)、必备设备(secondary)。活动和备用设备必须共享有关设备的设置信息。2、Active-Active模式准备两台路由器,其中一台作为主设备(primary),另一台作为从设备(secondary)。两台路由器同时运行,形成冗余结构。这种方法与负载均衡设备一起使用,或者在客户端设置DNS和路由信息,就可以达到负载均衡的目的。3.集群模式(Cluster)在主备模式或双活模式下,采用3个以上的硬件协作,形成冗余结构。什么是负载均衡?负载均衡,英文名称为LoadBalance,是指由多台服务器以对称方式组成的一组服务器。每台服务器的地位相当,可以独立对外提供服务,无需其他服务器的辅助。通过一定的负载分担技术,将外界发来的请求以对称结构均匀分布到某台服务器上,接收请求的服务器独立响应客户端的请求。负载均衡可以将客户的请求均匀分布到服务器阵列上,从而提供对重要数据的快速访问,解决大量并发访问的服务问题。这种集群技术能够以最少的投资获得接近大型机的性能。负载均衡算法用在很多地方,无论是服务治理还是分布式缓存。本文主要介绍几种常见的负载均衡算法。1.Polling轮询方式,很好理解,请求是按顺序依次分配给服务器的,他平衡的对待每一个后端服务器,不管服务器的连接数和负载情况。下面的代码演示了这个算法。publicclassBalanceServer{publicstaticListservers=Arrays.asList("192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5");publicstaticintpos=0;publicstaticStringgetServer(){Stringserver=null;if(pos>=servers.size()){pos=0;}server=servers.get(pos);pos++;returnserver;}publicstaticvoidmain(String[]args){for(inti=0;i<10;i++){System.out.println(BalanceServer.getServer());}}}轮询策略是为了请求的绝对平衡,但在实际情况下,服务器可能并不完全相同,导致一些高性能的服务器没有被充分利用出来。2、随机方式利用系统的随机函数,根据后端服务器列表的大小,随机获取其中一台进行访问。随着调用次数的增加,实际效果越来越类似于平均分配到各个服务器。服务器。类似于轮询,代码如下:publicclassBalanceServer{publicstaticListservers=Arrays.asList("192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5"");publicstaticintpos=0;publicstaticStringgetServer(){Stringserver=null;Randomrandom=newRandom();intradomPos=random.nextInt(servers.size());server=servers.get(randomPos);returnserver;}}相比轮询算法,在并发场景下,轮询需要加锁,随机方式比性能要好。3.源地址哈希法源地址哈希法的思路是获取客户端访问的ip地址,通过哈希函数计算出一个哈希值,并用这个哈希值对大小进行取模运算服务器列表的编号,获取的值为要访问的服务器的序号。代码如下:publicclassBalanceServer{publicstaticListservers=Arrays.asList("192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5");publicstaticintpos=0;publicstaticStringgetServer(Stringip){Stringserver=null;inthashCode=ip.hashCode();pos=hashCode%servers.size();server=servers.get(pos);returnserver;}}hash方法的好处是当server列表不变时,客户端每次访问的server都是同一个server。利用这个特性,可以创建一个有状态的会话。不需要额外的操作就可以实现粘性会话。4.加权循环法刚才已经说了。不同的服务器性能不同,不能一概而论。有必要为性能低的服务器和高性能服务器提供较低的权重。权重,代码如下:publicclassBalanceServer{publicstaticMapserverMap=newHashMap();publicstaticintpos=0;static{serverMap.put("192.168.0.1",1);serverMap.put("192.168.0.2",1);serverMap.put("192.168.0.3",4);serverMap.put("192.168.0.4",3);serverMap.put("192.168.0.5",3);serverMap.put("192.168.0.6",2);}publicstaticStringgetServer(){SetkeySet=serverMap.keySet();Iteratorit=keySet。iterator();Listservers=newArrayList();while(it.hasNext()){Stringserver=it.next();Integerweight=serverMap.get(server);for(inti=0;i=servers.size()){pos=0;}server=servers.get(pos);pos++;returnserver;}publicstaticvoidmain(String[]args){for(inti=0;i<14;i++){System.out.println(BalanceServer.getServer());}35}36}5。加权随机法与加权轮询法类似,加权随机法也是根据后端服务器的不同配置和负载情况配置不同的权重。不同的是它是根据权重随机选择服务器,而不是顺序。加权随机方法的代码实现如下:publicclassWeightRandom{publicstaticStringgetServer(){//重新构建一个Map,避免服务器上线下线带来的并发问题MapserverMap=newHashMap();serverMap.putAll(IpMap.serverWeightMap);//获取IP地址ListSetkeySet=serverMap.keySet();Iteratoriterator=keySet.iterator();ListserverList=newArrayList();while(迭代器.hasNext()){Stringserver=iterator.next();intweight=serverMap.get(server);for(inti=0;i