Elastic Load Balancing 在一个或多个可用区中的多个目标(如 EC2 实例、容器和 IP 地址)之间自动分配传入的流量。它会监控已注册目标的运行状况,并仅将流量传输到运行状况良好的目标。Elastic Load Balancing 根据传入流量随时间的变化对负载均衡器进行扩展。它可以自动扩展来处理绝大部分工作负载。
Elastic Load Balancing 支持以下负载均衡器:Application Load Balancer、Network Load Balancer、Gateway Load Balancer 和 Classic Load Balancer。
网络负载均衡器概述
网络负载均衡在开放系统互连 (OSI) 模型的第四层运行。它每秒可以处理数百万个请求。在负载均衡器收到连接请求后,它会从默认规则的目标组中选择一个目标。它尝试在侦听器配置中指定的端口上打开一个到该选定目标的 TCP 连接。
当您为负载均衡器启用可用区时,Elastic Load Balancing 会在该可用区中创建一个负载均衡器节点。默认情况下,每个负载均衡器节点仅在其可用区中的已注册目标之间分配流量。如果您启用了跨区域负载均衡,则每个负载均衡器节点会在所有启用的可用区中的已注册目标之间分配流量。有关更多信息,请参阅 可用区。
如果为负载均衡器启用多个可用区,并确保每个目标组在每个启用的可用区中至少有一个目标,那么这将提高应用程序的容错能力。例如,如果一个或多个目标组在可用区中没有运行状况良好的目标,我们会从 DNS 中删除相应子网的 IP 地址,但其他可用区中的负载均衡器节点仍可用于路由流量。如果一个客户端不遵守生存时间 (TTL) 而将请求发送到已从 DNS 删除的 IP 地址,则请求会失败。
对于 TCP 流量,负载均衡器基于协议、源 IP 地址、源端口、目标 IP 地址、目标端口和 TCP 序列号,使用流哈希算法选择目标。来自客户端的 TCP 连接具有不同的源端口和序列号,可以路由到不同的目标。每个单独的 TCP 连接在连接的有效期内路由到单个目标。
对于 UDP 流量,负载均衡器基于协议、源 IP 地址、源端口、目标 IP 地址和目标端口,使用流哈希算法选择目标。UDP 流具有相同的源和目标,因此始终在其整个生命周期内路由到单个目标。不同 UDP 流具有不同的源 IP 地址和端口,因此它们可以路由到不同的目标。
Elastic Load Balancing 将为启用的每个可用区创建一个网络接口。可用区内的每个负载均衡器节点使用该网络接口来获取一个静态 IP 地址。在您创建面向 Internet 的负载均衡器时,可以选择将一个弹性 IP 地址与每个子网关联。
在创建目标组时,应指定其目标类型,这决定您是否通过实例 ID 或 IP 地址注册目标。如果您使用实例 ID 注册目标,则客户端的源 IP 地址将保留并提供给您的应用程序。如果您使用 IP 地址注册目标,则源 IP 地址是负载均衡器节点的私有 IP 地址。
可以根据需求变化在负载均衡器中添加和删除目标,而不会中断应用程序的整体请求流。Elastic Load Balancing 根据传输到应用程序的流量随时间的变化对负载均衡器进行扩展。Elastic Load Balancing 能够自动扩展来处理绝大部分工作负载。
您可以配置运行状况检查,这些检查可用来监控注册目标的运行状况,以便负载均衡器只能将请求发送到正常运行的目标。
网关负载平衡器概述
网关负载平衡器使您能够部署、扩展和管理虚拟设备,例如防火墙、入侵检测和防御系统以及深度数据包检测系统。它结合了一个透明的网络网关(即所有流量的单个入口和出口点),并分配流量,同时根据需求扩展虚拟设备。
网关 Load Balancer 在开放系统互连 (OSI) 模型的第三层(网络层)运行。它监听所有端口上的所有 IP 数据包,并将流量转发到监听程序规则中指定的目标组。它使用 5 元组(对于 TCP/UDP 流)或 3 元组(对于非 TCP/UDP 流)来保持流向特定目标设备的粘性。网关 Load Balancer 及其注册的虚拟设备实例使用端口 6081 上的 GENEVE 协议交换应用程序流量。它支持 8500 字节的最大传输单位 (MTU) 大小。
网关 Load Balancer 使用网关负载均衡器终端节点来安全地跨 VPC 边界交换流量。网关 Load Balancer 终端节点是在服务提供商 VPC 中的虚拟设备与服务使用者 VPC 中的应用程序服务器之间提供私有连接的 VPC 终端节点。您可以在与虚拟设备相同的 VPC 中部署网关 Load Balancer。向网关 Load Balancer 的目标组注册虚拟设备。
进出网关 Load Balancer 终端节点的流量使用路由表进行配置。流量从服务使用者 VPC 通过网关 Load Balancer 终端节点流向服务提供商 VPC 中的网关 Load Balancer,然后返回到服务使用者 VPC。您必须在不同的子网中创建网关 Load Balancer 器终端节点和应用程序服务器。这样,您就可以将网关 Load Balancer 终端节点配置为应用程序子网路由表中的下一跳。
Application Load Balancer 概述
Application Load Balancer 在应用程序层正常工作,该层是开放系统互连 (OSI) 模型的第 7 层。负载均衡器收到请求后,将按照优先级顺序评估侦听器规则以确定应用哪个规则,然后从目标组中选择规则操作目标。可以配置侦听器规则,以根据应用程序流量的内容,将请求路由至不同的目标组。每个目标组的路由都是单独进行的,即使某个目标已在多个目标组中注册。可以配置目标组级别使用的路由算法。默认路由算法为轮询路由算法;或者,可以指定最少未完成请求路由算法。
可以根据需求变化在负载均衡器中添加和删除目标,而不会中断应用程序的整体请求流。Elastic Load Balancing 根据传输到应用程序的流量随时间的变化对负载均衡器进行扩展。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 时将禁用跨区域负载均衡。默认情况下,使用 AWS 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,接收请求的负载均衡器节点使用以下过程:
- 按优先级顺序评估侦听器规则以确定要应用的规则。
- 使用为目标组配置的路由算法,从目标组中为规则操作选择目标。默认路由算法是轮询。每个目标组的路由都是单独进行的,即使某个目标已在多个目标组中注册。
借助 Network Load Balancer,接收连接的负载均衡器节点使用以下过程:
- 使用流哈希算法从目标组中为默认规则选择目标。它使算法基于:
- 协议
- 源 IP 地址和源端口
- 目标 IP 地址和目标端口
- TCP 序列号
- 将每个单独的 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 侦听器路由规则和 AWS 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-For、X-Forwarded-Proto 和 X-Forwarded-Port 标头自动添加到请求。
应用程序负载均衡器将 HTTP 主机标头中的主机名转换为小写,然后再将其发送到目标。
对于使用 HTTP/2 的前端连接,标头名称是小写的。使用 HTTP/1.1 将请求发送到目标之前,以下标头名称将转换为混合大小写:X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Port、Host、X-Amzn-Trace-Id、Upgrade 和 Connection。所有其他标头名称是小写的。
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 发现和启用巨型帧的详细信息,
- https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/application/introduction.html
- https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/alb-ingress.html
- https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html
- https://aws.amazon.com/cn/blogs/china/merging-alb-progress-controller-on-the-eks-platform/
- https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/application/target-group-register-targets.html