一、负载均衡

负载均衡是一个很大的概念,既有从硬件层面来解决问题的,又有从软件层面解决的,有关负载均衡的介绍,推荐阅读: http://os.51cto.com/art/201108/285359.htm,(11年的文章你会不会吐槽我不负责任)
本文主要介绍负载均衡算法中很简单的一种WRR(Weighted Round Robin),加权轮训调度算法,并且配合实现以及对它存在问题进行分析和提出一些优化策略。

二、原始的WRR算法

假设有3台机器a,b,c权重分别为5,1,1,原始的WRR算法实现是:每次选出权重最大的,给其权重减1,直到权重全部为0后,按照此时生成的序列轮训。

请求编号 选前权重值 被选中server 选后权重值
1 5,1,1 a 4,1,1
2 4,1,1 a 3,1,1
3 3,1,1 a 2,1,1
4 2,1,1 a 1,1,1
5 1,1,1 a 0,1,1
6 0,1,1 b 0,0,1
7 0,0,1 c 0,0,0

算法很容易理解,最终确定的轮序序列是a,a,a,a,a,b,c,虽然此时负载是均衡的(5:1:1),但是前五次都去访问了a机器,b和c机器是空闲的,这样并不是最好的,理想状态是在均衡的情况下让访问次数也均衡开,于是就有了下面的SWRR(Smooth Weighted Round Robin),平滑加权轮训调度算法。

三、改进的SWRR算法

继续上面的例子,这次我们的策略是:

  • 从权重中选出最大的,减去总权重
  • 然后再给每个权重加上自身权重初始值
  • 再次轮训,直到权重为0,确定序列
请求编号 选前权重值 被选中server 选后权重值
1 5,1,1 a -2,1,1
2 3,2,2 a -4,2,2
3 1,3,3 b 1,-4,3
4 6,-3,4 a -1,-3,4
5 4,-2,5 c 4,-2,-2
6 9,-1,-1 a 2,-1,-1
7 7,0,0 a 0,0,0

说明:

  • 第一行最后的-2 , 1 , 1 是 5(当前权值最大) - 7(总权重)=-2 ,其他两个值不变得来的。
  • 第二行的 3,2, 2, 是 上一行的 -2 , 1 , 1 加 各自权重初始值 5 ,1 1 得来的。(3=-2+5 , 2 = 1+1 , 2 = 1+1)

这样我们得到的最终轮训序列是 :a,a,b,a,c,a,a ,是不是效果比之前好多了,如丝般柔顺,实现也很简单(代码中去掉了输出代码):

while (flag) {
/*找到目前的最大元素*/
auto big = std::max_element(std::begin(temp),std::end(temp));
/*找出最大元素的下标*/
auto bigIndex = std::distance(std::begin(temp),big);
temp[bigIndex] -= TOTAL; //找出的最大元素减去总权重
/*各自加上初始权重*/
for(int j = 0; j < temp.size();++j) {
temp[j] += weight[j];
}
}

但是这个算法还是存在问题:在大量并发来临的那一刻,我们第一次始终会选择a机器,那它必然就会爆掉。

应对这样的问题:我们可以在生成序列之后随机选择一个开始,比如我们有5台负载的机器,它们都生成了a,a,b,a,c,a,a的序列,但是我们不完全按照这个序列轮训,在每台机器上可以随机选择一个开始,那生成的序列就可能变成下面这样:

机器 序列
机器1 a,b,a,c,a,a…
机器2 b,a,c,a,a,a,a…
机器3 a,a,b,a,c,a,a…
机器4 c,a,a,a,a,b,a…
机器5 a,b,a,c,a,a…

这样能降低些第一台机器被爆掉的概率。

[完]

负载均衡算法WRR介绍的更多相关文章

  1. IPVS和Nginx两种WRR负载均衡算法详解

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  2. 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建

    7月4日任务 18.6 负载均衡集群介绍18.7 LVS介绍18.8 LVS调度算法18.9/18.10 LVS NAT模式搭建 扩展lvs 三种模式详解 http://www.it165.net/a ...

  3. QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法

    前言 在阿里七层流量入口接入层(Application Gateway)场景下, Nginx 官方的Smooth Weighted Round-Robin( SWRR )负载均衡算法已经无法再完美施展 ...

  4. Linux centosVMware 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建

    一.负载均衡集群介绍 主流开源软件LVS.keepalived.haproxy.nginx等 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做 ...

  5. 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

    Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     L ...

  6. Load Balancing with NGINX 负载均衡算法

    Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...

  7. spring-cloud-starter-ribbon提供客户端的软件负载均衡算法

    Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...

  8. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  9. Ribbon核心组件IRule及配置指定的负载均衡算法

    Ribbon在工作时分为两步: 第一步:先选择 EurekaServer,它优先选择在同一个区域内负载较少的Server: 第二步:再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地 ...

随机推荐

  1. (一)es 概述与安装

    一.基本概念介绍 1. es 核心术语 核心概念 ES -> 数据库 索引index -> 表 文档 document -> 行(记录) 字段 fields -> 列 早期版本 ...

  2. Fiddler抓包工具-全网最全教程,没有之一

    初识Fiddler fiddler,译为骗子 是位于客户端.服务器端的HTTP代理,是Web调试的利器. 是c#编写的程序 Fiddler主要功能: 监控http.https流量 查看.分析请求内容细 ...

  3. python线程threading

    线程示例: import threading import time # 唱歌任务 def sing(): # 扩展: 获取当前线程 # print("sing当前执行的线程为:" ...

  4. vm中安装win2012并安装hyper-V不支持嵌套

    在虚拟机中安装win2012,并安装hyper-v提示: 无法安装hyper-v:虚拟机监控程序已经在运行 找到虚拟机目录下,用文本编辑器打开该系统的虚拟机配置文件(.vmx后缀),在配置文件末尾增加 ...

  5. CF39C-Moon Craters【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/CF39C 题目大意 坐标轴上有\(n\)个圆,给出每个圆的位置\(c_i\)和半径\(r_i\). 要求选出最多的圆 ...

  6. SQL Server附加数据库错误5120处理方法

    SQL Server附加数据库5120错误 当我们从另外一台服务器复制过来的数据库,可能会有如下错误: 解决方法 1.给数据库所在文件夹增加用户Everyone并赋予完全控制权限 2.以管理员身份运行 ...

  7. FastAPI(56)- 使用 Websocket 打造一个迷你聊天室

    背景 在实际项目中,可能会通过前端框架使用 WebSocket 和后端进行通信 这里就来详细讲解下 FastAPI 是如何操作 WebSocket 的 模拟 WebSocket 客户端 #!usr/b ...

  8. VS2017离线安装QT插件出错:未能正确加载VSIX包

    问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...

  9. allure报告中allure.title 如何去掉后方的参数化显示

    1.解决方法如下 listener.py 文件位置:Lib\site-packages\allure_pytest\listener.py (第三方包所在的LIb目录) 将下图中红色部分test_re ...

  10. 8086存储器组织和IO组织 奇偶分体

    8086的存储器组织 存储器的基本存储单位是字节,每个字节用唯一的地址码表示. 若存放的信息是8位的字节数据,将按顺序存放: 若存放的信息是16位的字数据,则将字的高位字节放在高地址中,低位字节放在低 ...