负载均衡算法WRR介绍
来源:互联网 发布:蹭网软件下载 编辑:程序博客网 时间:2024/05/29 18:37
一、负载均衡
负载均衡是一个很大的概念,既有从硬件层面来解决问题的,又有从软件层面解决的,有关负载均衡的介绍,推荐阅读: http://os.51cto.com/art/201108/285359.htm,(11年的文章你会不会吐槽我不负责任)
本文主要介绍负载均衡算法中很简单的一种WRR(Weighted Round Robin),加权轮训调度算法,并且配合实现以及对它存在问题进行分析和提出一些优化策略。
二、原始的WRR算法
假设有3台机器a,b,c权重分别为5,1,1,原始的WRR算法实现是:每次选出权重最大的,给其权重减1,直到权重全部为0后,按照此时生成的序列轮训。
算法很容易理解,最终确定的轮序序列是a,a,a,a,a,b,c
,虽然此时负载是均衡的(5:1:1),但是前五次都去访问了a机器,b和c机器是空闲的,这样并不是最好的,理想状态是在均衡的情况下让访问次数也均衡开,于是就有了下面的SWRR(Smooth Weighted Round Robin),平滑加权轮训调度算法。
三、改进的SWRR算法
继续上面的例子,这次我们的策略是:
- 从权重中选出最大的,减去总权重
- 然后再给每个权重加上自身权重初始值
- 再次轮训,直到权重为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
的序列,但是我们不完全按照这个序列轮训,在每台机器上可以随机选择一个开始,那生成的序列就可能变成下面这样:
这样能降低些第一台机器被爆掉的概率。
[完]
- 负载均衡算法WRR介绍
- 负载均衡的原理与算法介绍
- 负载均衡的原理与算法介绍
- 负载均衡技术介绍
- 负载均衡技术介绍
- 负载均衡的介绍
- F5负载均衡介绍
- 负载均衡技术介绍
- LVS负载均衡介绍
- 网站负载均衡介绍
- 负载均衡介绍
- 负载均衡算法的简单介绍及实现!
- nignx 负载均衡的几种算法介绍
- 负载均衡--服务器集群负载均衡算法
- 负载均衡算法
- 负载均衡算法小结
- 负载均衡算法大全
- 负载均衡算法随笔
- 标准IO缓冲详解全缓冲、行缓冲、不缓冲
- javaweb 的错误信息在tomcat的位置
- Java+Selenium3方法篇11-findElement之By CSS
- 关于ListView嵌套ListView,外层Item点击事件的冲突解决
- 浅谈类加载器
- 负载均衡算法WRR介绍
- Java读取复制超大文件加速
- SVM中的核函数
- java填充替换数组元素
- poj2774
- 利用PHPExcel导出Excel并设置Excel格式
- CodeForces #157(258A|258B|258C|258D|258E)|数位DP|搜索|线段树
- Could not connect to SMTP host: smtp.163.com, port: 25;阿里云 ECS
- Master启动的源码详解