负载均衡算法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介绍的更多相关文章
- IPVS和Nginx两种WRR负载均衡算法详解
动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了! ...
- 负载均衡集群介绍、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 ...
- QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法
前言 在阿里七层流量入口接入层(Application Gateway)场景下, Nginx 官方的Smooth Weighted Round-Robin( SWRR )负载均衡算法已经无法再完美施展 ...
- Linux centosVMware 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建
一.负载均衡集群介绍 主流开源软件LVS.keepalived.haproxy.nginx等 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做 ...
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
Netflix:['netfliːks] ribbon:英[ˈrɪbən]美[ˈrɪbən]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状; L ...
- Load Balancing with NGINX 负载均衡算法
Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...
- spring-cloud-starter-ribbon提供客户端的软件负载均衡算法
Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- Ribbon核心组件IRule及配置指定的负载均衡算法
Ribbon在工作时分为两步: 第一步:先选择 EurekaServer,它优先选择在同一个区域内负载较少的Server: 第二步:再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地 ...
随机推荐
- java中避免集合死链调用
目录 1. 前言 2. 场景 3. 环境 3.1 开发环境准备 3.2 数据准备 3.2.1 Mysql数据库表及数据 3.2.2 redis库数据 4. 解决方式 5.完整代码 5.1Model 5 ...
- Jmeter扩展组件开发(4) - 自定义参数的实现
CODE //URLNAME 就是在图形化界面当中显示的变量名称private static final String URLNAME = "URL";//设置界面当中默认显示的变 ...
- Linux系列(29) - rpm包命名规则(1)
RPM包命名规则 例如包名:httpd-2.2.15-15.el6.centsos.1.i686.rpm 软件包名-httpd 软件版本-2.2.15 发布的次数-15 el6.centos适合的Li ...
- Github新手入门
git入门项目:https://guides.github.com/activities/hello-world/ 创建存储库 创建一个分支 进行并提交更改 打开拉取请求 合并您的拉取请求
- java 163邮箱验证
第一步:引入工具类 import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; i ...
- 怎么使用chrome浏览器查看内存是否有泄漏
一:什么是内存泄漏 javaScript会在创建变量时分配内存并且在不适用变量时会自动的释放内存,这个释放内存的过程极为垃圾回收,程序运行需要内存,只要程序提出要求操作系统或者运行时就必须提供内存,对 ...
- iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统,vmware、openEuler、postgresql、netcore、nginx、ineuos一站式部署
目 录 1. 概述... 3 2. 创建虚拟机&安装华为欧拉(openEuler)系统... 4 2.1 创建新的虚拟机... 4 2.2 ...
- kubeadm 命令简介
kubeadm 命令 kubeadm init 启动一个kubernetes主节点 kubeadm join 启动一个kubernetes工作节点并加入到集群中 kubeadm upgrade 更新一 ...
- UDP用户数据报
UDP 用户数据报协议UDP只在IP的数据报服务之上增加了很少的一个功能,就是复用,分用,差错检测功能.UDP的主要特点是: UDP是无连接的,即在发送数据报之前不需要建立连接(当然发送数据结束的时候 ...
- [USACO10NOV]Buying Feed G
part 1 暴力 不难发现有一个 $\mathcal O(K^2n)$ 的基础 dp: $$f_{i,j+l}=\min(f_{i,j+l},f_{i-1,j}+(x_i-x_{i-1})jj+c_ ...