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

面试官:你了解负载均衡算法吗?_0

时间:2023-03-20 22:16:56 科技观察

上篇文章讲了负载均衡的三种算法,轮询法,随机法,最小连接法,这三种负载均衡算法,但是负载均衡还有其他的算法,我们也需要你去看看,而且在面试过程中,很有可能会问到你。要实现高性能的集群,选择一个好的负载均衡器非常重要,针对不同的业务场景选择合适的负载均衡算法也很重要。前面列举了几个,接下来说说剩下的算法,1.源地址哈希算法是唯一不丢策略的算法,但是负载均衡跟源数据信息有很大关系,哈希算法。源地址散列法的思想是根据服务消费者请求的客户端IP地址,通过散列函数计算出一个散列值,对散列值与服务器列表的大小进行取模运算,得到的结果是访问的服务器地址的序号。源地址散列法用于负载均衡。同一个IP客户端,如果服务器列表不变,会映射到同一个后台服务器进行访问。还是之前的操作,伪代码:privatestaticMapserviceWeightMap=newHashMap();static{serviceWeightMap.put("192.168.1.100",1);serviceWeightMap.put("192.168.1.101",1);serviceWeightMap.put("192.168.1.102",4);serviceWeightMap.put("192.168.1.103",1);}publicstaticStringtestConsumerHash(StringremoteIp){MapserverMap=newHashMap();serverMap.putAll(serviceWeightMap);//获取IP地址listSetkeySet=serverMap.keySet();ArrayListkeyList=newArrayList();keyList.addAll(keySet);inthashCode=remoteIp.hashCode();intpos=hashCode%keyList.size();returnkeyList.get(pos);}此代码来自Will.Shun。我看的时候不明白是什么意思。其实和它的解释很像。通过散列函数计算出一个散列值,散列值与服务器列表的大小取模,结果为要访问的服务器地址序号。2.加权轮转算法我们来看看加权轮转算法。我们先看一下Nginx中的权重配置:http{upstreamcluster{serveraweight=1;serverbweight=2;servercweight=3;}如果Nginx每次收到6个客户端的请求,其中一个会被转发到后端a,其中两个将转发到后端b,其中三个将转发到后端c。作为加权循环算法的结果,将生成一系列服务器。每当请求到达时,顺序取出序列中的下一个服务器来处理请求。加权轮训练算法伪代码:privatestaticMapserviceWeightMap=newHashMap();static{serviceWeightMap.put("192.168.1.100",1);serviceWeightMap.put("192.168.1.101",1);serviceWeightMap.put("192.168.1.102",4);serviceWeightMap.put("192.168.1.103",1);}publicstaticStringtestWeightRoundRobin(){//重新创建一个map,避免服务器上线下线造成的并发问题mapserverMap=newHashMap();serverMap.putAll(serviceWeightMap);//获取IP地址listSetkeySet=serverMap.keySet();Iteratorit=keySet.iterator();ListserverList=newArrayList();while(it.hasNext()){Stringserver=it.next();Integerweight=serverMap.get(server);for(inti=0;iserverList.size()){pos=0;}server=serverList.get(pos);pos++;}returnserver;}事实上,加权循环训练算法是有缺陷的。在某些特殊的权重下,加权循环调度会产生不均匀的实例序列。这种不均匀的负载可能会导致某些实例出现瞬时高负载现象导致系统宕机的风险。为了解决这种调度缺陷,出现了平滑的加权轮换训练调度。有兴趣的同学一定要看看这个平滑的负重轮换训练。3.加权随机算法加权随机法与加权循环法类似,根据后台服务器的不同配置和负载情况配置不同的权重。不同之处在于它按权重而不是顺序随机选择服务器。privatestaticMapserviceWeightMap=newHashMap();static{serviceWeightMap.put("192.168.1.100",1);serviceWeightMap.put("192.168.1.101",1);serviceWeightMap.put("192.168.1.102",4);serviceWeightMap.put("192.168.1.103",1);}publicstaticStringtestWeightRandom(){//重新创建一个map,避免服务器上下线导致的并发问题MapserverMap=newHashMap();serverMap.putAll(serviceWeightMap);//获取IP地址listSetkeySet=serverMap.keySet();ListserverList=newArrayList();Iteratorit=keySet.iterator();while(it.hasNext()){Stringserver=it.next();Integerweight=serverMap.get(server);for(inti=0;i