Application Load Balancer 的目标组 - Elastic Load Balancing
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Application Load Balancer 的目标组

目标组使用您指定的协议和端口号将请求路由到个别注册目标,例如 EC2 实例。您可以向多个目标组注册一个目标。您可以对每个目标组配置运行状况检查。在注册到目标组 (它是使用负载均衡器的侦听器规则指定的) 的所有目标上,执行运行状况检查。

每个目标组均用于将请求路由到一个或多个已注册的目标。在创建每个侦听器规则时,可以指定目标组和条件。满足规则条件时,流量会转发到相应的目标组。您可以为不同类型的请求创建不同的目标组。例如,为一般请求创建一个目标组,为应用程序的微服务请求创建其他目标组。您可以将每个目标组仅与一个负载均衡器一起使用。有关更多信息,请参阅 Application Load Balancer 组件

您基于每个目标组定义负载均衡器的运行状况检查设置。每个目标组均使用默认运行状况检查设置,除非您在创建目标组时将其覆盖或稍后对其进行修改。在侦听器规则中指定一个目标组后,负载均衡器将持续监控已注册到该目标组的所有目标 (这些目标位于已为负载均衡器启用的可用区中) 的运行状况。负载均衡器将请求路由到正常运行的已注册目标。

路由配置

默认情况下,负载均衡器会使用您在创建目标组时指定的协议和端口号将请求路由到其目标。此外,您可以覆盖在将目标注册到目标组时用于将流量路由到目标的端口。

目标组支持以下协议和端口:

  • 协议:HTTP、HTTPS

  • 端口:1-65535

当目标组配置了 HTTPS 协议或使用 HTTPS 运行状况检查时,如果任何 HTTPS 侦听器正在使用 TLS 1.3 安全策略,则将使用 ELBSecurityPolicy-TLS13-1-0-2021-06 安全策略进行目标连接。否则,将使用 ELBSecurityPolicy-2016-08 安全策略。负载均衡器将使用您在目标上安装的证书与目标建立 TLS 连接。负载均衡器不验证这些证书。因此,您可以使用自签名证书或已过期的证书。由于负载均衡器及其目标位于虚拟私有云(VPC)中,因此负载均衡器与目标之间的流量将在数据包级别进行身份验证,这样即使目标上的证书无效,它也不会面临中间人攻击或欺骗风险。离开 Amazon 的流量将不会受到相同保护,并且可能需要采取额外措施来进一步保护流量。

Target type

创建目标组时,指定其目标类型,此类型将确定您在向此目标组注册目标时指定的目标的类型。创建目标组后,将无法更改其目标类型。

以下是可能的目标类型:

instance

这些目标通过实例 ID 指定。

ip

目标是 IP 地址。

lambda

目标是 Lambda 函数。

当目标类型为 ip 时,您可以指定来自以下 CIDR 块之一的 IP 地址:

  • 目标组的 VPC 的子网

  • 10.0.0.0/8 (RFC 1918)

  • 100.64.0.0/10 (RFC 6598)

  • 172.16.0.0/12 (RFC 1918)

  • 192.168.0.0/16 (RFC 1918)

重要

不能指定可公开路由的 IP 地址。

您可以使用所有支持的 CIDR 块,向目标组注册以下目标:

  • 实例位于与负载均衡器 VPC 对等的 VPC(位于同一区域或不同区域)中。

  • 可通过 IP 地址和端口寻址的 Amazon 资源(例如,数据库)。

  • 通过 Amazon Direct Connect 或 Site-to-Site VPN 连接链接到 Amazon 的本地资源。

注意

对于部署在本地区域内的应用程序负载均衡器,ip 目标必须位于同一个本地区域中才能接收流量。

有关更多信息,请参阅什么是 Amazon Local Zones?

如果使用实例 ID 指定目标,则使用实例的主网络接口中指定的主私有 IP 地址将流量路由到实例。如果使用 IP 地址指定目标,则可以使用来自一个或多个网络接口的任何私有 IP 地址将流量路由到实例。这使一个实例上的多个应用程序可以使用同一端口。每个网络接口都可以有自己的安全组。

如果您的目标组的目标类型为 lambda,则可注册单个 Lambda 函数。当负载均衡器收到 Lambda 函数的请求时,它会调用 Lambda 函数。有关更多信息,请参阅 使用 Lambda 函数作为应用程序负载均衡器的目标

您可以将 Amazon Elastic Container Service(Amazon ECS)配置为应用程序负载均衡器的目标。有关更多信息,请参阅《Amazon Fargate 的 Amazon Elastic Container Service 用户指南》中的创建应用程序负载均衡器

IP 地址类型

创建新目标组时,可以选择目标组的 IP 地址类型。此 IP 地址控制用于与目标进行通信并检查其运行状况的 IP 版本。

Application Load Balancer 支持 IPv4 和 IPv6 目标组。默认选择为 IPv4。

注意事项
  • 目标组中的所有 IP 地址均必须具有相同的 IP 地址类型。例如,您无法向 IPv6 目标组注册 IPv4 目标。

  • IPv6 目标组只能用于 dualstack 负载均衡器。

  • IPv6 目标组支持 IP 和实例类型目标。

协议版本

默认情况下,Application Load Balancer 使用 HTTP/1.1 向目标发送请求。您可以通过协议版本使用 HTTP/2 或 gRPC 向目标发送请求。

下表汇总了请求协议和目标组协议版本组合的结果。

请求协议 协议版本 结果
HTTP/1.1 HTTP/1.1 成功
HTTP/2 HTTP/1.1 成功
gRPC HTTP/1.1 错误
HTTP/1.1 HTTP/2 错误
HTTP/2 HTTP/2 成功
gRPC HTTP/2 如果目标支持 grPC,则成功
HTTP/1.1 gRPC 错误
HTTP/2 gRPC 如果 POST 请求,则成功
gRPC gRPC 成功
gRPC 协议版本的注意事项
  • 唯一支持的侦听器协议是 HTTPS。

  • 监听器规则唯一支持的操作类型是 forward

  • 唯一支持的目标类型是 instanceip

  • 负载均衡器解析 gRPC 请求并根据程序包、服务和方法将 gRPC 调用路由到相应的目标组。

  • 负载均衡器支持一元、客户端流媒体、服务器端流媒体和双向流媒体。

  • 您必须提供格式为 /package.service/method 的自定义运行状况检查方法。

  • 在检查来自目标的成功响应时,必须指定 gRPC 状态代码。

  • 不能将 Lambda 函数用作目标。

HTTP/2 协议版本的注意事项
  • 唯一支持的侦听器协议是 HTTPS。

  • 监听器规则唯一支持的操作类型是 forward

  • 唯一支持的目标类型是 instanceip

  • 负载均衡器支持从客户端流式传输。负载均衡器不支持流式传输到目标。

已注册目标

您的负载均衡器充当客户端的单一接触点,并跨其正常运行的已注册目标分发传入流量。您可以将每个目标注册到一个或多个目标组中。

如果应用程序需求增加,您可以向一个或多个目标组注册其他目标以便满足该需求。一旦注册过程完成并且目标通过了第一次初始运行状况检查,负载均衡器就会开始将流量路由到新注册的目标,而不管配置的阈值如何。

如果应用程序需求减少或者您需要为目标提供服务,您可以从目标组取消注册目标。取消注册目标将从目标组中删除目标,但不会影响目标。取消注册某个目标后,负载均衡器立即停止将请求路由到该目标。目标将进入 draining 状态,直至进行中请求完成。在您准备好目标以继续接收请求时,可以重新将目标注册到目标组。

如果要通过实例 ID 来注册目标,则可以将负载均衡器与 Auto Scaling 组一同使用。将一个目标组挂接到 Auto Scaling 组后,Auto Scaling 在启动目标时会为您向该目标组注册目标。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南中的将负载均衡器挂接到 Auto Scaling 组

限制
  • 您无法在同一 VPC 中注册另一个 Application Load Balancer 的 IP 地址。如果另一个 Application Load Balancer 位于与负载均衡器 VPC 对等的 VPC 中,则可以注册其 IP 地址。

  • 如果实例位于与负载均衡器 VPC 对等的 VPC(位于同一区域或不同区域)中,则不能用实例 ID 注册这些实例。可以用 IP 地址注册这些实例。

目标组属性

您可以通过编辑目标组的属性来配置它。有关更多信息,请参阅 编辑目标组属性

如果目标组类型为 instanceip,则支持以下目标组属性:

deregistration_delay.timeout_seconds

Elastic Load Balancing 在取消注册目标之前等待的时间量。范围为 0–3600 秒。默认值为 300 秒。

load_balancing.algorithm.type

负载均衡算法确定在路由请求时,负载均衡器如何选择目标。值为 round_robinleast_outstanding_requestsweighted_random。默认为 round_robin

load_balancing.algorithm.anomaly_mitigation

仅当 load_balancing.algorithm.typeweighted_random 时可用。指示是否启用异常缓解。该值为 onoff。默认为 off

load_balancing.cross_zone.enabled

指示是否启用了跨区域负载均衡。该值为 truefalseuse_load_balancer_configuration。默认为 use_load_balancer_configuration

slow_start.duration_seconds

一个时间段 (秒),在此期间,负载均衡器将进入目标组的流量的线性增加份额发送给新注册的目标。范围为 30–900 秒 (15 分钟)。默认值为 0 秒 (已禁用)。

stickiness.enabled

指示是否启用粘性会话。该值为 truefalse。默认为 false

stickiness.app_cookie.cookie_name

应用程序 Cookie 的名称。应用程序 Cookie 名称不能具有以下前缀:AWSALBAWSALBAPP、或 AWSALBTG;它们将保留以供负载均衡器使用。

stickiness.app_cookie.duration_seconds

基于应用程序的 Cookie 有效期(以秒为单位)。经过这个有效期后,Cookie 即过期。最小值为 1 秒,最大值为 7 天 (604800 秒)。默认值为 1 天 (86400 秒)。

stickiness.lb_cookie.duration_seconds

基于持续时间的 Cookie 有效期(以秒为单位)。经过这个有效期后,Cookie 即过期。最小值为 1 秒,最大值为 7 天 (604800 秒)。默认值为 1 天 (86400 秒)。

stickiness.type

粘性的类型。可能的值为 lb_cookieapp_cookie

target_group_health.dns_failover.minimum_healthy_targets.count

必须运行状况良好的目标数量下限。如果运行状况良好的目标数量低于此值,请在 DNS 中将该区域标记为运行状况不佳,以便流量仅路由到运行状况良好的区域。可能的值是 off 或 1 到目标数量上限之间的整数。off 时,DNS 失效转移将被禁用,这意味着即使目标组中的所有目标都运行状况不佳,也不会从 DNS 中移除节点。默认 为 1。

target_group_health.dns_failover.minimum_healthy_targets.percentage

必须运行状况良好的目标最低百分比。如果运行状况良好的目标百分比低于此值,请在 DNS 中将节点标记为运行状况不佳,以便流量仅路由到运行状况良好的节点。可能的值是 off 或 1 到目标数量上限之间的整数。off 时,DNS 失效转移将被禁用,这意味着即使目标组中的所有目标都运行状况不佳,也不会从 DNS 中移除节点。默认为 off

target_group_health.unhealthy_state_routing.minimum_healthy_targets.count

必须运行状况良好的目标数量下限。如果运行状况良好的目标数量低于此值,则将流量发送到所有目标(包括运行状况不佳的目标)。范围为 1 到目标数量上限。默认 为 1。

target_group_health.unhealthy_state_routing.minimum_healthy_targets.percentage

必须运行状况良好的目标最低百分比。如果运行状况良好的目标百分比低于此值,则将流量发送到所有目标(包括运行状况不佳的目标)。可能的值为 off 或者 1 到 100 之间的整数。默认为 off

如果目标组类型为 lambda,则支持以下目标组属性:

lambda.multi_value_headers.enabled

指示在负载均衡器和 Lambda 函数之间交换的请求和响应标头是否包含值或字符串的数组。可能的值为 truefalse。默认值为 false。有关更多信息,请参阅 多值标头

路由算法

路由算法是在确定哪些目标将接收请求时负载均衡器使用的方法。默认情况下,使用轮询路由算法在目标组级别路由请求。还可以根据应用程序的需求使用最少未完成的请求加权随机路由算法。一个目标组一次只能有一个活动的路由算法,但可以根据需要随时更新路由算法。

如果启用粘性会话,则所选的路由算法将用于初始目标选择。来自同一客户端的未来请求将被转发到同一目标,从而绕过所选的路由算法。

轮询
  • 轮询路由算法按顺序将请求均匀地路由到目标组中运行状况良好的目标。

  • 当收到的请求复杂度相似、已注册目标的处理能力相似,或者您需要在目标之间平均分配请求时,通常使用此算法。

最少未完成请求
  • 最少未完成的请求路由算法将请求路由到正在进行的请求数最少的目标。

  • 当收到的请求复杂度不同、已注册目标的处理能力不同时,通常使用此算法。

  • 当支持 HTTP/2 的负载均衡器使用仅支持 HTTP/1.1 的目标时,它会将请求转换为多个 HTTP/1.1 请求。在此配置中,最少未完成的请求算法会将每个 HTTP/2 请求视为多个请求。

  • 使用 WebSocket 时,将使用最少未完成的请求算法选择目标。选择后,负载均衡器将创建与目标的连接并通过此连接发送所有消息。

  • 最少未完成的请求路由算法不能与慢启动模式一起使用。

加权随机
  • 加权随机路由算法以随机顺序在目标组中运行状况良好的目标之间均匀路由请求。

  • 此算法支持自动目标权重(ATW)异常缓解。

  • 加权随机路由算法不能与慢启动模式一起使用。

  • 加权随机路由算法不能与粘性会话一起使用。

修改目标组的路由算法

您可以随时修改目标组的路由算法。

使用新控制台修改路由算法
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的负载均衡下,选择目标组

  3. 选择目标组的名称以打开其详细信息页面。

  4. 在目标组详细信息页面的属性选项卡上,选择编辑

  5. 编辑目标组属性页面的流量配置部分的负载平衡算法下,选择轮询最少未完成的请求加权随机

  6. 选择 Save changes(保存更改)

使用 Amazon CLI 修改路由算法

使用带 load_balancing.algorithm.type 属性的 modify-target-group-attributes 命令。

目标组运行状况

默认情况下,只要目标组至少有一个运行状况良好的目标,就会被视为运行状况良好。如果您的实例集很大,则仅有一个运行状况良好的目标为流量提供服务是不够的。相反,您可以指定必须运行状况良好的目标数量下限或最低百分比,以及当运行状况良好的目标低于指定阈值时负载均衡器将采取哪些操作。这样可以提高可用性。

运行状况不佳状态的操作

您可以为以下操作配置运行状况良好阈值:

  • DNS 故障转移 — 当某区域中运行状况良好的目标低于阈值时,我们会在 DNS 中将该区域的负载均衡器节点的 IP 地址标记为运行状况不佳。因此,当客户端解析负载均衡器 DNS 名称时,流量将会仅路由到运行状况良好的区域。

  • 路由故障转移 - 当某区域中运行状况良好的目标低于阈值时,负载均衡器会将流量发送到负载均衡器节点可用的所有目标(包括运行状况不佳的目标)。这增加了客户端连接成功的机会,尤其是在目标暂时未能通过运行状况检查时,并降低了运行状况良好的目标过载的风险。

要求和注意事项

  • 不能将此功能用于目标是 Lambda 函数的目标组。如果应用程序负载均衡器是网络负载均衡器或全局加速器的目标,请不要为 DNS 故障转移配置阈值。

  • 如果为某项操作指定了两种类型的阈值(计数和百分比),则负载均衡器会在违反任一阈值时执行该操作。

  • 如果为这两项操作都指定了阈值,则 DNS 故障转移的阈值必须大于或等于路由故障转移的阈值,以便 DNS 故障转移会在路由故障转移时或之前发生。

  • 如果您将阈值指定为百分比,我们将根据在目标组中注册的目标总数动态计算该值。

  • 目标总数取决于关闭还是打开跨区域负载均衡。如果跨区域负载均衡处于关闭状态,则每个节点仅向自己区域中的目标发送流量,这意味着阈值将分别应用于每个已启用区域中的目标数量。如果跨可用区负载均衡处于打开状态,则每个节点将流量发送到所有已启用区域中的所有目标,这意味着指定的阈值将应用于所有已启用区域中的目标总数。

  • 通过 DNS 故障转移,我们会从负载均衡器的 DNS 主机名中删除运行状况不佳区域的 IP 地址。但是,本地客户端 DNS 缓存中可能会包含这些 IP 地址,直到 DNS 记录中的生存时间 (TTL) 到期(60 秒)。

  • 当发生 DNS 故障转移时,这会影响与负载均衡器关联的所有目标组。请确保剩余区域中有足够的容量来处理这些额外流量,尤其是在跨区域负载均衡关闭的情况下。

  • 使用 DNS 故障转移时,如果所有负载均衡器区域都被视为运行状况不佳,则负载均衡器会将流量发送到所有区域(包括运行状况不佳的区域)。

  • 除了是否有足够运行状况良好的目标可能会导致 DNS 故障转移之外,还有其他因素,例如区域的运行状况。

监控

要监控目标组的运行状况,请参阅目标组运行状况的 CloudWatch 指标

示例

以下示例演示了如何应用目标组运行状况设置。

场景
  • 支持 A 和 B 两个可用区的负载均衡器

  • 每个可用区中包含 10 个注册目标

  • 目标组具有以下目标组运行状况设置:

    • DNS 故障转移 - 50%

    • 路由故障转移 - 50%

  • 可用区 B 中有六个目标失败

如果跨区域负载均衡关闭
  • 每个可用区中的负载均衡器节点只能将流量发送到其可用区内的 10 个目标。

  • 可用区 A 中有 10 个运行状况良好的目标,符合所需的运行状况良好的目标百分比。负载均衡器继续在 10 个运行状况良好的目标之间分配流量。

  • 可用区 B 中只有 4 个运行状况良好的目标,占可用区 B 中负载均衡器节点目标的 40%。由于这低于所需的运行状况良好的目标百分比,负载均衡器会执行以下操作:

    • DNS 故障转移 - 可用区 B 在 DNS 中被标记为运行状况不佳。由于客户端无法将负载均衡器名称解析为可用区 B 中的负载均衡器节点,并且可用区 A 运行状况良好,因此客户端会向可用区 A 发送新连接。

    • 路由故障转移 - 当新连接明确发送到可用区 B 时,负载均衡器会将流量分配到可用区 B 中的所有目标(包括运行状况不佳的目标)。这样可以防止剩余运行状况良好的目标发生中断。

如果跨区域负载均衡打开
  • 每个负载均衡器节点可以向两个可用区中的所有 20 个注册目标发送流量。

  • 可用区 A 中有 10 个运行状况良好的目标,可用区 B 中有 4 个运行状况良好的目标,总共有 14 个运行状况良好的目标。这是两个可用区中负载均衡器节点目标的 70%,符合所需的运行状况良好的目标百分比。

  • 负载均衡器将在两个可用区内 14 个运行状况良好的目标之间分配流量。

为负载均衡器使用 Route 53 DNS 故障转移

如果使用 Route 53 将 DNS 查询路由到您的负载均衡器,您也可以使用 Route 53 为您的负载均衡器配置 DNS 故障转移。在失效转移配置中,Route 53 将检查负载均衡器的目标组目标的运行状况以确定目标是否可用。如果没有已注册到负载均衡器的运行状况正常的目标,或如果负载均衡器本身运行状况不佳,则 Route 53 会将流量路由到其他可用资源,例如 Amazon S3 中运行状况正常的负载均衡器或静态网站。

例如,假设您有一个用于 www.example.com 的 Web 应用程序,并且您希望使用在不同区域内的两个负载均衡器之后运行的冗余实例。您希望流量主要路由到一个区域中的负载均衡器,并且您希望在发生故障期间将另一个区域中的负载均衡器用作备份。如果配置 DNS 故障转移,则可以指定您的主和辅助 (备份) 负载均衡器。如果主负载均衡器可用,则 Route 53 会将流量定向到主负载均衡器,否则会将流量定向到辅助负载均衡器。

使用评估目标运行状况功能
  • 当应用程序负载均衡器别名记录上的“评估目标运行状况”设置为 Yes 时,Route 53 将评估 alias target 值指定的资源的运行状况。对于应用程序负载均衡器,Route 53 使用与负载均衡器关联的目标组运行状况检查。

  • 当应用程序负载均衡器中的所有目标组均运行正常时,Route 53 会将别名记录标记为运行正常。如果目标组至少包含一个运行正常的目标,目标组将通过运行状况检查。然后,Route 53 会根据您的路由策略返回记录。如果使用失效转移路由策略,则 Route 53 返回主记录。

  • 如果应用程序负载均衡器中的任何目标组运行不正常,则别名记录无法通过 Route 53 运行状况检查(失效时开放)。如果使用评估目标运行状况,则失效转移路由策略会失败。

  • 如果应用程序负载均衡器中的所有目标组均为空(无目标),则 Route 53 会认为该记录运行不正常(失效时开放)。如果使用评估目标运行状况,则失效转移路由策略会失败。

有关更多信息,请参阅 Amazon Route 53 开发人员指南中的配置 DNS 故障转移