前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >负载均衡算法

负载均衡算法

作者头像
别团等shy哥发育
发布2023-02-25 15:48:48
9090
发布2023-02-25 15:48:48
举报
文章被收录于专栏:全栈开发那些事

文章目录

1、简介

  服务消费者从服务配置中心获取服务的地址列表后需要选取其中一台发起RPC/HTTP调用,这时需要用到具体的负载均衡算法。常用的负载均衡算法有轮询法、加权轮询法、随机法、加权随机法、源地址哈希法、一致性哈希法等。

2、常用的负载均衡算法

2.1 轮询法

  轮询法是将请求按顺序轮流分配到后端服务器上,均衡地对待后端的每一台服务器,不关心服务器实际的连接数和当前系统负载。

在这里插入图片描述
在这里插入图片描述

  上图中,有9个客户端请求、3台后端服务器。当地一个请求到达负载均衡服务器时,负载均衡服务器会将这个请求分配到后端服务器是;当第二个请求到来时,负载均衡服务器会将这个请求分配到后端服务器2;以此类推。

2.2 加权轮询法

  加权轮询法是根据真实服务器的不同处理了能力来调度访问请求,这样可以保证处理能力强的服务器处理更多的访问流量。简单的轮询法并不考虑后端机器的性能和负载差异。加权轮询法可以很大地处理这一问题,它将按照顺序并且按照权重分派给后端服务器:给性能高、负载低的机器配置较高的权重,让其处理更多的请求;给性能低、负载高的机器配置较低的权重,让其处理较少的请求。

在这里插入图片描述
在这里插入图片描述

  假设有9个客户端请求、3台后端服务器如上图所示,后端服务器1被赋予权值1,后端服务器2被赋予权值2,后端服务器3被赋予权值3.这样一来,客户端请求1、2、3都被分派到服务器3处理,客户端请求4、5被分派到服务器2处理,客户端请求6被分派到服务器1处理,客户端请求7、8、9被分派到服务器3处理,以此类推。

2.3 随机法

  随机法也很简单,就是随机选择一台后端服务器进行请求处理。由于每次服务器被挑中的概率都一样,因此客户端的请求可以被均匀地分派到所有的后端服务器上。由概率统计理论可以得知,随着调用量的增大,其实际效果越来越接近于平均分配流量到每一台后端服务器,也就是轮询的效果。

2.4 加权随机法

  加权随机法跟加权轮询法类似,根据后台服务器不同的配置和负载情况配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序。加权随机算法一般应用的场景是在一个集合S{A,B,C,D}中随机抽取一项,但是抽取的概率不同,比如希望抽到A的概率是50%、抽到B和C的概率是20%、抽到D的概率是10%。一般来说,我们可以给各项附加一个权重,抽取的概率正比于这个权重,上述集合就成了{A:5,B:2,C:3,D:1}。扩展这个集合,使每一项出现的次数与其权重正相关,即{A,A,A,A,A,B,B,C,C,D},然后就可以用均匀随机算法从中选择取了。

2.5 源地址哈希法

  源地址哈希(Hash)是根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用改数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,当后端服务器列表不变时,同一个IP地址的客户端,每次都会映射到同一台后端服务器进行访问。源地址哈希法的缺点是:当后端服务器增加或减少时,采用简单的哈希取模方法会使命中率大大降低。这个问题可以采用一致性哈希法来解决。

2.6 一致性哈希法

  一致性哈希(Hash)法解决了分布式环境下机器增加或者减少时简单的取模运算无法获取较高命中率的问题。通过虚拟节点的使用,一致性哈希算法可以均匀分配机器的负载,使得这一算法更具现实意义。正因如此,一致性哈希算法被广泛应用于分布式系统中。   一致性哈希算法通过哈希环的数据结构实现,环的起点是0,终点是

2^{32}-1

,并且起点与终点点列。哈希环中间的整数按逆时针分布,故哈希环的整数分布范围

[0,2^{32}-1]

,具体如下图所示

在这里插入图片描述
在这里插入图片描述

  在负载均衡中,首先为每一台机器计算一个哈希值,然后把这些哈希值放置在哈希环上。假设有3台web服务器s1、s2、s3,它们计算得到的哈希值分别为h1、h2、h3,在哈希环上的位置如下图所示。

在这里插入图片描述
在这里插入图片描述

  计算每一个请求IP的哈希值:hash(“192.168.0.1”),并把这些哈希值放置到哈希环上。假设有5个请求,对应的哈希值为q1、q2、q3、q4、q5,放置到哈希环上如下图所示。

请求分布哈希环
请求分布哈希环

  接下来为每一个请求找到对应的机器,在哈希环上顺时针查找距离这个请求的哈希值最近的机器,结果如下图所示。

在这里插入图片描述
在这里插入图片描述

  对于线上的业务,增加或减少一台机器的部署上常有的事情。增加服务器s4的部署并将机器s4加入哈希环的机器s3和s2之间。这时,只有机器s3和s4之间的请求需要重新分配新的机器。只有请求q4被重新分配到了s4上,其他请求仍在原有机器上,如下图所示。

在这里插入图片描述
在这里插入图片描述

  从上图的分析可以知道,增减机器只会影响相邻的机器,这就导致了添加机器时只会分担其中一台的负载、删除机器时会把负载全部转移到相邻的一台机器上,这并不是我们希望看到的。我们希望看到的是:增加机器时,新的机器可以合理地分担所有机器地负载;删除机器时,多出来地负载可以均匀地分给剩余地机器。   例如,系统中只有两台服务器,由于某种原因下线NodeB(节点B),此时必然造成大量数据集中安东NodeA(节点A)上,而只有极少量会定位到NodeB上。为此我们引入虚拟节点来解决负载不均衡地问题。可以在服务器IP或主机名地后面增加编号来实现,例如为每台服务器计算3个虚拟节点,分别计算“NodeA#1”“NodeA#2”“NodeA#3”“NodeB#1”“NodeB#2”“NodeB#3”的哈希值,形成6个虚拟节点。同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“NodeA#1”“NodeA#2”“NodeA#3”三个虚拟节点的数据均定位到NodeA上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数量设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1、简介
  • 2、常用的负载均衡算法
    • 2.1 轮询法
      • 2.2 加权轮询法
        • 2.3 随机法
          • 2.4 加权随机法
            • 2.5 源地址哈希法
              • 2.6 一致性哈希法
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档