nginx轮询加权算法思路

本文详细解析了Nginx中weight、effective_weight和current_weight在加权轮询算法中的作用,通过实例说明服务器按权重动态选择过程。理解权重配置有助于提高后端服务器的负载均衡效率。
摘要由CSDN通过智能技术生成

nginx可以指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:

upstream backend {
  server a weight=6;
  server b weight=3;
  server c weight=1;
}

按照配置,每有10次请求,其中6个会转发到a服务器,3个转发到b服务器,1个转发到c服务器。

每个服务器都有三个权重变量,先解释下它们的含义。

(1) weight

配置文件中指定的该服务器的权重,这个值是固定不变的。

(2) effective_weight

服务器的有效权重,初始值为weight。

在释放服务器时,如果发现和某服务器的通信过程中发生了错误,就减小它的effective_weight。
此后有新的请求过来时,在选取该服务器的过程中,再逐步增加effective_weight,最终又恢复到weight。
之所以增加这个字段,是为了当服务器发生错误时,降低其权重。

(3) current_weight

服务器目前的权重,初始为0,之后会动态调整。

那么如何动态调整呢?

nginx每次选取服务器时:

  1. 先遍历集群中所有服务器,将每个服务器的current_weight增加它的effective_weight,
  2. 再累加所有服务器的effective_weight,保存为total。
  3. 判断当前服务器的current_weight是否最大,是则选中该服务器,然后把它的current_weight减去total。不是则不会被选中,current_weight也就不用减了。

弄清了三个weight字段的含义后,加权轮询算法可描述为:

  1. 对于每个请求,遍历集群中的所有可用服务器,对于每个服务器执行:current_weight += effecitve_weight。
  2. 累加所有effective_weight,保存为total。
  3. 选出current_weight最大的服务器,作为本次选定的服务器。
  4. 对于本次选定的服务器,执行:current_weight -= total。

下面以表格形式记录其过程:

请求次数开始current_weight增加effective_weight累加total选中服务器选中后current_weight
1[0, 0, 0][6, 3, 1]10a[-4, 3, 1]
2[-4, 3, 1][2, 6, 2]10b[2, -4, 2]
3[2, -4, 2][8, -1, 3]10a[-2, -1, 3]
4[-2, -1, 3][4, 2, 4]10a[-6, 2, 4]
5[-6, 2, 4][0, 5, 5]10b[0, -5, 5]
6[0, -5, 5][6, -2, 6]10a[-4, -2, 6]
7[-4, -2, 6][2, 1, 7]10c[2, 1, -3]
8[2, 1, -3][8, 4, -2]10a[-2, 4, -2]
9[-2, 4, -2][4, 7, -1]10b[4, -3, -1]
10[4, -3, -1][10, 0, 0]10a[0, 0, 0]

可以看到,选中服务器依次为[a, b, a, a, b, a, c, a, b, a]。

a,b,c分别被选中了6,3,1次,正好是符合其权重值的;
服务器a虽然权重大,但没有被连续选取,不会对a服务器连续请求;
经过10次请求后,a,b,c的当前权重current_weight又全部归0,如此便可循环往复。

ps: 这里我们发现total永远都是10,因为这里假定服务器都没有发生故障或返回错误,其effective_weight不变。实际中如果服务器发生了错误,nginx当然也会进行降权处理,total也会变啦。这里我们学习一下正常算法,出错的情况就先不展开了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫荆之后-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值