

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

# Application Load Balancer 的目标组
<a name="load-balancer-target-groups"></a>

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

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

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

**Topics**
+ [路由配置](#target-group-routing-configuration)
+ [Target type](#target-type)
+ [IP 地址类型](#target-group-ip-address-type)
+ [协议版本](#target-group-protocol-version)
+ [已注册目标](#registered-targets)
+ [目标优化器](#target-optimizer)
+ [目标组属性](#target-group-attributes)
+ [目标组运行状况](#target-group-health)
+ [创建目标组](create-target-group.md)
+ [配置运行状况检查](target-group-health-checks.md)
+ [编辑目标组属性](edit-target-group-attributes.md)
+ [注册目标](target-group-register-targets.md)
+ [使用 Lambda 函数作为目标](lambda-functions.md)
+ [为目标组添加标签](target-group-tags.md)
+ [删除目标组](delete-target-group.md)

## 路由配置
<a name="target-group-routing-configuration"></a>

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

目标组支持以下协议和端口：
+ **协议**：HTTP、HTTPS
+ **端口**：1-65535

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

## Target type
<a name="target-type"></a>

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

以下是可能的目标类型：

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

`ip`  
目标是 IP 地址。

`lambda`  
目标是 Lambda 函数。

当目标类型为 `ip` 时，您可以指定来自以下 CIDR 块之一的 IP 地址：
+ 目标组的 VPC 的子网
+ 10.0.0.0/8 ([RFC 1918](https://tools.ietf.org/html/rfc1918))
+ 100.64.0.0/10 ([RFC 6598](https://tools.ietf.org/html/rfc6598))
+ 172.16.0.0/12 (RFC 1918)
+ 192.168.0.0/16 (RFC 1918)

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

您可以使用所有支持的 CIDR 块，向目标组注册以下目标：
+ 实例位于与负载均衡器 VPC 对等的 VPC（位于同一区域或不同区域）中。
+ Amazon 可通过 IP 地址和端口寻址的资源（例如数据库）。
+  Amazon 通过 Amazon Direct Connect 或 Site-to-Site VPN 连接链接到的本地资源。

**注意**  
对于部署在本地区域内的应用程序负载均衡器，`ip` 目标必须位于同一个本地区域中才能接收流量。  
有关更多信息，请参阅[什么是 L Amazon ocal Zones？](https://docs.amazonaws.cn/local-zones/latest/ug/getting-started.html)

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

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

您可以将 Amazon Elastic Container Service（Amazon ECS）配置为应用程序负载均衡器的目标。有关更多信息，请参阅《Amazon Elastic Container Service 用户指南》中的[使用 Amazon ECS 的应用程序负载均衡器](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/alb.html)**。

## IP 地址类型
<a name="target-group-ip-address-type"></a>

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

应用程序负载均衡器的目标组支持以下 IP 地址类型：

**`ipv4`**  
负载均衡器使用 IPv4与目标通信。

**`ipv6`**  
负载均衡器使用 IPv6与目标通信。

**注意事项**
+ 负载均衡器根据目标组的 IP 地址类型与目标进行通信。 IPv4 目标组的目标必须接受来自负载均衡器的 IPv4流量， IPv6 目标组的目标必须接受来自负载均衡器的 IPv6 流量。
+ 您不能将 IPv6 目标组与`ipv4`负载均衡器一起使用。
+ 您无法向 IPv6 目标组注册 Lambda 函数。

## 协议版本
<a name="target-group-protocol-version"></a>

默认情况下，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`。
+ 唯一支持的目标类型是 `instance` 和 `ip`。
+ 负载均衡器解析 gRPC 请求并根据程序包、服务和方法将 gRPC 调用路由到相应的目标组。
+ 负载均衡器支持一元、客户端流媒体、服务器端流媒体和双向流媒体。
+ 您必须提供格式为 `/package.service/method` 的自定义运行状况检查方法。
+ 在检查来自目标的成功响应时，必须指定 gRPC 状态代码。
+ 不能将 Lambda 函数用作目标。

**HTTP/2 协议版本的注意事项**
+ 唯一支持的侦听器协议是 HTTPS。
+ 监听器规则唯一支持的操作类型是 `forward`。
+ 唯一支持的目标类型是 `instance` 和 `ip`。
+ 负载均衡器支持一元、客户端流媒体、服务器端流媒体和双向流媒体。每个客户端 HTTP/2 连接的最大流数为 128。

## 已注册目标
<a name="registered-targets"></a>

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

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

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

如果要通过实例 ID 来注册目标，则可以将负载均衡器与 Auto Scaling 组一同使用。将一个目标组挂接到 Auto Scaling 组后，Auto Scaling 在启动目标时会为您向该目标组注册目标。有关更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南*中的[将负载均衡器挂接到 Auto Scaling 组](https://docs.amazonaws.cn/autoscaling/ec2/userguide/attach-load-balancer-asg.html)。

**限制**
+ 不能注册同一 VPC 中其他应用程序负载均衡器的 IP 地址。如果另一个 Application Load Balancer 位于与负载均衡器 VPC 对等的 VPC 中，则可以注册其 IP 地址。
+ 如果实例位于与负载均衡器 VPC 对等的 VPC（位于同一区域或不同区域）中，则不能利用实例 ID 注册这些实例。可以用 IP 地址注册这些实例。

## 目标优化器
<a name="target-optimizer"></a>

 可以在目标组上启用目标优化器。目标优化器允许您在目标上准确地强制执行最大数量的并发请求。它需要在目标上安装和配置的代理的帮助下运行。要启用目标优化器，请为目标组指定目标控制端口。此端口用于管理代理和负载均衡器之间的流量。目标优化器只能在创建目标组期间启用。一旦指定了目标控制端口，便无法修改。有关更多信息，请参阅 [目标优化器](target-group-register-targets.md#register-targets-target-optimizer)。

## 目标组属性
<a name="target-group-attributes"></a>

您可以通过编辑目标组的属性来配置它。有关更多信息，请参阅 [编辑目标组属性](edit-target-group-attributes.md)。

如果目标组类型为 `instance` 或 `ip`，则支持以下目标组属性：

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

`load_balancing.algorithm.type`  
路由算法决定了负载均衡器在路由请求时将如何选择目标。值为 `round_robin`、`least_outstanding_requests` 或 `weighted_random`。默认值为 `round_robin`。

`load_balancing.algorithm.anomaly_mitigation`  
仅当 `load_balancing.algorithm.type` 为 `weighted_random` 时可用。指示是否启用异常缓解。该值为 `on` 或 `off`。默认为 `off`。

`load_balancing.cross_zone.enabled`  
指示是否启用了跨区域负载均衡。该值为 `true`、`false` 或 `use_load_balancer_configuration`。默认为 `use_load_balancer_configuration`。

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

`stickiness.enabled`  
指示是否启用粘性会话。该值为 `true` 或 `false`。默认为 `false`。

`stickiness.app_cookie.cookie_name`  
应用程序 Cookie 的名称。应用程序 Cookie 名称不能具有以下前缀：`AWSALB`、`AWSALBAPP`、或 `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_cookie` 和 `app_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 到 100 之间的整数。设置为 `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 函数之间交换的请求和响应标头是否包含值或字符串的数组。可能的值为 `true` 或 `false`。默认值为 `false`。有关更多信息，请参阅 [多值标头](lambda-functions.md#multi-value-headers)。

## 目标组运行状况
<a name="target-group-health"></a>

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

**Topics**
+ [运行状况不佳状态的操作](#unhealthy-state-actions)
+ [要求和注意事项](#target-group-health-considerations)
+ [监控](#target-group-health-monitoring)
+ [示例](#target-group-health-examples)
+ [为负载均衡器使用 Route 53 DNS 故障转移](#r53-dns-failover)

### 运行状况不佳状态的操作
<a name="unhealthy-state-actions"></a>

您可以为以下操作配置运行状况良好阈值：
+ **DNS 故障转移** — 当某区域中运行状况良好的目标低于阈值时，我们会在 DNS 中将该区域的负载均衡器节点的 IP 地址标记为运行状况不佳。因此，当客户端解析负载均衡器 DNS 名称时，流量将会仅路由到运行状况良好的区域。
+ **路由故障转移** - 当某区域中运行状况良好的目标低于阈值时，负载均衡器会将流量发送到负载均衡器节点可用的所有目标（包括运行状况不佳的目标）。这增加了客户端连接成功的机会，尤其是在目标暂时未能通过运行状况检查时，并降低了运行状况良好的目标过载的风险。

### 要求和注意事项
<a name="target-group-health-considerations"></a>
+ 如果您在目标组上启用目标优化器，我们建议您将目标组的运行状况检查端口设置为与 TARGET\$1CONTROL\$1DATA\$1ADDRESS 中的端口相同。这样可以确保如果代理运行状况不佳，目标将无法通过运行状况检查。有关更多信息，请参阅 [目标优化器](target-group-register-targets.md#register-targets-target-optimizer)。
+ 不能将此功能用于目标是 Lambda 函数的目标组。如果应用程序负载均衡器是网络负载均衡器或全局加速器的目标，请不要为 DNS 故障转移配置阈值。
+ 如果为某项操作指定了两种类型的阈值（计数和百分比），则负载均衡器会在违反任一阈值时执行该操作。
+ 如果为这两项操作都指定了阈值，则 DNS 故障转移的阈值必须大于或等于路由故障转移的阈值，以便 DNS 故障转移会在路由故障转移时或之前发生。
+ 如果您将阈值指定为百分比，我们将根据在目标组中注册的目标总数动态计算该值。
+ 目标总数取决于关闭还是打开跨区域负载均衡。如果跨区域负载均衡处于关闭状态，则每个节点仅向自己区域中的目标发送流量，这意味着阈值将分别应用于每个已启用区域中的目标数量。如果跨区域负载均衡处于打开状态，则每个节点将流量发送到所有已启用区域中的所有目标，这意味着指定的阈值将应用于所有已启用区域中的目标总数。有关更多信息，请参阅 [跨可用区负载均衡](edit-target-group-attributes.md#modify-cross-zone)。
+ 当发生 DNS 故障转移时，会影响与负载均衡器关联的所有目标组。请确保剩余区域中有足够的容量来处理这些额外流量，尤其是在跨区域负载均衡关闭的情况下。
+ 通过 DNS 故障转移，我们会从负载均衡器的 DNS 主机名中删除运行状况不佳区域的 IP 地址。但是，在 DNS 记录中的 time-to-live (TTL) 到期（60 秒）之前，本地客户端 DNS 缓存可能包含这些 IP 地址。
+ 使用 DNS 故障转移时，如果一个应用程序负载均衡器附加了多个目标组，并且一个可用区中有一个目标组运行不正常，同时该可用区中至少有另外一个目标组运行正常，则将会通过 DNS 运行状况检查。
+ 使用 DNS 故障转移时，如果所有负载均衡器区域都被视为运行状况不佳，则负载均衡器会将流量发送到所有区域（包括运行状况不佳的区域）。
+ 除了是否有足够运行状况良好的目标可能会导致 DNS 故障转移之外，还有其他因素，例如区域的运行状况。

### 监控
<a name="target-group-health-monitoring"></a>

要监控目标群体的健康状况，[请参阅目标群体的健康CloudWatch 指标](load-balancer-cloudwatch-metrics.md#target-group-health-metric-table)。

### 示例
<a name="target-group-health-examples"></a>

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

**场景**
+ 支持 A 和 B 两个可用区的负载均衡器
+ 每个可用区中包含 10 个注册目标
+ 目标组具有以下目标组运行状况设置：
  + DNS 故障转移 - 50%
  + 路由故障转移 - 50%
+ 可用区 B 中有六个目标失败

![\[为两个区域启用的负载均衡器。AZ A 有 10 个运行状况良好的目标，AZ B 有 4 个运行状况良好的目标和 6 个运行状况不佳的目标。\]](http://docs.amazonaws.cn/elasticloadbalancing/latest/application/images/tg-health-example.png)


**如果跨区域负载均衡关闭**
+ 每个可用区中的负载均衡器节点只能将流量发送到其可用区内的 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 故障转移
<a name="r53-dns-failover"></a>

如果使用 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 博客中的[使用负载均衡器目标组运行状况阈值提高可用性](https://www.amazonaws.cn/blogs/networking-and-content-delivery/using-load-balancer-target-group-health-thresholds-to-improve-availability/)和 *Amazon Route 53 开发人员指南*中的[配置 DNS 故障转移](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/dns-failover-configuring.html)。