负载均衡算法WRR介绍
一、负载均衡
负载均衡是一个很大的概念,既有从硬件层面来解决问题的,又有从软件层面解决的,有关负载均衡的介绍,推荐阅读: 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介绍相关推荐
- 100行代码实现加权负载均衡算法(WRR)
轮询算法round-robin是很基础的负载均衡算法,实际应用中wrr更为常见,但一般不需要自己实现,因为一般需要rr的场景,都已经在基础设施层面进行了支持,比如lvs或nginx通过配置即可实现,但 ...
- 负载均衡集群介绍、LVS介绍、LVS调度算法、 LVS NAT模式搭建
负载均衡集群介绍 LVS介绍 lvs的NAT模式介绍 这种模式借助iptables的nat表来实现,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的服务器上去,这些服务 ...
- 18.6 负载均衡集群介绍 18.7 LVS介绍 18.8 LVS调度算法 18.9/18.10 LVS NAT模式搭建
2019独角兽企业重金招聘Python工程师标准>>> 18.6 负载均衡集群介绍 实现负载均衡集群的软件有:LVS.Keepalived.Nginx.haproxy等.其中LVS属 ...
- LVS三种模式的区别及负载均衡算法
转载自 LVS三种模式的区别及负载均衡算法 LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统,由章文嵩博士在1998年5月成立,在li ...
- QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法
前言 在阿里七层流量入口接入层(Application Gateway)场景下, Nginx 官方的Smooth Weighted Round-Robin( SWRR )负载均衡算法已经无法再完美施展 ...
- 负载均衡集群介绍LVS介绍LVS调度算法LVS NAT模式搭建
2019独角兽企业重金招聘Python工程师标准>>> 18.6 负载均衡集群介绍 • 主流开源软件LVS.keepalived.haproxy.nginx等 • 其中LVS属于4层 ...
- LVS负载均衡集群介绍(4种工作模式10种调度算法)
文章目录 集群简介 集群的特点 集群的分类 负载均衡 负载均衡集群技术的实现 负载均衡分类 四层负载均衡(基于IP+端口的负载均衡) 七层的负载均衡(基于虚拟的URL或主机IP的负载均衡) 高可用性集 ...
- Nginx负载均衡集群介绍
第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...
- 自古帝王多短命,假如皇帝也懂负载均衡算法...
" 大家都知道古代皇帝各个都是后宫佳丽三千,而皇帝身上都天然的带着雨露均沾的精神,不想单独的宠爱一人! 来自:51cto技术栈 弱水三千,又怎舍得只取一瓢饮?据传皇帝们晚上睡觉个个都怕冷,因 ...
最新文章
- 带你进入String类的易错点和底层本质分析!
- 无需写代码的高颜值富集分析神器
- Java中的中介器设计模式
- 一个回滚段收缩的实例
- ubuntu18 安装redis-manager
- 54include对象
- 9、C语言 —— 指针的用处
- SPH(光滑粒子流体动力学)流体模拟实现四:各向异性(Anisotropic)表面光滑(1)
- [源码和文档分享]基于C语言实现的流星雨模拟课程设计
- abb工业机器人电压不稳_ABB工业机器人应用常见故障九问九答
- placeholder字体大小以及颜色的修改
- Deep Learning-Deep feedforward network
- 惠普打印机换硒鼓图解_惠普激光打印机硒鼓安装方法(图文)
- c语言读写csv文件
- median函数的使用方法_如何在Google表格中使用MEDIAN函数
- 猫有哪些比较常见的肢体语言?
- 信息安全-保研面试经历总结
- The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY A4
- fatal error C1859的有效解决办法
- 旋转卡壳算法求最小外接矩形代码
热门文章
- SpringBoot整合easyexcel实现Excel的导出
- Ubuntu查看定时任务执行日志
- 上海亚商投顾: 市场调整分化 两市成交额再创阶段新低
- 牛客15334 Easygoing Single Tune Circulation
- python菜鸟教程 | 乘法口诀
- springboot2.3.7升级到springboot2.7.2
- Dockerfile创建Ubuntu镜像实践
- Effective Modern C++ 纯人工翻译,持续更新,不为博你眼球,旨在自我提升
- Verilog -- 无符号整数除法器(二)
- 网易 java社招面试_《最新面经》—网易Java岗社招面试经历分享