【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第五节:伸缩性思考-负载均衡算法
- 轮询
- 加权轮询
- 随机
- 最小连接
- 原地址散列
- 总结
本篇文章我们来学习负载均衡算法,是接着我们上一篇文章所说的伸缩性的思考,我们聊几个负载均衡算法。
轮询
第一个就是轮询。
轮询就是Round Robin。轮询这个算法就是挨个发。比如我有这么三个服务器,前面是一个负载均衡服务器,请求来的时候按照一定的顺序,一个一个来发,这个叫轮询。
那么这个适用的场景是什么呢?适用于每个服务器的配置都是一样的场景,这种情况下的负载均衡应该怎么去做呢?
在负载均衡的代码里,可以通过一个数组来存储后面每个真正代理的服务器的地址,有一个数组下标从零开始取,取完下标加一到下一个数,走完一轮之后再回归到零,再一次一次的去分发就可以了。
加权轮询
第二个叫做加权轮询。
什么叫加权轮询呢?就是说按照权重不同来分发。
权重是基于配置的,比如我这里面有两个服务器,A这个服务器配置高一些,是B的两倍,不管是CPU、内存、还是网络、还是磁盘空间,都是它的两倍,那么它的权重就分配的多一些。比如说A的权重分配分配4,那么B的权重分配2。就是A的权重是B权重的两倍好了。
那么这种加权轮询的算法怎么做呢?我们举一个例子。比如说我们有两个服务器,A的权重是六,B的权重是四,那么当请求到了负载均衡服务器需要分发的时候,怎么能做到60%的请求都分发到权重为六服务器呢?
可以取一到十之间的随机数,如果随机数落到一到六之间,那么把它分发到权重为六服务器,如果说落到七到十这个区间,把它分配到权重为四服务器,这样的话就利用生成随机数的这种概率来把他的请求进行分发到不同的权重的服务器上。
随机
还有一个就是随机。随机就比较简单了,直接random,这个代码实现也比较简单,就直接随机。比如说,有三台服务器,那么数组里存储三个服务器的地址,下标就在0和2之间随机取,取到哪个是哪个。
最小连接
还有一个叫做最少连接负载均衡。
什么意思呢?就是说在负载均衡服务器这一方,它要记录每个后方服务器处理连接的数量,然后他把下一次来的请求转发给处理连接最少的那台服务器。
原地址散列
再下一个就叫做原地址散列,也叫做source hashing。
根据请求来源的IP地址进行哈希计算,只要原地址不变,那么每次请求映射到后面的服务器的地址是不变的。
比如说有这么一个请求,来自于某一个客户端,客户端的IP是a,a根据md5生成某一个值,那么这个值对应的是某台服务器。那么下一次只要这个请求还是来源于这个客户端,还是来源于这个IP,它的md5的值还是这个,永远对应这台服务器,那么只要是从这个客户端发出的请求都会被转发到这台服务器上。
这样做有什么好处呢?就是说它有利于session的维护,也就是说你在这个服务器上登录之后,在这个服务器里面的内存中存储了一些与你这个客户端相关的数据,那么你每次来他都能通过这种散列算法给你生成一个值,这个值跟这个服务器对应,那么你每次都在这个服务器上,这个服务器内存中存储的一些数据就可以复用。
总结
负载均衡算法,我们就说这么多。上一篇文章讲了负载均衡,这篇文章讲的负载均衡算法,其实都是为了伸缩性做考虑。伸缩性就是通过算法找后端的一台机器,然后找到后端的那台机器之后,把请求发给他。
这里面有一些算法,如果他要缩的话,就需要去改一下。比如说轮询,我们在数组去存对应的三台服务器的IP地址,如果我们需要把一台服务器删掉,就需要把数组里面的这个地址也给它去掉。
关于服务器的伸缩,在我们的系统当中,如果能做成自动化的,就会更好。这一方面,通过云原生的解决方案去做,是比较好的。