NGINX 负载均衡的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012266559/article/details/82665280

前言

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

猜你喜欢

转载自blog.csdn.net/u012266559/article/details/82665280