• NGINX 负载均衡的理解


    前言

    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

  • 相关阅读:
    request.json 打印中文乱码解决
    看懂项目代码需要掌握的技能 (java语言)
    jmeter响应断言通过,结果树中却显示红色
    nginx的upstream后端名称居然变成了请求的host了?
    基于QRcode创建和识别二维码的研究
    thinkphp访问mysql中文字段问题
    apache https访问配置
    如何获得bibitem格式的参考文献
    CSharp: Image Matting
    word2vec回顾
  • 原文地址:https://www.cnblogs.com/sinpo828/p/10678958.html
Copyright © 2020-2023  润新知