返回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。这里没法约分。

  1. 调度C
    调度之后,比率变成A:B:C=2:3:3,B和C权重相同,从B开始调度
  2. 调度B
    调度之后,比率变成A:B:C=2:2:3,所以下次调度C
  3. 调度C
    调度之后,比率变成A:B:C=2:2:2,下次从A开始
    当权重全部调整到相同值时,就按照先后顺序不断循环,直到调度完所有权重
  4. 调度A,调度之后,比率变成A:B:C=1:2:2
  5. 调度B,调度之后,比率变成A:B:C=1:1:2
  6. 调度C,调度之后,比率变成A:B:C=1:1:1
  7. 调度A,调度之后,比率变成A:B:C=0:1:1
  8. 调度B,调度之后,比率变成A:B:C=0:0:1
  9. 调度C,调度之后,比率变成A:B:C=0:0:0
  10. 进入下一个调度循环,顺序是:CBCABCABC

所以,每个调度循环的调度顺序为:CBCABCABC

调度过程如下图:

再给个示例,A:B:C:D=2:4:6:8

首先约分,得到A:B:C:D=1:2:3:4

  1. 调度D
  2. 调度C
  3. 调度D
  4. 调度B
  5. 调度C
  6. 调度D
  7. 调度A
  8. 调度B
  9. 调度C
  10. 调度D

所以,调度顺序是DCDBCDABCD。

nginx的wrr调度算法

以前nginx的wrr调度算法和lvs的算法类似,都是直接剃短高权重节点的权重值,最后趋于均衡。但这样的算法实际上对请求而言并不均衡,比如a:b:c = 5:1:1,调用的顺序将是aaaaabc、aaaaabc,a将被连续多次调用。

后来nginx的wrr算法改进了,变得更复杂一些,但更趋于调度均衡。

假设a:b:c=A:B:C,算法是这样的:

  1. 所有权重加总得到总权重(total):A+B+C=N
  2. 第一个请求进来,选择权重最大的。假设为a,于是选中A。选中之后,对选中的节点的权重减去总权重N,于是现在的比例是a:b:c=A-N:B:C
  3. 第二个请求进入,将比如全部加上原始比例(eff_weight),得到(A-N+A):(B+B):(C+C),然后选中最大的权重节点,假如选中B。选中之后,对选中的节点的权重减去总权重N,于是比例变为(2A-N):(2B-N):2C
  4. 之后每个请求进来,都首先加上原始比例,然后选择权重最大的,并对最大的权重值减去总权重N。
  5. 每一轮询的最后一次调度,都会使被选中的节点权重变为N,其它权重变为0,减去总权重之后全部变成0,使得下一轮轮询调度开始,重新回到原始比例。

例如,a:b:c=4:3:2的调度过程为:总权重为4+3+2=9

  1. 第1个请求,a权重最大,选中a

    • 选中之后,比例变为a:b:c=-5:3:2
  2. 第2个请求,加上原始比例,得到a:b:c=-1:6:4,选中b
    • 选中之后,比例变为a:b:c=-1:-3:4
  3. 第3个请求,加上原始比例,得到a:b:c=3:0:6,选中c
    • 选中之后,比例变为a:b:c=3:0:-3
  4. 第4个请求,加上原始比例,得到a:b:c=7:3:-1,选中a
    • 选中之后,比例变为a:b:c=-2:3:-1
  5. 第5个请求,加上原始比例,得到a:b:c=2:6:1,选中b
    • 选中之后,比例变为a:b:c=2:-3:1
  6. 第6个请求,加上原始比例,得到a:b:c=6:0:3,选中a
    • 选中之后,比例变为a:b:c=-3:0:3
  7. 第7个请求,加上原始比例,得到a:b:c=1:3:5,选中c
    • 选中之后,比例变为a:b:c=1:3:-4
  8. 第8个请求,加上原始比例,得到a:b:c=5:6:-2,选中b
    • 选中之后,比例变为a:b:c=5:-3:-2
  9. 第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...

转载于:https://www.cnblogs.com/f-ck-need-u/p/9490629.html

应用负载均衡之LVS(五):lvs和nginx的wrr加权调度算法规律分析相关推荐

  1. 运维工程师必备之负载 均衡集群及LVS详解

    原文地址:运维工程师必备之负载 均衡集群及LVS详解作者:蚁巡运维平台 来源: chrinux 的BLOG 时间: 2013-07-01 14:00 此博文主要介绍集群和负载均衡的基本理论和类别,内容 ...

  2. 构建负载均衡服务器之二 LVS详解及应用

    在上一篇中介绍了负载均衡及集群的原理,本篇主要介绍下下实现负载均衡的软件之LVS的原理及应用. 一.LVS的介绍 1.  LVS的定义 一般来说,LVS采用三层结构:负载调度器.服务器池.共享存储.工 ...

  3. 负载均衡集群介绍LVS介绍LVS调度算法LVS NAT模式搭建

    2019独角兽企业重金招聘Python工程师标准>>> 18.6 负载均衡集群介绍 • 主流开源软件LVS.keepalived.haproxy.nginx等 • 其中LVS属于4层 ...

  4. 常见的服务器集群负载均衡技术:二三四七层负载均衡,DNS、LVS、F5、nginx负载均衡

    服务器集群负载均衡技术 LB:load balance负载均衡器.有时也叫做director. DNS负载均衡 DNS负载均衡,最基础的是轮询方式,循环返回不同的服务器IP地址.可以同时返回多个服务器 ...

  5. 负载均衡层设计方案(2)——Nginx安装

    负载均衡层设计方案(2)--Nginx安装 https://blog.csdn.net/yinwenjie/article/details/46620711 前一篇文章<架构设计:负载均衡层设计 ...

  6. 负载均衡一致性哈希算法实现 | nginx 负载均衡一致性哈希源码分析 | ngx_http_upstream_consistent_hash_module 源码分析

    这是本学期分布式计算/系统课程负载均衡节的课后作业,理解七层反向代理的负载均衡 Nginx 中使用的的一致性哈希算法.开头只是讲一些没用的东西,后面主要是分析 Nginx 的 O(1) 时间复杂度的一 ...

  7. 架构设计:负载均衡层设计方案(3)——Nginx进阶

    架构设计:负载均衡层设计方案(3)--Nginx进阶 请注明来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) https://blog.csdn.net ...

  8. 运维工程师必备之负载均衡集群及LVS详解

    此博文主要介绍集群和负载均衡的基本理论和类别,内容看着比较枯燥.无味的,但是要想成为一个好的linux运维工程师,这些基本理论是必须理解透彻,才会在后来的系统调优和集群架构中得心应手,所以想成为lin ...

  9. 青蛙学Linux—高性能负载均衡集群软件LVS

    LVS,即Linux Virtual Server的简写,是目前非常流行的一款实现负载均衡集群的软件.该项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.LVS官网http: ...

最新文章

  1. UVA - 796 Critical Links(tarjan求割边)
  2. 普通二本的辛酸Android面试之路,满满干货指导
  3. C语言系列文章之#和##
  4. java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里
  5. Jeecg-Boot导入附件异常解决
  6. 大萧条来临前的几大征兆
  7. TikTok玩法攻略总结,从输出内容再到变现,结尾送干货!
  8. 利用vbs读取XML中的某个指定子叶节点 (转)
  9. Matlab实现二维数字图像相关(2D Digital Image Correlation, 2D-DIC)【ADIC2D代码复现及原理介绍】
  10. qq怎样发起临时会话(不加好友)
  11. Spring 注解的原理
  12. mysql tddl_tddl的使用
  13. 徐思/杨玲《面向对象程序设计(Java)》第十一周学习总结
  14. c++中计算2得n次方_【复习专题】解析二元一次方程知识点及应用
  15. 傅里叶级数构建信号要求频率有正有负_电子科大学长说—信号与系统考研例题详解重点习题...
  16. 快速可靠网络传输协议 KCP
  17. Mac 破解百度云盘限速下载问题
  18. Flink 累加器Accumulator
  19. 做一个简单网页(做一个简单网页多少钱)
  20. GIT提交错误汇总及解决方案

热门文章

  1. JTS-Angle GIS几何角度计算使用说明(十八)
  2. 《2023世界棒球经典赛》:走进殿堂级赛事
  3. 银联银行卡卡号java_编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类...
  4. java 获取主机名_在Java中获取主机名的推荐方法
  5. 如何让学习python像玩游戏一样上瘾
  6. clone和fork的区别linux,fork clone 和 fork 的区别
  7. “数字云南”建设成效逐渐显现 区块链财政电子票据带来民生与环保效益
  8. unity-贴图压缩格式
  9. 金桥太茂商业广场——好奇5界 黄金周庆典
  10. 未来可期,必须一起变得牛杯!!!