什么是负载均衡?
1、负载:就是后端系统的承载能力。比如同等条件下,一个1核cpu-1G内存的机器的承载能力一般会比8核cpu-8G内存的机器要差;相同配置下,一个cpu利用率为80%的机器比30%的承载能力一般要差等等。
2、均衡:保证后端请求的平衡。比如:在同等情况下,分配到多台机器的请求要相当;有些情况下,同一用户尽可能分配到同一台机器等等。
为什么要有负载均衡呢?
很明显,如果我们不去考虑后端的承载情况,有可能直接就把某台机器压垮了(比如cpu利用率已经80%了,再给大量的请求直接就干死了),更严重的会直接造成雪崩(一台压死了,对应的请求又压倒其他某台机器上,又干死一台……),从而致使服务瘫痪。
2、如果我们均衡算法选的不好,就会导致后端资源浪费。比如:如果选择一致Hash算法,可以很好利用cache的容量。而如果用随机,有可能就会让cache效果大打折扣(每台机器上都要缓存几乎相同的内容)。
负载均衡算法有哪些?
1轮询法(Round Robin)
轮询法是负载均衡中最常用的算法,它容易理解也容易实现。
轮询法是指负载均衡服务器(load balancer)将客户端请求按顺序轮流分配到后端服务器上,以达到负载均衡的目的。
假设现在有6个客户端请求,2台后端服务器。当第一个请求到达负载均衡服务器时,负载均衡服务器会将这个请求分派到后端服务器1;当第二个请求到害时,负载均衡服务器会将这个请求分派到后端服务器2。然后第三个请求到达,由于只有两台后端服务器,故请求3会被分派到后端服务器1。
2加权轮询法(Weighted Round Robin)
简单的轮询法并不考虑后端机器的性能和负载差异。给性能高、负载低的机器配置较高的权重,让其处理较多的请求;而性能低、负载高的机器,配置较低的权重,让其处理较少的请求。加权轮询法可以很好地处理这一问题,它将请求顺序且按照权重分派到后端服务器。
假设有6个客户端请求,2台后端服务器。后端服务器1被赋予权值5,后端服务器2被赋予赋予权值1。这样一来,客户端请求1,2,3,4,5都被分派到服务器1处理;客户端请求6被分派到服务器2处理。接下来,请求7,8,9,10,11被分派到服务器1,请求12被分派到服务器2,依次类推。
3最小连接数法(Least Connections)
即使后端机器的性能和负载一样,不同客户端请求复杂度不一样导致处理时间也不一样。最小连接数法根据后端服务器当前的连接数情况,动态地选取其中积压连接数最小的一台服务器来处理当前的请求,尽可能提高后端服务器的利用效率,合理地将请求分流到每一台服务器。
为什么根据连接数可以合理地利用服务器处理请求呢?
考虑一个客户端请求的处理逻辑较复杂,需要服务器的处理时间较长,由于客户端需要等待服务器的响应,故需要保持与服务器的连接,这样一来,客户端就需要与服务器保持较长时间的连接。
4随机法(Random)
随机法也很简单,就是随机选择一台后端服务器进行请求的处理。由于每次服务器被挑中的概率都一样,客户端的请求可以被均匀地分派到所有的后端服务器上。
5加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
6源地址哈希法(Source Hashing)
源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
如果后端服务器是一缓存系统,当后端服务器增加或者减少时,采用简单的哈希取模的方法,会使得命中率大大降低,这个问题可以采用一致性哈希的方法来解决。 关于一致性哈希的介绍,可以参考文件
五分钟看懂一致性哈希算法