Elastic Load Balancing 的工作原理 - Elastic Load Balancing
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Elastic Load Balancing 的工作原理

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

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

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

  • Application Load Balancer

  • Network Load Balancer

  • 网关负载均衡器

  • Classic Load Balancer

负载均衡器类型的配置方式具有一个关键区别。对于 Application Load Balancer、Network Load Balancer 和 Gateway Load Balancer,可以在目标组中注册目标,并将流量路由到目标组。通过 Classic 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% 的客户端流量路由到其可用区中的目标。


                    禁用跨区域负载均衡时

对于 Application Load Balancer,跨区域负载均衡始终处于启用状态。

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

在创建 Classic Load Balancer 时,跨区域负载均衡的默认值取决于创建负载均衡器的方式。默认情况下,使用 API 或 CLI 时将禁用跨区域负载均衡。默认情况下,使用 Amazon Web Services Management Console时启用跨区域负载均衡的选项处于选中状态。创建 Classic Load Balancer 后,您随时可以启用或禁用跨区域负载均衡。有关更多信息,请参阅 Classic Load Balancer 用户指南中的启用跨区域负载均衡

请求路由选择

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

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

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

路由算法

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

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

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

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

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

    • 协议

    • 源 IP 地址和源端口

    • 目标 IP 地址和目标端口

    • TCP 序列号

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

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

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

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

HTTP 连接

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

对于前端连接,Application Load Balancer 和 Classic Load Balancer 支持管道化 HTTP。对于后端连接它们均不支持管道化 HTTP。

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

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

对于前端连接(客户端到负载均衡器),Classic Load Balancer 支持以下协议: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 和 Classic 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 和 Classic Load Balancer 将响应代理返回客户端后,遵守来自传入客户端请求的连接标头。

当 Application Load Balancer 和 Classic Load Balancer 收到 Expect 标头时,它们会立即使用 HTTP 100 Continue 响应客户端而不测试内容长度标头,然后会删除 Expect 标头,再路由请求。

HTTP 标头限制

Application Load Balancer 的以下大小限制是无法更改的硬限制。

HTTP/1.x 标头

  • 请求行:16K

  • 单个标头:16K

  • 整个标头:64K

HTTP/2 标头

  • 请求行:16K

  • 单个标头:16K

  • 整个标头:64K

负载均衡器模式

在创建负载均衡器时,您必须选择使其成为内部负载均衡器还是面向 Internet 的负载均衡器。请注意,当您在 EC2-Classic 中创建 Classic Load Balancer 时,它必须是面向 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 标记,则丢弃数据包。

Application Load Balancer、Network Load Balancer 或 Classic Load Balancer 节点上的 MTU 大小不可配置。巨型帧 (MTU 9001) 是所有负载均衡器节点的标准。路径 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 发现