• Nginx负载均衡算法


    目前只有思路,过两天上代码。。。。。。

    加权轮询

    服务器    权重

    A     5

    B     3

    C     2

    1)总的权重是10,先随机出一个数字(肯定是10以内的数字)

    2)然后遍历权重的数组[5,3,2]一个一个的去比较

    核心代码

             遍历ip 拿到权重weight

        if(offset<weight) return ip else offset=offset-weight

    数形结合

    权重坐标:

    0————5——8—10

          A  B C

    如果offset小于5就直接返回IP A

    如果offset大于5 比如是7 就 用7减去当前的5得到offset=2

    此时权重坐标是:

    0——3—5

       B C

    然后下次遍历2落在B的位置 直接返回IP B 

    这种算法的好处和List相比 如果有个权重100 List需要放100个对象,而这种算法比较省空间

    平衡加权轮询

    服务器    权重

    A     5

    B     1

    C     1

    如果请求

    AAAAABC对ABC三个服务器不够平衡

    AABABAC 我们想要请求这个结果  Nginx 平衡加权轮询算法

    这时我们需要增加一个动态权重变量 currentWeight

    返回结果AABACAA 达到了平均加权轮询的目的,这个算法的过程写在图上面了,过两天上代码

    一致性哈希

    普通Hash算法

     假设我们有三台服务器 S1 S2 S3。我们有三万张图片据需要缓存到服务器上,这些数据最好均匀的分配到服务器上。

      1)hash(图片名称)%机器数=余数。 如果有三台服务器 取模的结果就是0 1 2 与服务器编号对应

      2)对同一条数据做相同的hash计算时得到的数据时不变的,访问图片的时候 对图片进行hash计算 就可以知道图片缓存在哪台服务器上

    通过这种算法 就可以将三万张图片缓存在三台服务器上,而且下次访问图片时 就能直接计算出图片缓存在哪台服务器上,这种算法就是哈希算法

    哈希算法缺陷:

      服务器从3台变成4台  hash(图片名称)%机器数(由3变成4) 得到的余数会发生变化,这里由于缓存服务器数量发生变化,导致不能正常访问缓存数据,大量缓存同一时间失效,导致缓存雪崩

    改进:一致性Hash算法

      一致性Hash算法由一个哈希环组成 环上又2的32次方个点

      1)Hash(A)%2的32次方=结果,结果的值在0到2的32次方之间,可以把服务器A B C映射到哈希环上。

      2)用同样的方法 可以把要缓存的对象映射到哈希环上 Hash(图片名称)%2的32次方

      3)确定图片需要缓存在哪一台服务器上:图片位置 瞬时间旋转,遇到第一个服务器的位置,就是图片锁存放的缓存服务器

    假设增加了一台服务器D 会有部分图片沿顺时针遇到的第一台缓存服务器就由服务器A变成了服务器D

    这样 每增加一台服务器会有一小部分图片缓存失效,无法访问 大部分图片依然可以正常访问 避免了缓存雪崩

    (如果ABC不是均匀的分散在Hash环上,距离很近)导致缓存分部极度不均匀 这就是Hash偏斜。解决办法:增加一层虚拟节点

      

    具体进行缓存读写时:——>先找到虚拟节点——>虚拟节点在找到真实节点——>缓存的读取和存储

  • 相关阅读:
    第八周上机练习
    第七周作业
    第七周上机作业
    第六周作业
    第六周上机作业
    第五周上机作业
    第四周作业
    第四周上机练习
    第三周作业
    第一次上机作业
  • 原文地址:https://www.cnblogs.com/ssskkk/p/13557470.html
Copyright © 2020-2023  润新知