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

article/2025/10/28 16:19:10

点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源!

上一篇:Alibaba开源内网高并发编程手册.pdf

一、负载均衡

负载均衡是云计算的基础组件,是网络流量的入口,其重要性不言而喻。

什么是负载均衡呢?

将用户请求或者说流量通过负载均衡器,按照某种负载均衡算法把流量均匀地分散到后端的多个服务器上,接收到请求的服务器可以独立的响应请求,以期望的规则分摊到多个操作单元上进行执行,达到负载分担的目的。并通过它可以实现横向扩展(scale out),将冗余的作用发挥为高可用。

二、负载均衡模型分类

从应用场景上来说,常见的负载均衡模型有全局负载均衡和集群内负载均衡,从产品形态角度来说,又可以分为硬件负载均衡和软件负载均衡。

全局负载均衡一般通过 DNS 实现,通过将一个域名解析到不同 VIP,来实现不同的 Region 调度能力。

硬件负载均衡器常见的有 F5、A10、Array,它们的优缺点都比较明显,优点是功能强大,有专门的售后服务团队,性能比较好;缺点是缺少定制的灵活性,维护成本较高。

现在的互联网更多的思路是通过软件负载均衡来实现,这样可以满足各种定制化需求,常见的软件负载均衡有 LVS、Nginx、Haproxy。 

f86f16ac35b6a0efa9fbc04e769f3840.jpeg

对于用户配置的四层监听,LVS 后面会直接挂载用户 ECS,七层用户监听 ECS 则挂载在 Tengine 上。四层监听的流量直接由 LVS 转发到 ECS,而七层监听的流量会经过 LVS 到 Tenigine 再到用户 ECS。

每一个 Region 里都会有多个可用区,达到主备容灾目的,每一个集群里都有多台设备,第一是为了提升性能,第二也是基于容灾考虑。 

5c450d12694ee2ed6d9ab418c8b03eb2.jpeg

上图为高性能负载均衡控制管理概要图,SLB 产品也有 SDN 概念,转发和控制是分离的,用户所有配置通过控制台先到控制器,通过集中控制器转换将用户配置推送到不同设备上,每台设备上都有 Agent 接收控制器下发的需求。

通过本地转换成 LVS 和 Tengine 能够识别的配置,这个过程支持热配置,不影响用户转发,不需要 reload 才能使新配置生效。


三、CDN负载均衡


四、LVS负载均衡


4.1 LVS 支持的三种模式

早期 LVS 支持以下三种模式:DR 模式、TUN 模式、NAT 模式 

d943ccdbb5058bfacb100ca037f37050.jpeg


4.1.1 DR 模式


DR 模式经过 LVS 之后,LVS 会将 MAC 地址更改、封装 MAC 头,内层 IP 报文不动。


报文经过 LVS 负载均衡查找到 RS 之后,将源 MAC 头改成自己的,目的 MAC 改成 RS 地址,MAC 寻址是在二层网络里,对网络部署有一定的限定,在大规模分布式集群部署里,这种模式的灵活性没有办法满足需求。


4.1.2 TUN 模式


TUN 模式走在 LVS 之后,LVS 会在原有报文基础上封装 IP 头,到了后端 RS 之后,RS 需要解开 IP 报文封装,才能拿到原始报文。


不管是 DR 模式还是 TUN 模式,后端 RS 都可以看到真实客户源 IP,目的 IP 是自己的 VIP,VIP 在 RS 设备上需要配置,这样可以直接绕过 LVS 返回给用户。


TUN 模式问题在于需要在后端 ECS 上配置解封装模块,在 Linux 上已经支持这种模块,但是 Windows 上还没有提供支持,所以会对用户系统镜像选择有限定。


4.1.3 NAT 模式


NAT 模式用户访问的是 VIP,LVS 查找完后会将目的 IP 做 DNAT 转换,选择出 RS 地址。


因为客户端的 IP 没变,在回包的时候直接向公网真实客户端 IP 去路由,NAT 的约束是因为 LVS 做了 DNAT 转换,所以回包需要走LVS,把报文头转换回去。


由于 ECS 看到的是客户端真实的源地址,我们需要在用户 ECS 上配置路由,将到 ECS 的默认路由指向 LVS 上,这对用户场景也做了限制。


4.2 LVS 基于 Netfilter 的框架实现

573bfc8af283432dfdbe22e1692e060e.jpeg

Netfilter 是 Linux 提供的网络开放平台,基于该平台可以开发自己的业务功能模块,早期好多安全厂商都是基于 Netfilter 做一些业务模型实现。

这种模型比较灵活,但通用模型里更多的是兼容性考虑,路径会非常长;而且通用模型中没办法发挥多核特性,目前 CPU 的发展更多是向横向扩展。

我们经常见到多路服务器,每路上有多少核,早期通用模型对多核支持并不是特别友善,在多核设计上有些欠缺,导致我们在通用模型上做一些应用开发时的扩展性是有限的,随着核的数量越来越多,性能不增反降。

五、负载均衡策略是什么

037bea06b7f3e4cd81417194396a933e.png

正如上图所示的这样,由一个独立的统一入口来收敛流量,再做二次分发的过程就是负载均衡,它的本质和分布式系统一样,是分治。在软件系统中为了避免流量分摊不均,造成局部节点负载过大(如 CPU 吃紧等),所以引入一个独立的统一入口来做类似的工作。在软件系统中的负载均衡的背后是策略在起作用,而策略的背后是由某些算法或者说逻辑来组成的。负载均衡,也有很多算法或者说逻辑在支撑着这些策略,也有静态和动态之分。

六、常用负载均衡策略图解


下面来罗列一下日常工作中最常见的 5 种策略。

6.1 轮询

e4a9e5e1f7c2564988883bc483b4dc59.png

这是最常用也最简单策略,平均分配,人人都有、一人一次。大致的代码如下:

int  globalIndex = 0;   //注意是全局变量,不是局部变量。try{return servers[globalIndex];
} finally {globalIndex++;if (globalIndex == 3)globalIndex = 0;
}

6.2 加权轮询

6afed66f2f366cfe3a139fa7bbc1521a.png

在轮询的基础上,增加了一个权重的概念。权重是一个泛化后的概念,可以用任意方式来体现,本质上是一个能者多劳思想。

比如,可以根据宿主的性能差异配置不同的权重。大致的代码如下:

int matchedIndex = -1;
int total = 0;for (int i = 0; i < servers.Length; i++)
{servers[i].cur_weight += servers[i].weight;//①每次循环的时候做自增(步长=权重值)total += servers[i].weight;//②将每个节点的权重值累加到汇总值中if (matchedIndex == -1 || servers[matchedIndex].cur_weight < servers[i].cur_weight) //③如果 当前节点的自增数 > 当前待返回节点的自增数,则覆盖。{matchedIndex = i;}
}
servers[matchedIndex].cur_weight -= total;//④被选取的节点减去②的汇总值,以降低下一次被选举时的初始权重值。
return servers[matchedIndex];

这段代码的过程如下图的表格。"()"中的数字就是自增数,即代码中的 cur_weight。

fbb008e2a9142491443b4d272537de81.jpeg

值得注意的是,加权轮询本身还有不同的实现方式,虽说最终的比例都是 2:1:2。

但是在请求送达的先后顺序上可以有所不同。比如「5-4,3,2-1」和上面的案例相比,最终比例是一样的,但是效果不同。

「5-4,3,2-1」更容易产生并发问题,导致服务端拥塞,且这个问题随着权重数字越大越严重。

例子:10:5:3 的结果是「18-17-16-15-14-13-12-11-10-9,8-7-6-5-4,3-2-1」

6.3 最少连接数

9282b0b4dc2677524c58e85aaf1a2a03.png

这是一种根据实时的负载情况,进行动态负载均衡的方式。维护好活动中的连接数量,然后取最小的返回即可。大致的代码如下:

var matchedServer = servers.orderBy(e => e.active_conns).first();
matchedServer.active_conns += 1;
return matchedServer;//在连接关闭时还需对active_conns做减1的动作。

6.4 最快响应

84ed1ed16d5b1f5f4e5479af3edb9c2f.png

这也是一种动态负载均衡策略,它的本质是根据每个节点对过去一段时间内的响应情况来分配,响应越快分配的越多。

具体的运作方式也有很多,上图的这种可以理解为,将最近一段时间的请求耗时的平均值记录下来,结合前面的加权轮询来处理,所以等价于 2:1:3 的加权轮询。

题外话:一般来说,同机房下的延迟基本没什么差异,响应时间的差异主要在服务的处理能力上。

如果在跨地域(例:浙江->上海,还是浙江->北京)的一些请求处理中运用,大多数情况会使用定时「Ping」的方式来获取延迟情况,因为是 OSI 的 L3 转发,数据更干净,准确性更高。

6.5 Hash 法

5f184b252b8173010525b01067952fcb.jpeg

Hash 法的负载均衡与之前的几种不同在于,它的结果是由客户端决定的。通过客户端带来的某个标识经过一个标准化的散列函数进行打散分摊。上图中的散列函数运用的是最简单粗暴的取余法。

题外话:散列函数除了取余之外,还有诸如变基、折叠、平方取中法等等,此处不做展开,有兴趣的小伙伴可自行查阅资料。

另外,被求余的参数其实可以是任意的,只要最终转化成一个整数参与运算即可。

最常用的应该是用来源 IP 地址作为参数,这样可以确保相同的客户端请求尽可能落在同一台服务器上。

常用负载均衡策略优缺点和适用场景

我们知道,没有完美的事物,负载均衡策略也是一样。上面列举的这些最常用的策略也有各自的优缺点和适用场景,我稍作了整理,如下。 

8fac47e3aa2e6f2490f00439ff9d9fe4.jpeg

这些负载均衡算法之所以常用也是因为简单,想要更优的效果,必然就需要更高的复杂度。

比如,可以将简单的策略组合使用、或者通过更多维度的数据采样来综合评估、甚至是基于进行数据挖掘后的预测算法来做。

七、用健康探测来保障高可用

不管是什么样的策略,难免会遇到机器故障或者程序故障的情况。所以要确保负载均衡能更好的起到效果,还需要结合一些健康探测机制。定时的去探测服务端是不是还能连上,响应是不是超出预期的慢。

如果节点属于“不可用”的状态的话,需要将这个节点临时从待选取列表中移除,以提高可用性。一般常用的健康探测方式有 3 种。

7.1 HTTP 探测

使用 Get/Post 的方式请求服务端的某个固定的 URL,判断返回的内容是否符合预期。一般使用 HTTP 状态码、Response 中的内容来判断。

7.2 TCP 探测

基于 TCP 的三次握手机制来探测指定的 IP + 端口。最佳实践可以借鉴阿里云的 SLB 机制,如下图: 

6235da05c9fedc0a34ca8ad0c8ddf0d8.jpeg

值得注意的是,为了尽早释放连接,在三次握手结束后立马跟上 RST 来中断 TCP 连接。

7.3 UDP 探测

可能有部分应用使用的是 UDP 协议。在此协议下可以通过报文来进行探测指定的 IP + 端口。最佳实践同样可以借鉴阿里云的 SLB 机制,如下图: 

cd8612aff69717492d2117ec5f7e5062.jpeg

结果的判定方式是:在服务端没有返回任何信息的情况下,默认是正常状态。否则会返回一个 ICMP 的报错信息。

原文:blog.csdn.net/qq_29677867/article/details/90050721

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.再见了 ,Shiro!

2.从零开始搭建创业公司后台技术栈

3.程序员一般可以从什么平台接私活?

4.流程引擎的架构设计

5.为什么国内 996 干不过国外的 955呢?

6.中国的铁路订票系统在世界上属于什么水平?                        

7.15张图看懂瞎忙和高效的区别!

2b61150fb20b7fd0d9852d811e7d6a1e.gif


http://chatgpt.dhexx.cn/article/9OmGG22h.shtml

相关文章

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范数、无穷范数

向量的1范数,2范数,无穷范数,KNN中的Lp距离

L-0范数&#xff1a;用来统计向量中非零元素的个数。 L-1范数&#xff1a;向量中所有元素的绝对值之和。 L-2范数&#xff1a;欧式距离。 L-∞范数&#xff1a;计算向量中的最大值。 你也可以这样理解 1-范数&#xff1a; ║ x ║ 1 │ x 1 │ │ x 2 │ … │ x n │ ║…

范数与模

复数的模 向量的范数 范数&#xff0c;在机器学习中通常用于衡量一个向量的大小&#xff0c;范数的定义如下&#xff1a; P>1 比如如下常见的范数 1-范数&#xff1a;║x║1│x1││x2│…│xn│ &#xff08;曼哈顿距离&#xff09; 2-范数&…

求矩阵的1,和2范数

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

矩阵L2,1范数及矩阵L2,p范数的求导

常见的矩阵范数有L1&#xff0c;L2&#xff0c; ∞ 范数&#xff0c;F范数和引申出的L2,1范数。而在机器学习的特征选择中&#xff0c;利用选择矩阵的范数对选择矩阵进行约束&#xff0c;即是正则化技术&#xff0c;是一种稀疏学习。 L0 &#xff0c; L1 向量范数 L0 范数 L0 …

计算方法 | 范数(向量:1范数、2范数、无穷范数;矩阵:行范数、列范数)

0范数&#xff1a; 向量中非零元素的个数。1范数&#xff1a; 为绝对值之和。2范数&#xff1a; 通常意义上的模。无穷范数&#xff1a;取向量的最大值。 行范数&#xff1a;矩阵中每行绝对值之和的最大值列范数&#xff1a;矩阵中每列绝对值之和的最大值 详细研究请访问&#…

到底什么是范数?什么是0范数、1范数、2范数?区别又是什么?

其实我的专业不是数学专业&#xff0c;只不过在阅读paper时&#xff0c;我们会经常看到0范数或者1范数这些范数问题。本文就来分析看看到时什么是范数&#xff1f;什么是0范数、1范数、2范数&#xff1f;它们的区别又是什么&#xff1f;为了方便某些着急的people&#xff0c;先…

向量和矩阵的各种范数比较(1范数、2范数、无穷范数等等)

一、向量的范数 首先定义一个向量(一般用列向量表示)为&#xff1a; 1.1 向量的1范数 向量的1范数即&#xff1a;向量的各个元素的绝对值之和&#xff0c;上述向量a的1范数结果就是&#xff1a;29&#xff0c;MATLAB代码实现为&#xff1a;norm&#xff08;a&#xff0c;1&am…