前言
NGINX是轻量级,也是当前比较流行的web服务器软件。体积小但是功能强大。
这里我按照自己的理解,记录下对NGINX负载均衡的认识。(加权均衡,最小连接)
这里参考了 【https://blog.csdn.net/gqtcgq/article/details/52076997】,但是没有对里面的代码进行验证,只是本地用Python做了下来测试(其实自己用笔划划也就知道了)
加权均衡
这里给出三个服务器 a、b、c,权重分别是 1 、2、4。
按照直观理解,每7次请求中对a、b、c的请求应该是1、2、4.所以算法最终的结果应该是这样的情况。
加权均衡有两种算法,主要区别是资源分配的是不是更加均匀。
普通加权轮询算法
算法说明:
- 在服务器数组S中,首先计算所有服务器权重的最大值max(S),以及所有服务器权重的最大公约数gcd(S)。
- index表示本次请求到来时,选择的服务器的索引,初始值为-1;current_weight表示当前调度的权值,初始值为max(S)。
- 当请求到来时,从index+1开始轮询服务器数组S,找到其中权重大于current_weight的第一个服务器,用于处理该请求。记录其索引到结果序列中。
- 在轮询服务器数组时,如果到达了数组末尾,则重新从头开始搜索,并且减小current_weight的值:current_weight -= gcd(S)。如果current_weight等于0,则将其重置为max(S)。
执行过程是这样的
loop | a | b | c | choose |
---|---|---|---|---|
1 | 1 | 2 | 4 | c |
2 | 2 | 4 | 1 | b |
3 | 3 | -1 | 5 | c |
4 | 4 | 1 | 2 | a |
5 | -2 | 3 | 6 | c |
6 | -1 | 5 | 3 | b |
7 | 0 | 0 | 7 | c |
so 这7次选择为 {c, b, c, a, c, b, c} 刚好符合期望。
平滑的加权轮询
- 每个服务器都有两个权重变量:
a:weight,配置文件中指定的该服务器的权重,这个值是固定不变的;
b:current_weight,服务器目前的权重。一开始为0,之后会动态调整。 - 每次当请求到来,选取服务器时,会遍历数组中所有服务器。对于每个服务器,让它的current_weight增加它的weight;同时累加所有服务器的weight,并保存为total。
- 遍历完所有服务器之后,如果该服务器的current_weight是最大的,就选择这个服务器处理本次请求。最后把该服务器的current_weight减去total。
执行过程(直接把别人的结果拿过来了):
最小连接
最小连接存在的是非常必要的。因为之前加权轮训是建立在 所有请求都是短连接,不会占用服务器资源的情况下。但是实际情况下,每个连接占用的时间长短是不一样的。可以利用的资源也是一直变化的,所以应该动态考虑。
1. 第一步计算 link-count/weight 按照这个选择连接最少的 server。
参考
http://www.cnblogs.com/SmartLee/p/5161415.html
https://blog.csdn.net/gqtcgq/article/details/52076997