1 加权轮询算法背景

轮询算法没有考虑每台服务器的处理能力,实际情况是每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,加权轮询算法的原理就是:根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能接受相应权值数的服务请求。

首先看一个简单的Nginx负载均衡配置。

http {upstream cluster {server a weight=1;server b weight=2;server c weight=4;}
...
}

   按照上述配置,Nginx每收到7个客户端的请求,会把其中的1个转发给后端a,把其中的2个转发给后端b,把其中的4个转发给后端c。

2 加权轮询算法描述

假设有 N 台实例 S = {S1, S2, …, Sn},配置权重 W = {W1, W2, …, Wn},有效权重 CW = {CW1, CW2, …, CWn}。每个实例 i 除了存在一个配置权重 Wi 外,还存在一个当前有效权重 CWi,且 CWi 初始化为 Wi;指示变量 currentPos 表示当前选择的实例 ID,初始化为 -1;所有实例的配置权重和为 weightSum;

那么,调度算法可以描述为:

  1. 初始每个实例 i 的 当前有效权重 CWi 为 配置权重 Wi,并求得配置权重和 weightSum;
  2. 选出 当前有效权重 最大 的实例,将 当前有效权重 CWi 减去所有实例的 权重和 weightSum,且变量 currentPos 指向此位置;
  3. 将每个实例 i 的 当前有效权重 CWi 都加上 配置权重 Wi;
  4. 此时变量 currentPos 指向的实例就是需调度的实例;
  5. 每次调度重复上述步骤 2、3、4;

上述 3 个服务,配置权重和 weightSum 为 7,其调度过程如下:

请求 选中前的当前权重 currentPos 选中的实例 选中后的当前权重
1 {4, 2, 1} 0 a {-3, 2, 1}
2 {1, 4, 2} 1 b {1, -3, 2}
3 {5, -1, 3} 0 a {-2, -1, 3}
4 {2, 1, 4} 2 c {2, 1,-3 }
5 {6, 3, -2} 0 a {-1, 3, -2}
6 {3, 5, -1} 1 b {3, -2, -1}
7 {7, 0, 0} 0 a {0, 0, 0}

生成的序列是{a, b, a, c, a, b, a},发给后端的服务都分散开了,不在连续了。

3 代码实现

#include <iostream>
#include <string>
#include <vector>
#include <numeric>using namespace std;typedef struct
{int weight;int cur_weight;string  name;
}server;vector<server> initServers(vector<string>&  names, vector<int> weights)
{int i = 0;vector<server> ss(weights.size());for (i = 0; i < weights.size(); i++){ss[i].weight = weights[i];ss[i].name = names[i];ss[i].cur_weight = 0;}return ss;
}int getNextServerIndex(vector<server>& ss, int total)
{int i;int index = -1;for (i = 0; i < ss.size(); i++){ss[i].cur_weight += ss[i].weight;if (index == -1 || ss[index].cur_weight < ss[i].cur_weight){index = i;}}ss[index].cur_weight -= total;return index;
}void wrr_nginx(vector<server>&ss, vector<int > weights)
{int i = 0;int index = -1;int sum = accumulate(weights.begin(),weights.end(),0);for (i = 0; i < sum; i++){index = getNextServerIndex(ss, sum);printf("%s ", ss[index].name.c_str());}printf("\n");
}int main()
{int i = 0;vector<int > weights = { 4, 2, 1 };vector<string > SerVerNames = { "a", "b", "c" };vector<server> ss = initServers(SerVerNames, weights);printf("server is : \n ");for (i = 0; i < ss.size(); i++){printf("server %s  weight = %d\n ", ss[i].name.c_str(), ss[i].weight);}printf("\n");printf("\nwrr_nginx sequence is : ");wrr_nginx(ss, weights);system("pause");return 0;
}

负载均衡算法 : 加权轮询相关推荐

  1. 负载均衡算法--加权轮询法(Weight Round Robin)

    接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...

  2. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...

  3. 负载均衡之加权轮询算法

    在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin). 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法.它的原理 ...

  4. nginx负载均衡之加权轮询

    当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容.nginx尽可能的把请求分摊到各个 ...

  5. 负载均衡算法-权重轮询均衡

    ②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.

  6. 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  7. js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  8. Nginx负载均衡策略之轮询与加权轮询

    轮询 是upstream模块负载均衡默认的策略.每个请求会按时间顺序逐个分配到不同的后端服务器.轮询不需要额外的配置. upstream backend{server 192.168.200.146: ...

  9. php管理智能dns,负载均衡之DNS轮询

    域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服务器, ...

  10. 负载均衡之DNS轮询

    大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...

最新文章

  1. Java项目:宿舍管理系统(java+jsp+SSM+Spring+mysql)
  2. 20181013xlVba导入成绩
  3. Swift之从SIL深入分析函数的派发机制
  4. matlab三相异步电动机仿真,MATLAB中的三相异步电动机仿真
  5. science图表_Science:组合图表绘制
  6. FXRibbon 1.2版发布
  7. 【原理+实战+视频+源码】docker映射端口教程
  8. Python中类、对象与self详解
  9. 前端学习(3312):redux的正确构建
  10. win7系统如何开启udma功能
  11. 理论基础 —— 查找 —— 二分查找
  12. Python --之练习题
  13. D92-02-ASEMI低压降快恢复二极管TO247封装
  14. 【尚硅谷】JavaScript基础实战丨JS入门到精通_01-06
  15. 微服务架构学习与思考(03):微服务总体架构图解
  16. 抖音超火JavaScript实现网红太空人表盘 ~看程序员是如何用代码做华为太空手表
  17. 小米手机与计算机如何连接网络连接,小米手机怎么通过电脑上网如何将手机与电脑相连...
  18. 人大金仓命令行客户端工具KSQL系列1
  19. SpringBoot之从零搭建网站(可提供源码)
  20. ubuntu16.04下qt5.14报错:/home/XXXXX/Qt5.14.1/5.14.1/gcc_64/include/QtGui/qopengl.h:141: error: GL/

热门文章

  1. 在Ubuntu和CentOS上搭建NodeJs的执行环境步骤
  2. 苹果8p吃鸡服务器没有响应,今天绝地求生更新之后进不去了,一进开始界面就游戏未响应:为什么绝地求生更新完进不去...
  3. php单独使用blade模板引擎,laravel 基础教程 —— Blade 模板引擎
  4. ServletResponse的getOutputStream()与getWriter()使用冲突
  5. MongoDB实战(11)Sharding 分片(上)
  6. C++malloc,calloc,realloc,free函数
  7. AIX errpt 命令输出说明
  8. 从别的网站摘抄的,挺有用的
  9. flash制作文字笔顺_flash动画课件制作有什么优点
  10. 图解java_图解 Java 中的数据结构及原理!