Elastic Load Balancing 的工作原理 - Elastic Load Balancing

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Elastic Load Balancing 的工作原理

负载均衡器接受来自客户端的传入流量并将请求路由到一个或多个可用区中的已注册目标 (例如 EC2 实例)。负载均衡器还会监控已注册目标的运行状况,并确保它只将流量路由到正常运行的目标。当负载均衡器检测到不正常目标时,它会停止将流量路由到该目标。然后,当它检测到目标再次正常时,它会恢复将流量路由到该目标。

您可通过指定一个或多个侦听器将您的负载均衡器配置为接受传入流量。侦听器是用于检查连接请求的进程。它配置了用于从客户端连接到负载均衡器的协议和端口号。同样,它配置了用于从负载均衡器连接到目标的协议和端口号。

Elastic Load Balancing 支持以下类型的负载均衡器:

  • Application Load Balancer

  • Network Load Balancer

  • 网关负载均衡器

  • 经典负载均衡器

负载均衡器类型的配置方式具有一个关键区别。对于 Application Load Balancer、Network Load Balancer 和 Gateway Load Balancer,可以在目标组中注册目标,并将流量路由到目标组。通过经典负载均衡器,可以在负载均衡器中注册实例。

可用区与负载均衡器节点

当您为负载均衡器启用可用区时,Elastic Load Balancing 会在该可用区中创建一个负载均衡器节点。如果您在可用区中注册目标但不启用可用区,这些已注册目标将无法接收流量。当您确保每个启用的可用区均具有至少一个已注册目标时,负载均衡器将具有最高效率。

我们建议为所有负载均衡器启用多个可用区。但对于 Application Load Balancer,要求您至少启用两个或更多可用区。此配置有助于确保负载均衡器可以继续路由流量。如果一个可用区变得不可用或没有正常目标,则负载均衡器会将流量路由到其他可用区中的正常目标。

在禁用一个可用区后,该可用区中的目标将保持已注册到负载均衡器的状态。但是,即使它们保持已注册状态,负载均衡器也不会将流量路由到它们。

跨区域负载均衡

负载均衡器的节点将来自客户端的请求分配给已注册目标。启用了跨区域负载均衡后,每个负载均衡器节点会在所有启用的可用区中的已注册目标之间分配流量。禁用了跨区域负载均衡后,每个负载均衡器节点会仅在其可用区中的已注册目标之间分配流量。

下图演示了以轮询为默认路由算法的跨可用区负载均衡效果。有 2 个已启用的可用区,其中可用区 A 中有 2 个目标,可用区 B 中有 8 个目标。客户端发送请求,Amazon Route 53 使用负载均衡器节点之一的 IP 地址响应每个请求。基于轮询路由算法,系统会分配流量,以便每个负载均衡器节点接收来自客户端 50% 的流量。每个负载均衡器节点会在其范围中的已注册目标之间分配其流量份额。

如果启用了跨区域负载均衡,则 10 个目标中的每个目标接收 10% 的流量。这是因为每个负载均衡器节点可将其 50% 的客户端流量路由到所有 10 个目标。


                    启用跨区域负载均衡时

如果禁用了跨区域负载均衡:

  • 可用区 A 中的两个目标中的每个目标接收 25% 的流量。

  • 可用区 B 中的八个目标中的每个目标接收 6.25% 的流量。

这是因为每个负载均衡器节点只能将其 50% 的客户端流量路由到其可用区中的目标。


                    禁用跨区域负载均衡时

对于应用程序负载均衡器,跨可用区负载均衡始终在负载均衡器级别启用。在目标组级别,可以禁用跨可用区负载均衡。有关更多信息,请参阅《应用程序负载均衡器用户指南》中的关闭跨可用区负载均衡

对于 Network Load Balancer 和 Gateway Load Balancer,默认情况下会禁用跨区域负载均衡。创建负载均衡器后,您随时可以启用或禁用跨区域负载均衡。

在创建经典负载均衡器时,跨区域负载均衡的默认值取决于创建负载均衡器的方式。默认情况下,使用 API 或 CLI 时将禁用跨区域负载均衡。使用时 AWS Management Console,默认情况下会选择启用跨区域负载平衡的选项。创建经典负载均衡器后,您随时可以启用或禁用跨区域负载均衡。有关更多信息,请参阅《经典负载均衡器用户指南》中的启用跨区域负载均衡

可用区转移

可用区转移是 Amazon Route 53 应用程序恢复控制器(Route 53 ARC)中的一项功能。通过可用区转移,只需执行一次操作即可将负载均衡器资源从受损的可用区转移出去。这样,您就可以继续从 AWS 区域中的其他运行状况良好的可用区运行。

当您启动可用区转移时,负载均衡器会停止向受影响的可用区发送这些资源的流量。Route 53 ARC 会立即创建可用区转移。但是,可能需要很短时间(通常长达几分钟)才能完成受影响可用区中正在进行的现有连接。有关更多信息,请参阅《Amazon Route 53 应用程序恢复控制器开发人员指南》中的可用区转移的工作原理:运行状况检查和区域 IP 地址

只有关闭了跨可用区负载均衡的应用程序负载均衡器和网络负载均衡器才支持可用区转移。如果您开启了跨可用区负载均衡,则无法启动可用区转移。有关更多信息,请参阅《Amazon Route 53 应用程序恢复控制器开发人员指南》中的可用区转移支持的资源

在使用可用区转移之前,请查看以下内容:

  • 可用区转移不支持跨区域负载均衡。要使用此功能,必须关闭跨可用区负载均衡。

  • 在 AWS Global Accelerator中将应用程序负载均衡器用作加速器端点时,不支持可用区转移。

  • 只能为单个可用区中的特定负载均衡器启动可用区转移。无法为多个可用区启动可用区转移。

  • AWS 当多个基础设施问题影响服务时,主动从 DNS 中删除区域负载均衡器 IP 地址。在开始可用区转移之前,请务必检查当前的可用区容量。如果您的负载均衡器已关闭跨可用区负载均衡,而您使用可用区转移来删除可用区负载均衡器 IP 地址,则受可用区转移影响的可用区也会失去目标容量。

  • 当应用程序负载均衡器是网络负载均衡器的目标时,请始终从网络负载均衡器启动可用区转移。如果从应用程序负载均衡器启动可用区转移,则网络负载均衡器将不会识别转移,并继续向应用程序负载均衡器发送流量。

有关更多指南和信息,请参阅《Amazon Route 53 应用程序恢复控制器开发人员指南》中的 Route 53 ARC 可用区转移最佳实践

请求路由

在客户端将请求发送到负载均衡器之前,它会利用域名系统 (DNS) 服务器解析负载均衡器的域名。DNS 条目由 Amazon 控制,因为您的负载均衡器位于 amazonaws.com 域中。Amazon DNS 服务器会将一个或多个 IP 地址返回到客户端。这些是您的负载均衡器的负载均衡器节点的 IP 地址。对于网络负载均衡器,Elastic Load Balancing 将为您启用的每个可用区创建一个网络接口,并使用该网络接口来获取静态 IP 地址。在您创建网络负载均衡器时,可以选择将一个弹性 IP 地址关联到每个网络接口。

当流向应用程序的流量随时间变化时,Elastic Load Balancing 会扩展负载均衡器并更新 DNS 条目。DNS 条目还指定了 60 秒的 time-to-live (TTL)。这有助于确保可以快速重新映射 IP 地址以响应不断变化的流量。

客户端可以确定使用哪个 IP 地址将请求发送到负载均衡器。用于接收请求的负载均衡器节点会选择一个正常运行的已注册目标,并使用其私有 IP 地址将请求发送到该目标。

有关更多信息,请参阅 Amazon Route 53 开发人员指南中的将流量路由到 ELB 负载均衡器

路由算法

借助 Application Load Balancer,接收请求的负载均衡器节点使用以下过程:

  1. 按优先级顺序评估侦听器规则以确定要应用的规则。

  2. 使用为目标组配置的路由算法,从目标组中为规则操作选择目标。默认路由算法是轮询。每个目标组的路由都是单独进行的,即使某个目标已在多个目标组中注册。

借助 Network Load Balancer,接收连接的负载均衡器节点使用以下过程:

  1. 使用流哈希算法从目标组中为默认规则选择目标。它使算法基于:

    • 协议

    • 源 IP 地址和源端口

    • 目标 IP 地址和目标端口

    • TCP 序列号

  2. 将每个单独的 TCP 连接在连接的有效期内路由到单个目标。来自客户端的 TCP 连接具有不同的源端口和序列号,可以路由到不同的目标。

借助 经典负载均衡器,接收请求的负载均衡器节点按照以下方式选择注册实例:

  • 使用适用于 TCP 侦听器的轮询路由算法

  • 使用适用于 HTTP 和 HTTPS 侦听器的最少未完成请求路由算法

HTTP 连接

经典负载均衡器会使用预打开连接,但 Application Load Balancer 不会使用预打开连接。经典负载均衡器和 Application Load Balancer 均使用多路复用连接。也就是说,来自多个前端连接上的多个客户端的请求可通过单一的后端连接路由到指定目标。多路复用连接可缩短延迟并减少您的应用程序上的负载。要禁止多路复用连接,请在您的 HTTP 响应中设置 Connection: close 标头来禁用 HTTP keep-alive 标头。

对于前端连接,Application Load Balancer 和经典负载均衡器支持管道化 HTTP。对于后端连接它们均不支持管道化 HTTP。

应用程序负载均衡器支持以下 HTTP 请求方法:GET、HEAD、POST、PUT、DELETE、OPTIONS 和 PATCH。

对于前端连接,Application Load Balancer 支持以下协议:HTTP/0.9、HTTP/1.0、HTTP/1.1 和 HTTP/2。HTTP/2 仅适用于 HTTPS 侦听器,使用一个 HTTP/2 连接最多可并行发送 128 个请求。应用程序负载均衡器还支持从 HTTP 升级到。 WebSockets但是,如果连接升级,Application Load Balancer 侦听器路由规则和 AWS WAF 集成将不再适用。

默认情况下,Application Load Balancer 在后端连接上使用 HTTP/1.1(负载均衡器连接到已注册的目标)。但是,您可以通过协议版本使用 HTTP/2 或 gRPC 将请求发送到目标。有关更多信息,请参阅协议版本。默认情况下,keep-alive 标头在后端连接上受支持。如果 HTTP/1.0 请求来自没有主机标头的客户端,负载均衡器会对后端连接发送的 HTTP/1.1 请求生成一个主机标头。主机标头包含负载均衡器的 DNS 名称。

对于前端连接(客户端到负载均衡器),经典负载均衡器支持以下协议:HTTP/0.9、HTTP/1.0 和 HTTP/1.1。默认情况下,它们在后端连接(已注册目标的负载均衡器)上使用 HTTP/1.1。默认情况下,keep-alive 标头在后端连接上受支持。如果 HTTP/1.0 请求来自没有主机标头的客户端,负载均衡器会对后端连接发送的 HTTP/1.1 请求生成一个主机标头。主机标头包含负载均衡器节点的 IP 地址。

HTTP 标头

Application Load Balancer 和经典负载均衡器会将 X-Forwarded-ForX-Forwarded-ProtoX-Forwarded-Port 标头自动添加到请求。

应用程序负载均衡器将 HTTP 主机标头中的主机名转换为小写,然后再将其发送到目标。

对于使用 HTTP/2 的前端连接,标头名称是小写的。使用 HTTP/1.1 将请求发送到目标之前,以下标头名称将转换为混合大小写:X-Forwarded-ForX-Forwarded-ProtoX-Forwarded-PortHostX-Amzn-Trace-IdUpgradeConnection。所有其他标头名称是小写的。

Application Load Balancer 和经典负载均衡器将响应代理返回客户端后,遵守来自传入客户端请求的连接标头。

当使用 HTTP/1.1 的应用程序负载均衡器和经典负载均衡器收到 Expect: 100-Continue 标头时,它们会立即以 HTTP/1.1 100 Continue 响应,而不会测试内容长度标头。Expect: 100-Continue 请求标头不会转发到其目标。

使用 HTTP/2 时,应用程序负载均衡器不支持来自客户端请求的 Expect: 100-Continue 标头。应用程序负载均衡器不会以 HTTP/2 100 Continue 响应,也不会将此标头转发给其目标。

HTTP 标头限制

应用程序负载均衡器的以下大小限制是无法更改的硬限制:

  • 请求行:16K

  • 单个标头:16K

  • 整个响应标头:32 K

  • 整个请求标头:64 K

负载均衡器模式

在创建负载均衡器时,您必须选择使其成为内部负载均衡器还是面向 Internet 的负载均衡器。

面向 Internet 的负载均衡器的节点具有公共 IP 地址。面向 Internet 的负载均衡器的 DNS 名称可公开解析为节点的公共 IP 地址。因此,面向 Internet 的负载均衡器可以通过 Internet 路由来自客户端的请求。

内部负载均衡器的节点只有私有 IP 地址。内部负载均衡器的 DNS 名称可公开解析为节点的私有 IP 地址。因此,内部负载均衡器可路由的请求只能来自对负载均衡器的 VPC 具有访问权限的客户端。

面向 Internet 的负载均衡器和内部负载均衡器均使用私有 IP 地址将请求路由到您的目标。因此,您的目标无需使用公有 IP 地址从内部负载均衡器或面向 Internet 的负载均衡器接收请求。

如果您的应用程序具有多个层,则可以设计一个同时使用内部负载均衡器和面向 Internet 的负载均衡器的架构。例如,如果您的应用程序使用必须连接到 Internet 的 Web 服务器,以及仅连接到 Web 服务器的应用程序服务器,则可以如此。创建一个面向 Internet 的负载均衡器并向其注册 Web 服务器。创建一个内部负载均衡器并向它注册应用程序服务器。Web 服务器从面向 Internet 的负载均衡器接收请求,并将对应用程序服务器的请求发送到内部负载均衡器。应用程序服务器从内部负载均衡器接收请求。

您的负载均衡器的网络 MTU

最大传输单位(MTU)决定了可以通过网络发送的最大数据包大小(以字节为单位)。连接的 MTU 越大,可在单个数据包中传递的数据越多。以太网帧由数据包(即您发送的实际数据)以及相关网络开销信息组成。通过互联网网关发送的流量具有 1500 的 MTU。这意味着,如果数据包超过 1500 字节,则将其分段以使用多个帧发送,或者如果在 IP 标头中设置 Don't Fragment,则将其丢弃。

负载均衡器节点上的 MTU 大小不可配置。Jumbo 帧 (9001 MTU) 在应用程序负载均衡器、网络负载均衡器和经典负载均衡器的负载均衡器节点中是标准的。网关负载均衡器支持 8500 MTU。有关更多信息,请参阅网关负载均衡器用户指南中的最大传输单位 (MTU)

路径 MTU 是原始主机和接收主机之间的路径所支持的最大数据包大小。路径 MTU 发现 (PMTUD) 用于确定两台设备之间的路径 MTU。如果客户端或目标不支持巨型帧,路径 MTU 发现特别重要。

如果主机发送一个大于接收主机的 MTU 或大于路径上某台设备的 MTU 的数据包,则接收主机或设备将丢弃此数据包,然后返回以下 ICMP 消息:Destination Unreachable: Fragmentation Needed and Don't Fragment was Set (Type 3, Code 4)。这将指示传输主机将有效负载拆分为多个较小的数据包,并重新传输。

如果继续丢弃大于客户端或目标接口 MTU 大小的数据包,则可能是路径 MTU 发现 (PMTUD) 不起作用。为了避免这种情况,请确保路径 MTU 发现端到端工作,并且您已在客户端和目标上启用了巨型帧。有关路径 MTU 发现和启用巨型帧的详细信息,请参阅 Amazon EC2 用户指南中的路径 MTU 发现