负载均衡器到底是个啥?
引言
目前在项目中,我们正在使用ELB(弹性负载均衡),我希望能够完全理解其内部功能,因此写了这篇文章。
关于本文
这篇文章的最终目标是深刻理解“ELB是什么?”,并达到能够自信解释的程度。
然而,要完全理解ELB,首先需要掌握基本的负载均衡器概念。因此,本文将重点介绍ELB背后的负载均衡器是什么。
关于ELB的详细信息,将在本文之后发布的《ELB到底是个啥?》一文中详细介绍。对ELB感兴趣的读者,敬请关注。
文章目标
通过本文,你将了解负载均衡器如何分配流量负载。本文的目标是明确负载均衡器的基本功能及其重要性。
什么是负载均衡器?
负载均衡器也被称为“负载分配装置”,顾名思义,其目的是将服务器上的“负荷”适当地“平衡”分散。
“Load(负荷)”和“Balancer(平衡器)”组成了Load Balancer。
那么“负荷”是什么?
想象一下你在访问一个网站的情景。例如,当我们访问CSDN的网站时,那个请求会被发送到CSDN的服务器。服务器会处理请求并返回相应的数据。
“服务器”这个词可能让人感到陌生,但实际上,它是一种拥有CPU和内存的计算机。简单来说,服务器是向我们提供网站信息的存在。
“服务器 = 向我们展示我们想看的网站信息的家伙!!”
当一个人访问网站时,服务器所承受的负担并不大。然而,如果有1000个人同时访问,服务器就需要同时处理大量的请求。举个例子,这就像是你的电脑上同时运行了1000个应用程序,普通的电脑肯定会崩溃。
在互联网上,“负荷”指的是服务器等设备需要处理的“请求数量”。像上面提到的例子中,服务器忙得不可开交的状态被称为“高负荷”。
负载均衡器的作用
负载均衡器的作用就是为了缓解这种高负荷状态,将请求均匀地分配到多个服务器上。例如,当有1000个请求到来时,负载均衡器可以将这些请求均匀地分配到4台服务器上,每台服务器处理250个请求。
通过这种方式,每台服务器都能高效地处理请求,从而提高整体的响应速度。
现实世界的例子
想象一下购物中心的停车场管理员。为了让车辆高效地找到停车位,管理员会指挥车辆停到右边、左边或者上层等不同的停车区域。
同样,负载均衡器就像这位管理员,通过将请求均匀地分配到各个服务器上,保持整个系统的流畅运行。
同样地,负载均衡器也会将请求均匀地分配到各个服务器上,确保每台服务器不会过载。通过这种方式,负载均衡器有效地管理了服务器资源,保证系统的稳定性和高效运行。
什么是负载均衡器?
“负载均衡器 = 将车流(访问请求)巧妙引导到各个车位(服务器)的管理员(装置)!”
负载均衡器的主要功能
接下来,我们将介绍负载均衡器的主要功能。
功能①:负载分散
负载均衡器的核心功能是负载分散。负载分散有两种主要的算法(方法):
- 静态负载分散算法:基于预先设定的规则分配请求。
- 动态负载分散算法:根据实时的服务器状态和负荷分配请求。
通过这些算法,负载均衡器可以确保各个服务器的负担均衡,并最大限度地利用整体的处理能力。(静态和动态负载分散的详细内容将在后面说明)
功能②:服务器的健康监测
负载均衡器会监测连接服务器的运行状态,及时检测到有问题的服务器并调整流量分配。这种健康检查功能确保了出现故障的服务器会自动被排除在流量分配之外,从而保持服务的连续性。
什么是健康检查?
健康检查不仅仅是“存活监测”,它是一个广泛评估服务器是否存在问题的过程。这包括检查CPU和内存的使用率、响应时间等各种指标。健康检查的目的是确认服务器是否正常工作,而“存活监测”则是确定系统是否存在重大问题,如系统宕机。
现实世界的例子
将健康检查比作一家大型综合医院,各科医生进行各种检查。在这个过程中,专门确认服务器“生存状态”的就是存活监测的专科医生。
功能③:提升服务器维护的便捷性
利用负载均衡器可以大大简化服务器的维护工作。
-
滚动更新
- 通过依次维护各个服务器,可以在不间断提供服务的情况下进行维护。正在维护的服务器的流量会自动分配到其他服务器上。
-
流量转移
- 在对特定服务器进行维护时,可以临时将该服务器的流量转移到其他服务器。
-
可视化与监控
- 负载均衡器可以将服务器的性能和流量模式可视化,通过实时监控早期发现并处理问题。
负载均衡器的优缺点
接下来,让我们深入探讨负载均衡器的优点和需要注意的缺点。
优点
-
防止系统宕机
- 负载均衡器的一个主要优点是能够适当地分散服务器的负荷。如果只有单个用户访问服务器,负荷不会太大。然而,如果有成千上万的用户同时访问,服务器可能会过载,导致响应变慢,甚至系统宕机。通过负载均衡器,可以有效避免这种情况。
-
提高系统稳定性和响应速度
- 通过将请求均匀分配到多个服务器上,负载均衡器可以提高系统的整体响应速度和稳定性。
-
便于维护和更新
- 负载均衡器允许服务器在维护和更新时不影响整体服务的可用性。可以对单个服务器进行滚动更新,其他服务器继续处理请求。
-
优化资源使用
- 负载均衡器可以根据实时的服务器状态和负载,动态调整请求的分配,最大限度地利用服务器资源。
缺点
-
复杂性增加
- 使用负载均衡器会增加系统的复杂性,需要专业的配置和维护。
-
成本
- 负载均衡器的硬件和软件成本较高,尤其是对于小型企业来说,可能是一笔不小的开支。
-
单点故障
- 如果负载均衡器本身出现问题,可能会导致整个系统的崩溃。因此,需要采取冗余和备份措施来防止这种情况。
综上所述,负载均衡器在提高系统稳定性和性能方面具有重要作用,但也需要注意其带来的复杂性和成本。
什么是系统宕机?
系统宕机,顾名思义,就是系统停止运行的状态。“这活(请求)太多了,我干不了!!已经超负荷了!我要罢工!!”这种状态就是系统宕机。
引入负载均衡器后,即使出现大量的流量,这些流量也可以被分散到多个服务器上,从而提升整体的处理能力。这样一来,就能大幅减少系统宕机的风险。
引入负载均衡器后系统就不会宕机了吗?
虽然引入负载均衡器可以显著降低系统宕机的风险,但并不意味着系统宕机将完全消失。现实例子
想象一下超市的收银台。如果有15位顾客和3个收银台,每个收银台会有5位顾客排队,收银员会比较忙但还能应付。然而,如果有100位顾客和3个收银台,再能干的收银员也难以快速处理所有顾客。同样地,负载均衡器的作用也有限。每台服务器的处理能力都是有限的。如果请求数量超过了服务器的处理能力,系统仍然可能会宕机。
在本地部署(On-Premises)环境中,需要事先准备足够数量的服务器。在云环境中,需要配置在高负荷时自动增加服务器数量(水平扩展)的设置。
因此,虽然负载均衡器能够分散负荷,减少系统宕机的概率,但能否完全避免系统宕机,最终取决于服务器是否能够处理所有的流量请求。
提高处理速度
引入负载均衡器的第二个优点是“提高处理速度”。让我们再次回到超市收银台的例子。
假设有15位顾客和3个收银台,每个收银台要处理5位顾客的结账,收银员虽然忙碌,但整体上处理进度还是比较顺畅的。然而,如果有15个收银台,每位顾客都有一个专属的收银台,他们的购物过程会更加迅速。
同样的道理也适用于负载均衡器。假设有15个用户同时访问3台服务器,每台服务器需要处理5个请求。但是,如果有15台服务器,并且负载均衡器将每个请求均匀分配,那么每台服务器只需处理一个请求。
由于服务器需要逐一处理用户的请求,请求数量越多,响应时间就越长。然而,利用负载均衡器可以减轻每台服务器的负担,从而整体上提高处理速度。通过有效地分散请求,负载均衡器能够显著缩短系统的响应时间,提升用户体验。
负载均衡器通过均衡分配服务器的请求负荷,起到了关键作用,提升了系统的整体性能和用户体验。
会话保持
负载均衡器在用户执行一系列相关操作(例如在购物网站上的购买过程)时,确保用户始终访问同一台服务器。这保证了用户从购物开始到支付的整个过程中连接的服务器保持一致。这被称为“会话保持”,通过将用户的访问一致性地分配给同一台服务器来实现。
分配方法的选择
负载均衡器使用各种算法将请求分配给服务器。主要使用的方法有以下两种:
-
轮循法(Round Robin)
- 将所有访问请求均等地分配给所有服务器。例如,有6个访问请求,3台服务器,则每台服务器各处理2个请求。
-
最少连接法(Least Connection)
- 将请求发送给当前连接数最少的服务器。例如,服务器的连接数分别为3、1、2时,新的请求会被集中分配给连接数最少的服务器(1)。
此外,还有一些方法会考虑服务器的负载比率、CPU和内存使用率以及一定时间内的平均连接数来进行分配。
缺点
尽管负载均衡器有许多优点,但在引入和运行中也存在一些缺点。
初期设置和管理的复杂性
负载均衡器的设置和管理是复杂的,没有适当的知识,很难有效地运行。特别是,为了有效管理多个服务器,必须正确选择负载均衡算法并准确掌握服务器状态。错误的设置可能会导致性能下降或服务器过载。
成本增加
引入负载均衡器,特别是物理负载均衡器时,初期费用和维护费用可能会很高。即使使用云服务,随着流量的增加,成本也会增加。因此,对于小规模环境或希望控制成本的情况,负载均衡器的使用可能会带来经济负担。
详解死活监视
什么是死活监视?
服务器的死活监视是确认处理请求的服务器是否正常运行的过程。其目的是确认服务器在网络上是否可访问,以及是否能够响应客户端的请求。
监视方法的具体例子
-
Ping命令
- 作为基本的死活监视方法,Ping命令经常使用。Ping向指定的IP地址发送小的数据包并测量其响应时间。通过服务器返回的响应,可以确认服务器在网络上是活动的。如果没有响应,则判断服务器可能存在问题。
-
HTTP请求
- 另一种常用的监视方法是定期向服务器发送HTTP请求,并监视响应代码和响应时间。这种方法可以确认服务器是否正常响应HTTP请求,如果响应异常或没有响应,则判断服务器存在问题。这样可以更准确地了解服务器的健康状况。
综上所述,负载均衡器在提高系统性能和用户体验方面发挥了重要作用,但也需要考虑其设置复杂性和成本等问题。同时,通过死活监视,可以确保服务器在负载均衡过程中始终处于正常运行状态。
静态分散方式中的两种请求分配方法
在静态分散方式中,负载均衡器有两种主要的请求分配方法:
- 轮循法(Round Robin)
- 加权轮循法(Weighted Round Robin)
让我们逐一来看这两种方法。
轮循法(Round Robin)
“轮循法”是按固定顺序将请求分配给各服务器的方法。例如:
- 第1个请求:服务器A
- 第2个请求:服务器B
- 第3个请求:服务器C
- 第4个请求:服务器A
- 第5个请求:服务器B
- 第6个请求:服务器C
这种方式在以下两个条件满足时最为有效:
- 各服务器的处理能力相同
- 各请求的处理量相同或接近
为什么需要满足上述两个条件呢?
处理能力相同
如果服务器的处理能力不同,处理能力较弱的服务器可能会因为负载过重而变得非常忙碌,而处理能力较强的服务器则可能空闲。这会导致负载分配不均,系统的整体性能会下降。
请求处理量相同
如果请求的处理量不同,处理较复杂请求的服务器会花费更多时间完成任务,而处理简单请求的服务器可能会迅速空闲。这同样会导致负载分配不均,部分服务器可能会过载,而其他服务器则可能闲置。
在满足这两个条件时,轮循法能够有效地均衡负载,确保每台服务器的工作量相对均匀,从而提高系统的整体性能和稳定性。
让我们考虑一个例子,其中服务器A和服务器B是高性能的,而服务器C是低性能的。这就像将新员工(服务器C)和经验丰富的上司(服务器A和B)分配相同的工作量和相同的节奏,实际上是很困难的。
静态分散方式的局限性
在使用轮循法时,如果只有服务器C连续收到高负荷的请求,即使每台服务器的处理能力相同,服务器C也会因为过载而可能宕机。因此,确保服务器处理能力相同且每个请求的处理量相近是轮循法有效运行的关键。
加权轮循法(Weighted Round Robin)
加权轮循法根据每台服务器的处理能力调整请求分配比例。例如,你有三位下属,A非常高效,B和C也很优秀但不如A。如果按A的效率给B和C分配任务,他们会过载。因此,你给A分配更多任务,给B和C分配稍少的任务。这就是加权轮循法。
特点
加权轮循法的特点是预先确定每台服务器的请求量分配比例。这要求设计者明确了解每台服务器的处理能力。
轮循法与加权轮循法的共同点
轮循法和加权轮循法的共同点在于它们的请求分配规则是静态设置的,即一旦设置完成,在执行时不会改变。因此,即使某些服务器负载很高,流量分配方法也不会改变。
动态分散方式
动静态分散方式的区别在于,静态分散方式不能动态调整负载分配,而动态分散方式可以根据服务器的实时状态分配流量。接下来,我们详细介绍动态分散方式。
动态分散方式
动态负载分散算法
动态分散方式根据服务器的实时状态进行请求分配。以下是几种常见的动态负载分散算法:
-
最少连接法(Least Connection)
- 将请求分配给当前连接数最少的服务器。例如,服务器的连接数分别为3、1、2时,新的请求会分配给连接数最少的服务器(1)。
-
负载比率法(Load Ratio)
- 根据服务器的负载比率(如CPU使用率、内存使用率)进行请求分配。例如,将请求分配给负载比率最低的服务器。
-
响应时间法(Response Time)
- 根据服务器的响应时间进行请求分配。例如,将请求分配给响应时间最短的服务器。
动态分散方式的优势
-
实时调整
- 动态分散方式可以根据服务器的实时状态调整请求分配,确保负载均衡。例如,当某台服务器负载过高时,可以将请求分配给其他负载较低的服务器。
-
提高性能
- 动态分散方式可以最大限度地利用服务器资源,提高系统整体性能。
-
降低宕机风险
- 通过实时监控和调整,动态分散方式可以有效降低服务器过载和系统宕机的风险。
动态分散方式的实现
为了实现动态分散方式,需要以下组件:
-
监控系统
- 实时监控服务器的状态(如CPU使用率、内存使用率、响应时间等)。
-
调度算法
- 根据监控数据动态调整请求分配。
-
负载均衡器
- 实时接收调度算法的分配策略,并将请求分配给相应的服务器。
通过引入动态分散方式,可以更有效地管理和分配服务器资源,提升系统的稳定性和性能。
动态分散方式
动态分散方式与静态分散方式不同,每次接收到请求时都会考虑服务器和网络的当前状态,以决定将请求转发到哪台服务器。这种方法可以有效处理以下情况:
- 各服务器的处理能力不同
- 每个请求所需的处理时间不同
以下是几种动态分散方式,但在此我们重点介绍“最小连接数方式”和“最小响应时间方式”。
最小连接数方式
在最小连接数方式中,新请求会被转发到当前活动连接数最少的服务器,以均衡各服务器的负载。
示例
假设从客户端发送了两个请求到负载均衡器,负载均衡器将请求分配给“服务器A”和“服务器B”,不分配给“服务器C”。当有新请求到达时,负载均衡器会检查每台服务器的活动连接数,并将请求分配给连接数最少的服务器。在这个例子中,服务器C没有活动连接,因此新请求会被转发到服务器C。
这种方式可以防止负载在服务器间的不均衡,提高系统整体效率。
最小响应时间方式
最小响应时间方式将请求优先分配给响应时间最短的服务器,即处理速度最快的服务器。这种方法能够在服务器处理能力不同的情况下,仍然有效管理流量。
示例
这类似于在餐厅中,为了最小化等待时间,将新顾客分配给处理效率最高的服务员。这样,顾客能够更快地得到服务,整体满意度也会提高。
其他动态分散方式
-
重度最小连接数
- 根据服务器的处理能力设置权重,将请求分配给连接数最少且权重较高的服务器。
-
最小客户端数
- 将请求分配给当前服务的客户端数最少的服务器。
-
最小数据通信量
- 根据服务器处理的数据量,将请求分配给当前数据通信量最少的服务器。
-
最小服务器负荷
- 根据服务器的CPU、内存等资源使用情况,将请求分配给负载最轻的服务器。
动态分散方式的优势
-
实时调整
- 可以根据实时的服务器状态进行请求分配,确保负载均衡。
-
提高性能
- 通过动态调整,提高系统的整体性能。
-
降低宕机风险
- 通过实时监控和调整,有效降低服务器过载和系统宕机的风险。
动态分散方式的实现
-
监控系统
- 实时监控服务器状态,如CPU使用率、内存使用率、响应时间等。
-
调度算法
- 根据监控数据动态调整请求分配策略。
-
负载均衡器
- 实时接收调度算法的分配策略,并将请求分配给相应的服务器。
通过引入动态分散方式,可以更有效地管理和分配服务器资源,提升系统的稳定性和性能。
什么是DNS轮循?
在解释DNS轮循之前,让我们先回顾一下之前提到的静态分散方式之一“轮循法”。DNS轮循与其名称相似,但它们有不同的工作原理。为了更深入地理解负载均衡器,明确区分轮循法和DNS轮循是非常重要的。
理解DNS轮循所需的四个概念
IP地址
IP地址是互联网上每个设备的“地址”。就像我们的居住地址提供了房屋所在的位置信息一样,网络上的每个设备也都有一个唯一的地址,这个数字地址就是IP地址。例如,你的家地址可能是“东京都新宿区1-1-1”,某台计算机的IP地址可能是“192.0.2.1”。
简单来说,IP地址就是网络上特定计算机的地址。
域名
域名(Domain Name)是为了便于记忆和输入,而为IP地址提供的人类可读名称。例如,代替输入“192.0.2.1”,我们可以输入“example.com”。域名通过DNS(Domain Name System)解析为对应的IP地址。
DNS
DNS(Domain Name System)是将域名转换为IP地址的系统。它就像是互联网的电话簿,当你输入一个域名时,DNS将其转换为相应的IP地址,使浏览器能够找到并连接到目标服务器。
DNS服务器
DNS服务器是处理DNS查询的服务器。当你在浏览器中输入一个域名时,DNS服务器会解析该域名,并返回相应的IP地址。这使得你的设备可以找到并连接到目标服务器。
什么是DNS轮循?
DNS轮循是一种简单且广泛使用的负载均衡技术,它通过DNS服务器将请求均匀地分配给一组IP地址。这些IP地址对应的是同一服务的不同服务器。每次有DNS请求时,DNS服务器会按顺序返回一个IP地址,从而实现基本的负载均衡。
工作原理
- 多重IP地址:将一个域名配置为多个IP地址,这些IP地址对应的是同一个服务的不同服务器。
- 轮循机制:每次有DNS查询时,DNS服务器会按照预定的顺序轮流返回这些IP地址。例如,第一次返回IP地址1,第二次返回IP地址2,以此类推。
- 客户端连接:客户端接收到IP地址后,直接连接到对应的服务器。
示例
假设一个域名“example.com”对应三个IP地址:
- 192.0.2.1(服务器A)
- 192.0.2.2(服务器B)
- 192.0.2.3(服务器C)
当用户请求“example.com”时,DNS服务器会依次返回这三个IP地址:
- 第一次请求:返回192.0.2.1(服务器A)
- 第二次请求:返回192.0.2.2(服务器B)
- 第三次请求:返回192.0.2.3(服务器C)
这种方式确保了请求的简单分配,但也存在一些限制。例如,DNS轮循无法实时监控服务器的健康状态,可能将请求分配给已不可用的服务器。此外,DNS缓存机制可能导致某些客户端总是连接到同一台服务器,从而无法实现真正的负载均衡。
小结
DNS轮循是一种通过DNS服务器实现的简单负载均衡方法。它通过轮流返回多个IP地址,均衡地分配请求到不同服务器。然而,由于其无法实时监控服务器状态和受DNS缓存影响,DNS轮循在某些情况下可能无法提供最佳的负载均衡效果。了解这些基本概念有助于更好地理解负载均衡技术的多样性和应用场景。
域名
域名是为IP地址分配的人类易于理解的名称。例如,记住“192.0.2.1”这样的数字串很困难,但记住“https://example.com”这样的名称就容易得多。域名以这种形式提供了一个友好的字符串,取代了数字IP地址。
尽管IP地址和域名最终都指向互联网上的同一位置,但域名以人类更易于理解的方式呈现。
简单理解就是:“IP地址对人类来说难以理解,所以用字符表示的形式就是域名!”
总结
IP地址:网络上设备的数字地址,例如“192.0.2.1”。
域名:对人类友好的IP地址表示形式,例如“https://example.com”。
通过理解域名和IP地址的区别,可以更好地掌握网络请求的基本流程,进一步理解DNS轮循等负载均衡技术的工作原理。
DNS和DNS服务器
正如之前解释的那样,域名是将IP地址转换成人类易于理解的形式。在使用互联网时,我们通常基于URL来搜索所需的信息。而在这个过程中,DNS服务器在幕后发挥着重要作用。
例子
当你在浏览器中输入“https://gorira.com”时,计算机会有如下反应:
“我不知道这个URL代表什么!互联网上的正确地址是IP地址。你得告诉我它的IP地址,我才能找到它!”
因此,计算机会向DNS服务器求助:
“喂,你知道‘https://gorira.com’这个URL对应的IP地址吗?我想访问那个IP地址上的服务器并显示那个网站的信息……”
DNS服务器会响应这个请求,告诉计算机“https://gorira.com”对应的IP地址。
这样一来,浏览器就能访问正确的服务器,获取网站的信息,最终显示在PC屏幕上。
关键在于,“DNS”是将域名和IP地址关联起来的机制,而实现这个机制的服务器就是“DNS服务器”。DNS指的是机制本身,而DNS服务器则是实现该机制的实际服务器。
什么是DNS轮循?
之前我们已经解释了IP地址、域名、DNS以及DNS服务器的概念。现在我们来详细了解DNS轮循的概念。
普通DNS服务器的行为
普通的DNS服务器通常会返回与特定域名关联的一个IP地址。也就是说,普通的DNS服务器只能管理域名和IP地址的一对一关系。
但是,如果一个URL关联了多个IP地址会怎样呢?这实际上是可能的。
例如,一个虚构的网络服务“たこやっきー”在周五和周六会有大量访问,这时单台服务器无法处理所有访问,需要将负载分散到多台服务器上。
如果DNS服务器只返回与“https://takoyakki.com”关联的一个IP地址,所有访问都会集中到同一台服务器,无法实现有效的负载分散。
DNS轮循的作用
这时DNS轮循就派上用场了。DNS轮循通过将多个IP地址分配给同一个域名来均匀地分散请求。这种技术可以有效地分散负载,提高服务的可用性和性能。
例如,对于“https://takoyakki.com”,DNS服务器可以依次返回多个IP地址,将请求均匀地分配给多台服务器。这样,每台服务器都不会过载,用户可以获得稳定的服务。
结论
普通的DNS服务器和DNS轮循都是基于DNS机制的DNS服务器,但区别在于普通DNS服务器只能管理域名和IP地址的一对一关系,而DNS轮循可以将一个域名关联到多个IP地址。
负载均衡器与DNS轮循的关系
负载均衡器和DNS轮循经常一起提到,但它们的功能基本不同。负载均衡器接收流量,并动态地根据服务器的状态将流量路由到合适的服务器。而DNS轮循则利用DNS机制,通过顺序返回多个IP地址来实现负载分散。
DNS轮循通过将一个域名映射到多个服务器上,部分实现了负载均衡器的功能,但这是静态的方法,不考虑服务器的实际负载或状态。因此,回答“DNS轮循是负载均衡器吗?”这个问题时,可以说“它部分实现了负载均衡功能,但同时也保留了作为DNS服务器的角色。”
总结
这篇文章详细介绍了负载均衡器,它简单来说就是一种负载分散装置。我们还了解了静态和动态的分散方法,以及部分实现负载均衡功能的DNS轮循。
感谢各位读者读到这里!接下来的一篇文章将详细介绍“ELB是什么”。