IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> NGINX平滑加权轮询算法 -> 正文阅读

[系统运维]NGINX平滑加权轮询算法

问题描述

有三个节点{a, b, c},它们的权重分别是{a=5, b=1, c=1},发送7次请求,要求:

  1. 根据权重分配:a会被分配5次,b会被分配1次,c会被分配1次
  2. 分配尽可能平滑:尽可能均匀的分摊节点,节点分配不再是连续的,如{a, a, a, a, a, b, c},即前5次可能选中的都是a,这可能造成权重大的服务器造成过大压力的同时,小权重服务器还很闲

NGINX平滑加权轮询算法

算法涉及的几个概念

  1. weight:约定权重,在配置文件 or 初始化时指定的每个节点的权重;
  2. effectiveWeight:有效权重,作用是节点异常,降低其权重,初始值为 weight
    在通讯过程中发现节点异常,则-1;
    之后再次选取本节点,调用成功一次则+1,直达恢复到weight;
  3. currentWeight:节点当前权重,初始化为 0;

算法逻辑

  1. 计算总权重totalWeight = sum(各节点的effectiveWeight);

  2. 计算每个节点的currentWeight = currentWeight + effectiveWeight;

    选择所有节点中currentWeight最大的作为选中节点;

    选中节点的currentWeight = currentWeight - totalWeight;

  3. 再次选择时重复第2步;

以 {a=4,b=2,c=1} 为例,这里为了方便,effectiveWeight即为weight,totalWeight=7,初始currentWeight = {0,0,0},每次选择:

第i次选择选择前currentWeight选择选择后currentWeight
1{4,2,1}a{-3,2,1}
2{1,4,2}b{1,-3,2}
3{5,-1,3}a{-2,-1,3}
4{2,1,4}c{2,1,-3}
5{6,3,-2}a{-1,3,-2}
6{3,5,-1}b{3,-2,-1}
7{7,0,0}a{0,0,0}
8{4,2,1}a{-3,2,1}

可以看到,选择序列为{a,b,a,c,a,b,a},满足平滑的按照权重分配,下一轮又是一次重新开始;

算法证明

权重合理性

对于n个节点的权重: x1, x2, … , xn,记权重总和S = x1 + x2 + … + xn,在S轮选择中,节点i被选中了mi次。

权重合理性即证明,对于任意的i(1<= i <= n),mi = xi。

证明:

  1. 首先证明,在每轮选择后,各节点当前权重总和S = 0。

    这个很好理解,也很好证明:

    对于第1轮:初始是{0, 0, …, 0},加上自己的有效权重,假设选中第j个节点,则第1轮后,权重总和为 x1+x2+…+xj-S+x(j+1)+…+xn=0

    假设第k轮后权限总和为0,那么在k+1轮时,先加上自己的有效权重,再在选中节点上减去权重总和,S(k)+x1+…+xn-S = 0+S-S=0

  2. 其次证明S轮选择中, mi = xi (1<=i<=n)

    1. 证明 mi <= xi

      一共执行S轮,设节点i一共被选中了mi次,S轮后节点i的权重为wi

      假设mi > xi,在t(t < S)轮后,已经被选中了xi次,则此时节点i的权重为 wit = xi * t - S * xi = (t - S) * xi < 0 (t < S)

      在剩下的S-t轮中,节点i 没有再被选中,则S-t轮后节点i的当前权重wiS = (t - S) * xi + (S - t) * xi = 0,说明,在S-t轮中节点i的权重<0,倘若又再被选中,则在S-t轮中节点i的权重更加小 < 0

      根据每轮选择后当前权重总和为0的结论,S-t轮的每轮中,必然存在一个节点k的当前权重>0,因此节点i在剩下S-t轮中根本不会被选中,因此 mi <= xi

    2. 由于S = m1 + m2 + … +mn = x1 + x2 + … + xn,而mi <= xi,因此 mi = xi

平滑性

平滑性即证明不会一直连续选择同一个节点(连续几轮还是有可能的)

如{10,1,1}

第i次选择选择前currentWeight选择选择后currentWeight
1{10,1,1}a{-2,1,1}
2{8,2,2}a{-4,-2,2}
3{6,3,3}a{-6,3,3}
4{4,4,4}a{-8,4,4}
5{2,5,5}b{2,-7,5}

证明:

在权重合理性证明中,可以知道,S轮选择中,节点i会被选择xi次,假设在这S轮选择中,连续选择了t次节点i

令t = xi - 1,则 wi = t * xi - t * S = (xi - 1) * xi - (xi - 1) * S

下一轮时,wi + xi = (xi - 1) * xi - (xi - 1) * S + xi = xi ^ 2 - xi * S + S = (xi - S) * xi + S - xi + xi = (xi - S) * (xi - 1) + xi

由于 xi < S,即 xi - S <= -1,wi + xi = (xi - S) * (xi - 1) + xi <= 1 - xi + xi = 1

如果这t轮刚好是最开始的t轮,则必定存在另一个结点j的值为xj,所以有wi + xi <=1< xj * t,所以下一轮肯定不会选中xi。


参考:

负载均衡算法WeightedRoundRobin(加权轮询)简介及算法实现

Nginx中的平滑加权轮询算法蕴含的数学原理是什么呢?

nginx平滑的基于权重轮询算法分析

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 17:10:50  更:2021-12-02 17:12:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:52:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码