应用负载均衡之LVS(五):lvs和nginx的wrr加权调度算法规律分析
返回LVS系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
加权调度算法(wrr)是一种很常见的调度算法。它们按照权重比例进行调度,但实际调度选中的节点顺序可能和想象中并不一样。它们有各自的算法支持,但无论什么算法,对于a、b、c三个节点,如果它们的权重比例为a:b:c=x:y:z,在节点都健康的情况下,每一轮轮询过程中a总是被选中x次,b总是被选中y次,c总是被选中z次,只不过被选中的顺序可能因算法不同而不同,
所以,本文主要介绍lvs和nginx的wrr算法是如何计算的。
lvs的wrr调度算法
1.加权调度算法公式
首先,给一个LVS官方手册给的加权调度算法公式:
假设有一组服务器S = {S0, S1, …, Sn-1},W(Si)表示服务器Si的权值,一个
指示变量i表示上一次选择的服务器,指示变量cw表示当前调度的权值,max(S)
表示集合S中所有服务器的最大权值,gcd(S)表示集合S中所有服务器权值的最大
公约数。变量i初始化为-1,cw初始化为零。
while (true) {
i = (i + 1) mod n;
if (i == 0) {
cw = cw - gcd(S);
if (cw <= 0) {
cw = max(S);
if (cw == 0)
return NULL;
}
}
if (W(Si) >= cw)
return Si;
}
比如,A、B、C三个后端的权重比是2:3:4,那么一个调度循环内的调度顺序是CBCABCABC。
如果你不想从算法公式里找规律,那么看下面。
2.加权调度通俗规律
记住三个权重调度规则:
1.先约分
2.从最大权重开始调度
3.同权重的后端,从前向后调度
例如,三台后端A:B:C=2:3:4。这里没法约分。
- 调度C
调度之后,比率变成A:B:C=2:3:3,B和C权重相同,从B开始调度 - 调度B
调度之后,比率变成A:B:C=2:2:3,所以下次调度C - 调度C
调度之后,比率变成A:B:C=2:2:2,下次从A开始
当权重全部调整到相同值时,就按照先后顺序不断循环,直到调度完所有权重 - 调度A,调度之后,比率变成
A:B:C=1:2:2 - 调度B,调度之后,比率变成
A:B:C=1:1:2 - 调度C,调度之后,比率变成
A:B:C=1:1:1 - 调度A,调度之后,比率变成
A:B:C=0:1:1 - 调度B,调度之后,比率变成
A:B:C=0:0:1 - 调度C,调度之后,比率变成
A:B:C=0:0:0 - 进入下一个调度循环,顺序是:CBCABCABC
所以,每个调度循环的调度顺序为:CBCABCABC
调度过程如下图:

再给个示例,A:B:C:D=2:4:6:8
首先约分,得到A:B:C:D=1:2:3:4
- 调度D
- 调度C
- 调度D
- 调度B
- 调度C
- 调度D
- 调度A
- 调度B
- 调度C
- 调度D
所以,调度顺序是DCDBCDABCD。
nginx的wrr调度算法
以前nginx的wrr调度算法和lvs的算法类似,都是直接剃短高权重节点的权重值,最后趋于均衡。但这样的算法实际上对请求而言并不均衡,比如a:b:c = 5:1:1,调用的顺序将是aaaaabc、aaaaabc,a将被连续多次调用。
后来nginx的wrr算法改进了,变得更复杂一些,但更趋于调度均衡。
假设a:b:c=A:B:C,算法是这样的:
- 所有权重加总得到总权重(total):A+B+C=N
- 第一个请求进来,选择权重最大的。假设为a,于是选中A。选中之后,对选中的节点的权重减去总权重N,于是现在的比例是
a:b:c=A-N:B:C - 第二个请求进入,将比如全部加上原始比例(eff_weight),得到
(A-N+A):(B+B):(C+C),然后选中最大的权重节点,假如选中B。选中之后,对选中的节点的权重减去总权重N,于是比例变为(2A-N):(2B-N):2C - 之后每个请求进来,都首先加上原始比例,然后选择权重最大的,并对最大的权重值减去总权重N。
- 每一轮询的最后一次调度,都会使被选中的节点权重变为N,其它权重变为0,减去总权重之后全部变成0,使得下一轮轮询调度开始,重新回到原始比例。
例如,a:b:c=4:3:2的调度过程为:总权重为4+3+2=9
- 第1个请求,a权重最大,选中a
- 选中之后,比例变为
a:b:c=-5:3:2
- 选中之后,比例变为
- 第2个请求,加上原始比例,得到
a:b:c=-1:6:4,选中b- 选中之后,比例变为
a:b:c=-1:-3:4
- 选中之后,比例变为
- 第3个请求,加上原始比例,得到
a:b:c=3:0:6,选中c- 选中之后,比例变为
a:b:c=3:0:-3
- 选中之后,比例变为
- 第4个请求,加上原始比例,得到
a:b:c=7:3:-1,选中a- 选中之后,比例变为
a:b:c=-2:3:-1
- 选中之后,比例变为
- 第5个请求,加上原始比例,得到
a:b:c=2:6:1,选中b- 选中之后,比例变为
a:b:c=2:-3:1
- 选中之后,比例变为
- 第6个请求,加上原始比例,得到
a:b:c=6:0:3,选中a- 选中之后,比例变为
a:b:c=-3:0:3
- 选中之后,比例变为
- 第7个请求,加上原始比例,得到
a:b:c=1:3:5,选中c- 选中之后,比例变为
a:b:c=1:3:-4
- 选中之后,比例变为
- 第8个请求,加上原始比例,得到
a:b:c=5:6:-2,选中b- 选中之后,比例变为
a:b:c=5:-3:-2
- 选中之后,比例变为
- 第9个请求,加上原始比例,得到
a:b:c=9:0:0,选中a- 选中之后,比例变为
a:b:c=0:0:0
- 选中之后,比例变为
一轮循环完成,调度的顺序是a b c a b a c b a,这轮循环完成之后,它们的比例变为0:0:0,下一个请求到来,加上原始权重后回到原比例4:3:2。
如果是两后端节点,它们的比例为3:1,它们的调度顺序将是aaba aaba aaba...
应用负载均衡之LVS(五):lvs和nginx的wrr加权调度算法规律分析的更多相关文章
- 架构设计:负载均衡层设计方案(3)——Nginx进阶
版权声明:欢迎转载,但是看在我辛勤劳动的份上,请注明来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) 目录(?)[-] Nginx继续进阶 1gzip ...
- 架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层
1.概述 前两遍文章中,我们一直在说后文要介绍Nginx + Keepalived的搭建方式.这篇文章开始,我们就来兑现前文的承诺,后续的两篇文章我们将介绍Nginx + Keepalived和 LV ...
- Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)
Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...
- LVS负载均衡+动静分离+高可用(nginx+tomcat+keepalived)
文章目录 [隐藏] 一.环境介绍 二.环境安装 1.安装JDK 2.两台服务器安装tomcat 3.nginx安装 4.keepalive安装 三.负载均衡 四.动静分离 五.keepalive高可用 ...
- 亚洲唯一,阿里云SLB位列Gartner全球网络负载均衡市场前五
近日,Gartner发布了最新的全球企业级网络设备市场份额报告“Market Share: Enterprise Network Equipment by Market Segment, Worldw ...
- 生产环境使用nginx做负载均衡配置的五种策略
nginx的upstream目前支持5种方式的分配1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weight和访 ...
- 架构设计:负载均衡层设计方案(2)——Nginx安装
来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) 目录(?)[-] Nginx重要算法介绍 1一致性Hash算法 2轮询与加权轮询 Nginx的安装 1 ...
- asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)
概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚 ...
- 负载均衡集群之LVS的DR模型详解(Diretor Routing)
LVS的默认模型:默认模型DR DR模型原理图--> 在讲DR模型要点之前,需要了解网络的相关知识: 接收的报文拆解顺序:帧(MAC)-->数据包(IP)-->数据报文(port) ...
随机推荐
- 交叉编译ffmpeg(hi3520d)
./configure \--prefix=/usr/local/ffmpeg-3520D \--cross-prefix=/opt/hisi-linux-nptl/arm-hisiv100-linu ...
- roadhog如何支持除development和production外的其他环境变量配置
roadhog的build和start脚本分别对应了env/development和production,但实践中存在第三种开发环境(可能是预发或集成测试),配置和前两种也都不一样,但现在似乎没办法支 ...
- java 保证程序安全退出
以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...
- 7-unittest和requests重构、封装处理get/post请求
1.概念说明 ① unittest:python中自带的单元测试框架,封装了一些校验返回的结果方法和一些用例执行前的初始化操作 ② TestCase:测试用例 ③ TestSuite:测试套,即多个测 ...
- 装mongondb数据库
装mongondb数据库装好以后进入c盘mongondb bin里边 复制地址 将其放入环境变量里边 放之前需要往前边加一个英语的;在 d盘 建一个data文档 里边简历一个db文件夹 cmd命令框输 ...
- Rabbitmq的使用及Web监控工具使用
本文转载自:https://www.cnblogs.com/gossip/p/4475978.html windows安装手册请参考:http://www.rabbitmq.com/install-w ...
- 【腾讯Bugly干货分享】人人都可以做深度学习应用:入门篇
导语 2016年,继虚拟现实(VR)之后,人工智能(AI)的概念全面进入大众的视野.谷歌,微软,IBM等科技巨头纷纷重点布局,AI 貌似将成为互联网的下一个风口. 很多开发同学,对人工智能非常感兴趣, ...
- MyBatis 源码分析系列文章合集
1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...
- win7中调试Hotspot
预置: 1.Visual Studio 2010 2.CYGWIN(设置到path中) 3.jdk(设置到path中) 4.Framework4(系统如果有就不需要安装) 5.win7 sdk 7.1 ...
- Java学到什么程度才能叫精通?
把下面这些内容掌握以后,你就可以自诩精通Java后端了. 1 计算机基础 这部分内容是计算机相关专业同学的课程,但是非科班的小伙伴(譬如在下)就需要花时间恶补了. 特别 是计算机网络,操作系统 ...