负载均衡策略之轮询策略

article/2025/10/28 13:28:59

本文转自:https://mozillazg.com/2019/02/load-balancing-strategy-algorithm-weighted-round-robin.html#hidround-robin,尊重原创

前言:

本文简单介绍一下轮询(Round Robin)这个负载均衡策略。

轮询选择 (Round Robin):

轮询选择指的是从已有的后端节点列表中按顺序依次选择一个节点出来提供服务。
一种轮询选择的方法是把所有的节点看做一个一个的点,并把这些点连起来组成一个圆, 轮询选择就是在这个圆上按顺时针选择一个点。
可以通过用请求次数取模来实现这个顺时针选择的功能,比如用 python 来表示就是:

nodes = ['A', 'B', 'C']
choices = []
n = 0
for _ in range(10):index = n % len(nodes)choices.append(nodes[index])n += 1print(choices)

在这里插入图片描述

带权重的轮询选择 (Weighted Round Robin):

实际使用中各个节点往往都带有不同的权重,所以一般都需要实现带权重的轮询选择。 权重高的被选中的次数多,权重低的被选中的次数少。
我们还是可以把带权重信息的节点排成一个圆,不过这一次根据不同的权重把对应的节点重复不同的次数。
然后还是顺时针选择一个点,因为每个节点根据权重重复了相应的次数,所以不同权重的节点被选中的次数也不一样并且选中的次数跟它本身的权重有关,这样就就简单实现了带权重的轮询选择。
同样的 python 表示(假设 A、B、C 的权重分别是 3、2、1):

nodes = ['A', 'A', 'A', 'B', 'B', 'C']
choices = []
n = 0
for _ in range(10):index = n % len(nodes)choices.append(nodes[index])n += 1print(choices)

改进:

上面的按权重重复节点的方式有一个明显的问题就是不够平滑:

权重高的节点会先被选中直至达到权重次数才会选择下一个节点或者说会出现请求连续的打在同一个节点上的情况,导致权重低的节点可能会处于空闲状态,没有平滑分配请求。

一种改进方法是:使用 nginx 中实现的一种平滑的带权重轮询的方法:
在这里插入图片描述
这个方法的原文描述如下:

For edge case weights like { 5, 1, 1 } we now produce { a, a, b, a, c, a, a } sequence instead of { c, b, a, a, a, a, a } produced previously.

Algorithm is as follows: on each peer selection we increase current_weight of each eligible peer by its weight, select peer with greatest current_weight and reduce its current_weight by total number of weight points distributed among peers.

To preserve weight reduction in case of failures the effective_weight variable was introduced, which usually matches peer’s weight, but is reduced temporarily on peer failures.

每个节点有三个属性,这三个属性的含义如下:

  1. weight:节点权重值,这个值固定不变。
  2. effective_weight:节点的有效权重。初始值等于 weight 。之所以有个 effective_weight 是为了 在发现后端节点异常次数过多时(比如响应完成时发现选择的节点有问题,错误次数有点多)临时降低节点的权重。 在轮询遍历选择节点时这个 effective_weight 的值会逐步增加恢复到 weight 的值,所以只是为了在异常时临时降低权重不会永久影响节点的权重(节点正常时会逐步恢复到原有的权重)。
  3. current_weight:节点当前权重。初始值为 0,后面会动态调整:
    (1) 每次选取节点时,遍历可用节点,遍历时把当前节点的 current_weight 的值加上它的 effective_weight。
    (2) 同时累加所有节点的 effective_weight 值为 total。
    (3) 如果当前节点的 current_weight 值最大,那么这个节点就是被选中的节点,同时把它的 current_weight 减去 total。
    (4) 没有被选中的节点的 current_weight 不用减少。

整个过程用 python 简单的表示就是:

class Node:def __init__(self, name, weight):self.name = nameself.weight = weightself.effect_weight = weightself.current_weight = 0self.failed_number = 0def __repr__(self):return '<Node: {}>'.format(self.name)class RB:max_fails = 10def __init__(self, nodes):self.nodes = nodesdef select(self):best = Nonetotal = 0for node in self.nodes:node.current_weight += node.effect_weighttotal += node.effect_weightif node.effect_weight < node.weight:node.effect_weight += 1if best is None or node.current_weight > best.current_weight:best = nodebest.current_weight -= totalreturn bestdef release(self, node, state):if state == 'failed':node.failed_number += 1if node.failed_number > self.max_faile:node.effect_weight -= node.weight / self.max_fails + 1else:node.failed_number = 0if node.effect_weight < 0:node.effect_weight = 0nodes = [Node('A', 3), Node('B', 2), Node('C', 1)]
rb = RB(nodes)
choices = []
for _ in range(12):choices.append(rb.select())print(choices)

在这里插入图片描述
可以看到确实是比之前的 [‘A’, ‘A’, ‘A’, ‘B’, ‘B’, ‘C’, ‘A’, ‘A’, ‘A’, ‘B’, …] 要平滑一些。

上面在介绍 effective_weight 时说这个属性主要用来临时降低节点权重,如果没有这个需求的话可以省去 effective_weight 直接用 weight 就好:

def select(self):best = Nonetotal = 0for node in self.nodes:node.current_weight += node.weighttotal += node.weightif best is None or node.current_weight > best.current_weight:best = nodebest.current_weight -= totalreturn best

关于这个 nginx 实现的平滑的带权重轮询的方法的更多细节可以阅读参考资料中列出的一些资料。


http://chatgpt.dhexx.cn/article/o3MnhepD.shtml

相关文章

SpringCloud Ribbon中的7种负载均衡策略!

作者 | 磊哥 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09; 负载均衡通器常有两种实现手段&#xff0c;一种是服务端负载均衡器&#xff0c;另一种是客户端负载均衡器&#xff0c;而…

gateway网关负载均衡策略

前言 之前作业是使用 nacos注册中心来搭建有一个微服务&#xff0c;消费者必然要用到gateway网关来操作路由&#xff0c;并且配置负载均衡策略。 搭建微服务-文章链接&#xff1a;快速搭建微服务-Nacos_一码超人的博客-CSDN博客_微服务搭建nacos 添加一个gateway模块 配置文…

OpenFeign修改负载均衡策略

文章目录 前言一、如何实现二、实现步骤1. 创建一个配置类来把选择的负载均衡策略注册进容器2. 主启动类添加注解 总结 前言 在SpringCloud中&#xff0c;Ribbon可以实现服务调用和负载均衡&#xff0c;而OpenFeign基于注解加接口的服务调用方式比Ribbon看起来更加简洁&#x…

负载均衡策略 -- 轮询

我们可以先来看一下&#xff0c;现在我们在工地上&#xff0c;老板呢找了三个人来搬砖。 由于我们是使用的是轮询的策略&#xff0c;所以我们是这三个工地上的人在搬砖的时候&#xff0c;他们其实工作量是平均分配的。 比如说我们有砖头来第一块&#xff0c;我们会交给第一个…

【运维篇】负载均衡策略

文章目录 集中式负载均衡、进程内负载均衡几种常见的四层负载均衡的工作模式。&#xff08;凤凰架构&#xff09;负载均衡策略一、四层、七层负载均衡简介1、四层负载均衡2、七层负载均衡3.四到七层负载均衡区别 二、四层负载均衡实现&#xff1a;kube-proxy三、七层负载均衡实…

负载均衡及常见解决策略

负载均衡及常见解决策略 什么是负载均衡&#xff08;Load Balance&#xff09; 分布式系统中一个非常重要的概念&#xff0c;当访问的服务具有多个实例时&#xff0c;需要根据某种“均衡”的策略决定请求发往哪个节点&#xff0c;这就是所谓的负载均衡&#xff0c;原理是将数据…

面试官:什么是负载均衡?常见的负载均衡策略有哪些?

点击关注公众号&#xff1a;互联网架构师&#xff0c;后台回复 2T获取2TB学习资源&#xff01; 上一篇&#xff1a;Alibaba开源内网高并发编程手册.pdf 一、负载均衡 负载均衡是云计算的基础组件&#xff0c;是网络流量的入口&#xff0c;其重要性不言而喻。 什么是负载均衡呢&…

Ribbon负载均衡策略

目录 1.基于Ribbon方式的负载均衡&#xff0c;Netflix默认提供了七种负载均衡策略&#xff0c; 2. LoadBalanced 1.基于Ribbon方式的负载均衡&#xff0c;Netflix默认提供了七种负载均衡策略&#xff0c; 对于SpringCloud Alibaba解决方案中又提供了NacosRule策略&#xff0…

nginx - 负载均衡配置-负载均衡策略

目录 知识点1&#xff1a;网站流量分析指标 什么是pv&#xff1f; 什么是uv&#xff1f; 什么是IP&#xff1f; 知识点2&#xff1a;正向代理和反向代理 知识点3&#xff1a;负载均衡实验 什么是负载均衡&#xff1f; IP地址规划&#xff1a; 实验拓扑图 知识点4&…

负载均衡

流量负载均衡介绍 1 负载均衡产生的背景 LB&#xff08;Load Balance&#xff0c;负载均衡&#xff09;是一种集群技术&#xff0c;它将特定的业务&#xff08;网络服务、网络流量等&#xff09;分担给多台网络设备&#xff08;包括服务器、防火墙等&#xff09;或多条链路&a…

Ribbon七种负载均衡策略详解

Ribbon是什么&#xff1f; 主要负责请求分发&#xff0c;例如一个服务节点集群&#xff1a;六台服务器部署着订单服务&#xff0c;用户请求过来了就要根据不同的负载策略分发请求到不同机器上&#xff0c;起到一个缓解请求压力的作用。其自身不会发起请求&#xff0c;这个在源…

负载均衡有哪些常见策略?

分析&回答 轮循 Round Robin 这种方法会将收到的请求循环分配到服务器集群中的每台机器&#xff0c;即有效服务器。如果使用这种方式&#xff0c;所有的标记进入虚拟服务的服务器应该有相近的资源容量 以及负载相同的应用程序。如果所有的服务器有相同或者相近的性能那么选…

负载均衡策略-七种策略

LoadBalancer LoadBalancer下面更底层的7种内置的负载均衡策略 RandomRule - 随性而为 RoundRobinRule - 按部就班 RandomRule是随性而为挑选节点&#xff0c;RobinRule却按部就班从一个节点一步一步地向后选取节点&#xff0c;既不会跳过一个&#xff0c;也不会原地踏步&am…

【Nginx】Nginx服务器之负载均衡策略(6种)

一、关于Nginx的负载均衡 在服务器集群中&#xff0c;Nginx起到一个代理服务器的角色&#xff08;即反向代理&#xff09;&#xff0c;为了避免单独一个服务器压力过大&#xff0c;将来自用户的请求转发给不同的服务器。 二、Nginx负载均衡策略 负载均衡用于从“upstream”模块…

负载均衡策略图文详解

一、「负载均衡」是什么 正如题图所示的这样&#xff0c;由一个独立的统一入口来收敛流量&#xff0c;再做二次分发的过程就是「负载均衡」&#xff0c;它的本质和「分布式系统」一样&#xff0c;是「分治」。 如果大家习惯了开车的时候用一些导航软件&#xff0c;我们会发现…

常用负载均衡及策略图解

文章目录 一、负载均衡二、负载均衡模型分类三、CDN负载均衡四、LVS负载均衡4.1 LVS 支持的三种模式4.1.1 DR 模式4.1.2 TUN 模式4.1.3 NAT 模式 4.2 LVS 基于 Netfilter 的框架实现 五、负载均衡策略是什么六、常用负载均衡策略图解6.1 轮询6.2 加权轮询6.3 最少连接数6.4 最快…

关于0范数、1范数和无穷范数

若 则p范数 p取0时对应0范数&#xff0c;p取1时对应1范数&#xff0c;p取无穷大时对应无穷范数 //LaTeX真的好用 【注意理解】当p取无穷大时&#xff0c;最终只与元素中绝对值最大的元素有关&#xff0c;证明如下&#xff1a;

向量和矩阵的 1范数、2范数

1.向量的范数&#xff1a;0范数&#xff0c;向量中非零元素的个数。 1范数&#xff0c;为绝对值之和。 2范数&#xff0c;就是通常意义上的模。 无穷范数&#xff0c;就是取向量的最大值。 但是向量的范数和矩阵的范数关系不大&#xff0c;百度了好久也没看到狠心的东西&…

向量的范数norm:1范数、2范数、无穷范数;矩阵的行范数、列范数

0范数&#xff1a; 向量中非零元素的个数。1范数&#xff1a; 为绝对值之和。2范数&#xff1a; 通常意义上的模。无穷范数&#xff1a;取向量的最大值。 转自&#xff1a;范数对于数学的意义&#xff1f;1范数、2范数、无穷范数