原文作者:NGINX
原文链接:概念回顾:负载均衡、四层负载均衡、七层负载均衡
转载来源:NGINX 开源社区
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
负载均衡服务器、客户端和代理服务器之间的网络流量是维系客户和优化基础架构的关键。阅读本文,了解负载均衡、四层负载均衡以及七层负载均衡之间的联系和区别。
负载均衡是指将传入的网络流量高效分发到一组后端服务器,也称为“服务器群”或“服务器池”。
现代高流量网站必须满足来自用户或客户端的数十万甚至数百万的并发请求,并快速、可靠地返回正确的文本、图像、视频或应用数据。为了经济高效地进行扩展以满足这些海量数据需求,现代计算最佳实践通常要求添加更多的服务器。
负载均衡器可以充当“流量指挥官”,它位于服务器的前面,负责将客户端请求路由到所有能够满足这些请求的服务器,同时最大限度地提高速度和容量利用率,并确保无任何服务器过载,以免出现性能下降。
如果某台服务器发生故障,则负载均衡器会将流量重定向到其余的在线服务器。在将新服务器添加到服务器组后,负载均衡器会自动向该服务器发送请求。
通过这种方式,负载均衡器可执行以下功能:
在多台服务器之间高效分配客户端请求或网络负载
仅向在线服务器发送请求,确保高可用性和可靠性
提供按需增减服务器的灵活性
负载均衡图
不同的负载均衡算法可提供不同的优势;负载均衡方法的选择取决于您的需求:
轮询调度 —— 将请求按顺序分发到服务器组。
最少连接 —— 将新请求发送到当前客户端连接数最少的服务器。根据每台服务器的相对计算能力,确定哪台服务器的客户端连接数最少。
最短时间 —— 将请求发送到通过公式选择的(结合最快响应时间和最少活动连接数)服务器。此为 NGINX Plus 独有功能。
哈希 —— 根据您定义的密钥分发请求,例如客户端 IP 地址或请求 URL。NGINX Plus 可以选择应用一致的哈希,以在上游服务器组发生变化时最大限度减少负载的重新分配。
IP 哈希 —— 使用客户端的 IP 地址确定哪台服务器接收请求。
两次随机选择 —— 随机选择两台服务器,然后将请求发送到通过应用最少连接算法(或者如果配置了 NGINX Plus,可采用最短时间算法)所选择的服务器。
减少停机
可扩展性
冗余
灵活性
高效
有关用户会话的信息通常存储在本地浏览器中。例如,在购物车应用中,用户购物车中的商品在用户准备购买之前可能会存储在浏览器级别。在购物会话期间更改接收客户端请求的服务器可能会引发性能问题或直接导致交易失败。
在这种情况下,会话期间来自客户端的所有请求都必须发送到同一服务器。这就是所谓的“会话保持”。
好的负载均衡器能够按需处理会话保持。会话保持的另一个用例是,上游服务器将用户请求的信息存储在其缓存中以提高性能。切换服务器会导致信息再次获取,进而造成性能下降。
许多快速变化的应用需要不断添加或关闭新服务器。这在亚马逊云科技 (AWS) Elastic Compute Cloud (EC2) 等环境中十分常见,它们允许用户仅为实际使用的算力付费,同时还能够确保容量在响应流量峰值时快速扩展。
在此类环境中,如果负载均衡器可以在不中断现有连接的情况下动态地从服务器组中添加或删除服务器,则大有裨益。
负载均衡器通常有两种形式:基于硬件和基于软件。基于硬件的解决方案的厂商将专有软件加载到其提供的机器(通常搭载专用处理器)上。
为了处理日益增加的网站流量,您必须从厂商处购买更多或更大的机器。而软件解决方案通常在商用硬件上运行,因此更为经济、更加灵活。您可将软件安装到所选硬件上,或者安装在 AWS EC2 等云环境中。
负载均衡可在网络开放式系统互联 (OSI) 参考模型中的各层执行。
七层负载均衡比基于数据包的四层负载均衡占用更多的 CPU,但却很少导致现代服务器性能下降。七层负载均衡支持负载均衡器做出更明智的负载均衡决策,并可对内容进行优化和更改。
四层负载均衡是根据网络传输层(四层)定义的信息来决定如何在一组服务器之间分发客户端请求的。特别是对于互联网流量而言,四层负载均衡器根据数据包 HTTP 请求头中记录的源 IP 地址、目标 IP 地址和端口做出负载均衡决策,而不考虑数据包的内容。
网络层共分为七层,由开放式系统互联(OSI)参考模型定义。
如今,术语“四层负载均衡”通常是指此类部署——负载均衡器的 IP 地址是为某个网站或服务(例如通过 DNS)向客户端公布的 IP 地址。因此,客户端在请求时将负载均衡器的地址记录为目标 IP 地址。
当四层负载均衡器收到请求并做出负载均衡决策时,它还会对请求数据包执行网络地址转换(NAT),将所记录的目标 IP 地址从自己的地址转变为它在内网所选的内容服务器的地址。
同样,在将服务器响应转发给客户端之前,负载均衡器也会将数据包请求头中记录的源 IP 地址从服务器的地址转变为自己的地址。(数据包中记录的目标和源 TCP 端口号有时也会进行类似的变更。)
四层负载均衡器根据从 TCP 流的前几个数据包中提取的地址信息做出路由决策,但不检查数据包的内容。四层负载均衡器通常是厂商提供的专用硬件设备,运行专有负载均衡软件,并且 NAT 操作可能由专用芯片而非软件执行。
四层负载均衡曾是一种流行的流量处理架构方法,当时商用硬件没有现在这么强大,而且客户端和应用服务器之间的交互也没有那么复杂。
与更复杂的负载均衡方法(例如七层)相比,四层负载均衡需要的计算量更少,而现在 CPU 和内存不仅十分快速而且非常经济,因此在大多数情况下,四层负载均衡的性能优势已变得微不足道或无关紧要。
七层负载均衡器运行于 OSI 模型的最高层 —— 应用层(在互联网上,HTTP 是该层的主要协议)。七层负载均衡器根据 HTTP 请求头的各种特征和实际的消息内容——例如 URL、数据类型(文本、视频、图形)或 cookie 中的信息——做出路由决策。
由于需要全方位考虑所传输的信息,因此就时间和所需算力而言,执行七层负载均衡可能比四层负载均衡的开销更大,但整体效率也更高。例如,由于七层负载均衡器能够确定客户端正在请求的数据类型(视频、文本等),因此您不必在所有负载均衡的服务器上复制相同的数据。
现代通用负载均衡器(例如 NGINX Plus 和开源版的 NGINX)通常都在七层运行,并被用作反向代理。与使用 NAT 的四层负载均衡器逐包管理流量不同,七层负载均衡代理可以完整地读取请求和响应。它们基于对客户端和应用服务器之间事务的充分了解来管理并控制流量。
一些负载均衡器既可被配置为四层负载均衡,也可被配置为七层负载均衡,具体情况取决于它们自身的性质。如前所述,由于现代商用硬件通常性能非常强大,相比七层负载均衡带来的更高灵活性和效率,四层负载均衡所节省的计算成本不值一提。
对于互联网流量,“四层”和“七层”负载均衡的说法是一种简称,严格来说并不准确。如欲了解详情,请继续阅读下文。
七个网络层的概念源自开放式系统互联 (OSI) 参考模型。该模型将网络功能分成七个抽象层,通常用其层数(一层至七层)来表示。每一层都有定义数据如何打包和传输的标准。此外,这些标准还定义了如何将构成请求或响应的比特流拆分成称为“协议数据单元 (PDU)”的独立数据包,并定义了以请求头的形式添加到每个 PDU 的元数据,这些元数据可能会指定源主机和目标主机的地址。
将网络功能的不同方面分配给不同的层可简化每层的处理,因为一个协议只需知道如何处理自己所在层的 PDU,以及请求头中包含哪些元数据,以便相邻层的协议在其数据分段层级重新打包 PDU。
万维网流量的基本协议(统称为“互联网协议 (IP) 套件”)之间的网络功能分布并不完全符合 OSI 模型。这是因为 IP 套件是在 1984 年最终确定的 OSI 模型发布之前定义和实施的。尽管如此,IP 套件中的各种协议所执行的不同功能大致对应 OSI 各层。
每个层级定义了多个协议,与网站流量负载均衡相关的协议和层级如下:
互联网协议 (IP) 在网络层(三层)运行,其 PDU 被称为“数据包”,IP 负责将它们从源主机交付到目标主机,通常需要跨越构成互联网的多个小型网络之间的边界。每台直接联网的设备都有一个唯一的 IP 地址,用于将设备定位为数据包的接收方。
传输控制协议 (TCP) 在传输层(四层)运行。TCP 在运行浏览器的主机和运行服务器应用的主机之间创建了一个虚拟连接。由于网络具有不可靠性,因此 IP 数据包可能会丢失、损坏或乱序到达。TCP 具有纠正这些错误的机制,可将 IP 数据包流转换为可靠的通信信道。它为每个应用分配了一个唯一的 TCP 端口号,以便向运行许多应用的主机上的正确应用进行交付。
超文本传输协议 (HTTP) 在应用层(七层)运行。它定义了如何对数据进行编码,以便在 Web 浏览器和 Web 服务器(或任何理解 HTTP 编码的应用)之间进行通信。
如上表所示,互联网流量的“四层负载均衡”的说法是一种简称,更为准确的表述是“三/四层负载均衡” —— 因为负载均衡器同时根据源服务器和目标服务器的 IP 地址(三层)以及应用的 TCP 端口号(四层)做出负载均衡决策。对于“七层负载均衡”,更准确的表述可能是“五层到七层负载均衡”,因为 HTTP 整合了 OSI 五、六、七层的功能。
负载均衡可在网络开放式系统互联 (OSI) 参考模型中的各层执行。下面我们将简单介绍该模型中两个不同层上的两个负载均衡选项。
四层负载均衡在中间的传输层运行,负责处理消息的传递,而不考虑消息的内容。传输控制协议 (TCP) 是面向互联网上超文本传输协议 (HTTP)流量的四层协议。四层负载均衡器只将网络数据包转发到上游服务器并从上游服务器转发网络数据包,而不检查数据包的内容。它们可通过检查 TCP 流中的前几个数据包来做出有限的路由决策。
七层负载均衡在高级应用层运行,会涉及每个消息的实际内容。HTTP 是面向互联网网站流量的主要七层协议。七层负载均衡器路由网络流量的方式比四层负载均衡器复杂得多,特别适用于基于 TCP 的流量,例如 HTTP。
七层负载均衡器会截住网络流量并读取其中的消息。它能够根据消息内容(例如 URL 或 cookie)做出负载均衡决策。然后,七层负载均衡器再与选定的上游服务器建立新的 TCP 连接(或通过 HTTP keepalives 重用现有的连接),并将请求写入服务器。
七层负载均衡比基于数据包的四层负载均衡更耗 CPU,但却很少导致现代服务器性能下降。七层负载均衡支持负载均衡器做出更明智的负载均衡决策,并可对内容进行优化和更改(如压缩、加密等)。它还可以利用缓冲卸载上游服务器的慢速连接,从而提高性能。
执行七层负载均衡的设备通常被称为“反向代理服务器”。
举个简单的例子,假设某位用户访问一个高流量网站,在会话过程中,该用户可能会请求静态内容(例如图像或视频)、动态内容(例如新闻馈送),甚至是交易信息(例如订单状态)。
七层负载均衡允许负载均衡器根据请求本身所含信息(例如正在请求的内容类型)来路由请求。这样,图像或视频请求便可路由到存储并可高效提供这些多媒体内容的服务器。我们可将折扣价格等交易信息请求路由到负责管理定价的应用服务器。
借助七层负载均衡,网络和应用架构师能够创建高度调谐和优化的服务器基础架构或不仅可靠而且还能够高效扩展的应用交付网络。
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号