服务消费者从服务配置中心获取到服务的地址列表后,需要选取其中一台来发起RPC调用。如何选择,则取决于具体的负载均衡算法,对应于不同的场景,选择的负载均衡算法也不同。常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法。
1. 轮询法
轮询很容易实现,将请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,而不关心服务器实际的连接数和当前的系统负载。使用轮询策略的目的是,希望做到请求转移的绝对均衡,但付出的代价性能也是相当大的。为了保证pos变量的并发互斥,引入了重量级悲观锁synchronized,将会导致该轮询代码的并发吞吐量明显下降。
serverWeightMap = new HashMap
serverWeightMap.put(“192.168.1.100”,1);
serverWeightMap.put(“192.168.1.101”,1);
serverWeightMap.put(“192.168.1.102”,4);
serverWeightMap.put(“192.168.1.103”,1);
serverWeightMap.put(“192.168.1.104”,1);
serverWeightMap.put(“192.168.1.105”,3);
serverWeightMap.put(“192.168.1.106”,1);
serverWeightMap.put(“192.168.1.107”,2);
serverWeightMap.put(“192.168.1.108”,1);
serverWeightMap.put(“192.168.1.109”,1);
serverWeightMap.put(“192.168.1.110”,1);
public static String testRoundBobin() {
Map
serverMap.putAll(serverWeightMap);
Set
ArrayList
keyList.addAll(keySet);
String server = null;
synchronized(pos) {
if(pos>=keySet.size()) {
pos = 0;
}
server = keyList.get(pos);
pos++;
}
return server;
}
轮询法适用于机器性能相同的服务,一旦某台机器性能不好,极有可能产生木桶效应,性能差的机器扛不住更多的流量。
2. 随机法
通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问。由概率概率统计理论可以得知,随着调用量的增大,其实际效果越来越接近于平均分配流量到后台的每一台服务器,也就是轮询法的效果。
同样地,它也不适用于机器性能有差异的分布式系统。
3. 源地址哈希法
源地址哈希法的思想是根据服务消费者请求客户端的IP地址,通过哈希函数计算得到一个哈希值,将此哈希值和服务器列表的大小进行求模运算,得到的结果便是要访问的服务器地址的序号。采用源地址哈希法进行负载均衡,相同的IP客户端,如果服务器列表不变,将映射到同一个后台服务器进行访问。该方法适合访问缓存系统,如果为了增强缓存的命中率和单调性,可以用一致性哈希算法,
4. 加权轮询法
不同的后台服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不一样。给配置高、负载低的机器分配更高的权重,使其能处理更多的请求,而配置低、负载高的机器,则给其分配较低的权重,降低其系统负载,加权轮询很好的处理了这一问题,并将请求按照顺序且根据权重分配给后端。Nginx的负载均衡默认算法是加权轮询算法。
5. 加权随机法
加权随机法跟加权轮询法类似,根据后台服务器不同的配置和负载情况,配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序。
6. 最小连接数法
最小连接数法比较灵活和智能,由于后台服务器的配置不尽相同,对请求的处理有快有慢,它正是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)