

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

# Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例
<a name="ec2-auto-scaling-capacity-rebalancing"></a>

Auto Scaling 容量再平衡可主动替换存在中断风险的竞价型实例，从而帮助维持工作负载的可用性。

如果竞价型实例处于较高的中断风险，Amazon EC2 Spot 服务会向 Amazon EC2 Auto Scaling 发送 EC2 实例再平衡建议。如果启用了容量再平衡，Auto Scaling 将尝试主动替换组中已收到再 EC2 实例平衡建议的竞价型实例。这让您能够将工作负载转移到不具有较高中断风险的新竞价型实例。

当您不使用容量再平衡时，在 Amazon EC2 竞价服务中断实例且其运行状况检查失败之前，Auto Scaling 不会替换竞价型实例。在实例中断之前，Amazon EC2 始终会提供 EC2 实例再平衡建议和两分钟竞价型实例中断通知。

**Topics**
+ [概述](#capacity-rebalancing-overview)
+ [容量再平衡行为](#capacity-rebalancing-behavior)
+ [注意事项](#capacity-rebalancing-considerations)
+ [启用容量再平衡，主动替换存在风险的竞价型实例](enable-capacity-rebalancing-console-cli.md)

## 概述
<a name="capacity-rebalancing-overview"></a>

要在自动扩缩组中使用容量再平衡，基本步骤为：

1. 将您的自动扩缩组配置为使用多种实例类型和多个可用区。这样，Amazon EC2 Auto Scaling 可以检查每个可用区中的竞价型实例可用容量。有关更多信息，请参阅 [Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。

1. 根据需要添加生命周期挂钩，以便在收到再平衡通知的实例内正常关闭应用程序。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 生命周期钩子](lifecycle-hooks.md)。

   以下是可能需要使用生命周期挂钩的一些原因：
   + 用于正常关闭 Amazon SQS 工件
   + 完成从域名系统 (DNS) 取消注册
   + 提取系统或应用程序日志并将其上传到 Amazon Simple Storage Service (Amazon S3)

1. 为生命周期挂钩开发自定义操作。若要尽快调用您的自定义操作，您需要知道实例何时可以终止。可以通过检测实例的生命周期状态来找出答案。
   + 要在实例外部调用操作，请编写一条 EventBridge 规则，并在事件模式与规则匹配时自动执行什么操作。
   + 要在实例内部调用操作，请将实例配置为运行关闭脚本并通过实例元数据检索生命周期状态。

   将自定义操作设计成在不到两分钟的时间内完成至关重要。这样可以确保在实例终止之前有足够的时间完成任务。

完成这些步骤后，可以开始使用容量再平衡。

## 容量再平衡行为
<a name="capacity-rebalancing-behavior"></a>

在使用容量再平衡的情况下，当实例收到再平衡建议时，Amazon EC2 Auto Scaling 的行为方式如下：
+ 新的竞价型实例启动时，Amazon EC2 Auto Scaling 会等待新实例通过其运行状况检查，然后继续终止旧实例。替换多个实例时，每个旧实例的终止将在新实例启动并通过其运行状况检查后开始。
+ 因为 Amazon EC2 Auto Scaling 尝试在终止旧实例之前启动新实例，所以达到或接近指定的最大容量可能会阻碍或完全停止再平衡活动。为避免此问题，Amazon EC2 Auto Scaling 可以暂时超出该组的最大容量，最多可超出所需容量的 10%。
+ 如果您没有添加生命周期挂钩至您的自动扩缩组，Amazon EC2 Auto Scaling 将在新实例通过运行状况检查后立即开始终止旧实例。
+ 如果您添加了生命周期挂钩，这将延长我们开始按您为生命周期挂钩指定的超时值终止之前的实例所花费的时间。
+ 如果使用扩缩策略或计划缩，那么扩缩活动将并行运行。如果某个扩缩活动正在进行并且您的 Auto Scaling 组低于其新的所需容量，则 Amazon EC2 Auto Scaling 首先横向扩展，然后再终止旧实例。

如果在一个可用区中没有适用于您的实例类型的容量，那么 Amazon EC2 Auto Scaling 会继续尝试在其他已启用的可用区中启动竞价型实例，直到成功为止。

在最坏的情况下，如果新实例无法启动或其运行状况检查失败，Amazon EC2 Auto Scaling 会不断尝试重新启动它们。当它尝试启动新实例时，您之前的实例最终会被中断并强制终止，并发出两分钟的中断通知。

## 注意事项
<a name="capacity-rebalancing-considerations"></a>

使用容量再平衡时，请考虑以下因素：

**将您的应用程序设计为可以容忍 Spot 中断**  
您的应用程序应该能够处理实例数量的动态变化以及竞价型实例提前中断的可能性。例如，如果您的自动扩缩组位于 Elastic Load Balancing 负载均衡器后面，则 Amazon EC2 Auto Scaling 会等待实例从负载均衡器中取消注册，然后再调用您的生命周期挂钩。如果注销实例和完成生命周期操作花费的时间过长，则在 Amazon EC2 Auto Scaling 等待生命周期操作完成然后终止实例时，实例可能会在期间中断。  
Amazon EC2 并不总能在两分钟的竞价型实例中断通知之前发送再平衡建议信号。有时候，再平衡建议信号可能会在两分钟的中断通知到达的同时一起到达。当发生这种情况时，Amazon EC2 Auto Scaling 会调用生命周期挂钩并尝试立即启动新的竞价型实例。

**避免替换竞价型实例中断的风险升高**  
如果您使用 `lowest-price` 分配策略，替换竞价型实例可能会面临中断升高的风险。这是因为，即使替换竞价型实例可能在启动后不久中断，我们也会在当时具有可用容量的价格最低池中启动实例。为避免中断风险增加，强烈建议您不要使用 `lowest-price` 分配策略。相反，我们建议使用 `price-capacity-optimized` 分配策略。此策略在中断可能性最小、价格尽可能最低的 Spot 池中启动替换竞价型实例。因此，它们在不久的将来不太可能被中断。

**只有可用性相同或更好时，Amazon EC2 Auto Scaling 才会启动新实例**  
容量再平衡的目标之一是提高竞价型实例的可用性。如果现有竞价型实例收到再平衡建议，则 Amazon EC2 Auto Scaling 只有在新实例提供与现有实例相同或更好的可用性时才会启动新实例。如果新实例的中断风险比现有实例更高，则 Amazon EC2 Auto Scaling 将不会启动新实例。但是，Amazon EC2 Auto Scaling 将继续根据 Amazon EC2 竞价服务提供的信息评测竞价型容量池，并在可用性改善时启动新实例。  
如果 Amazon EC2 Auto Scaling 没有主动启动新实例，则您的现有实例可能会中断。发生这种情况时，Amazon EC2 Auto Scaling 会在收到竞价型实例中断通知后立即尝试启动新实例。无论新实例中断的风险是否很高，都会发生这种情况。

**容量再平衡不会提高您的竞价型实例中断率**  
当您启用容量再平衡时，它不会提高您的[竞价型实例中断率](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)（在 Amazon EC2 需要收回容量时回收的竞价型实例的数量）。但是，如果容量再平衡检测到实例存在中断风险，Amazon EC2 Auto Scaling 将立即尝试启动新实例。因此，与您在中断存在风险的实例后等待 Amazon EC2 Auto Scaling 启动新实例的情况相比，可以替换更多实例。  
虽然您可能会在启用容量重新平衡的情况下替换更多的实例，但您会因为处于主动而非被动地位而受益。这使您在实例中断之前有更多时间采取行动。使用 [Spot Instance interruption notice](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html)（竞价型实例中断通知），您通常最多只有两分钟的时间来正常关闭您的实例。借助容量再平衡提前启动新实例，可以让现有流程更有可能在有风险的实例上完成。您还可以启动实例关闭过程，防止在有风险的实例上安排新作业，并使新启动的实例做好接管应用程序的准备。借助容量再平衡的主动替换，您可以因绝佳的连续性而受益。  
以下理论示例演示了使用容量再平衡的风险和优势：  
+ 下午 2:00 - 收到针对实例 A 的再平衡建议，Amazon EC2 Auto Scaling 立即开始尝试启动替换实例 B，让您有时间启动关闭程序。
+ 下午 2:30 - 收到针对实例 B 的再平衡建议，该实例将被替换为实例 C，让您有时间启动关闭程序。
+ 下午 2:32 - 如果未启用容量再平衡，并且实例 A 在下午 2:32 收到竞价型实例中断通知，则您只有两分钟的时间采取行动。但是，实例 A 将一直运行到此时。

# 启用容量再平衡，主动替换存在风险的竞价型实例
<a name="enable-capacity-rebalancing-console-cli"></a>

您可以使用 AWS 管理控制台 或 AWS CLI 为 Auto Scaling 组启用容量重新平衡。当启用容量再平衡时，Amazon EC2 Auto Scaling 将尝试主动替换组中已收到 EC2 实例再平衡建议的竞价型实例。

## 启用容量再平衡（控制台）
<a name="enable-capacity-rebalancing-console"></a>

您可以在创建或更新 Auto Scaling 组时启用或禁用容量再平衡。

**为新的 Auto Scaling 组启用容量再平衡**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选择 **Create Auto Scaling group**（创建 Auto Scaling 组）。

1. 对于**步骤 1：选择启动模板或配置**，为自动扩缩组输入一个名称，选择一个启动模板，然后选择**Next**（下一步）以继续执行下一步骤。

1. 对于**步骤 2：选择实例启动选项**以及对于**实例类型要求**，选择设置以创建混合实例组。这包括该实例可以启动的实例类型、实例购买选项以及竞价型实例和按需型实例的分配策略。预设情况下，这些设置均未配置。要进行配置，必须选择 **Override launch template**（覆盖启动模板）。有关创建混合实例组的更多信息，请参阅 [Auto Scaling 组具有多个实例类型和购买选项](ec2-auto-scaling-mixed-instances-groups.md)。

1. 在**网络**下，根据需要选择选项。验证要使用的子网是否位于不同的可用区中。

1. 在 **分配策略**部分下，选择一个竞价型实例分配策略。要启用或禁用容量再平衡，请选中或清除 **容量再平衡**下的复选框。仅当您在 **实例购买选项**部分请求了自动扩缩组要作为竞价型实例启动的百分比时，才会看到此选项。

1. 创建 Auto Scaling 组。

1. （可选）根据需要添加生命周期挂钩。有关更多信息，请参阅 [向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md)。

**为现有自动扩缩组启用或禁用容量再平衡**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的自动扩缩组旁边的复选框。这时将在页面底部打开一个拆分窗格。

1. 在 **Details**（详细信息）选项卡上，依次选择 **Allocation strategies**（分配策略）、**Edit**（编辑）。

1. 在**分配策略**部分下，可以通过选择或清除**容量再平衡**下的复选框来启用或禁用容量再平衡。

1. 选择**更新**。

## 启用容量再平衡（AWS CLI）
<a name="enable-capacity-rebalancing-aws-cli"></a>

以下示例说明如何使用启用和禁用容量重新平衡。 AWS CLI 

使用带有以下参数的[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)或[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令：
+ `--capacity-rebalance` / `--no-capacity-rebalance`：指示是否启用容量再平衡的布尔值。

在调用[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令之前，您需要配置为用于 Auto Scaling 组的启动模板的名称。有关更多信息，请参阅 [为 Auto Scaling 组创建启动模板](create-launch-template.md)。

**注意**  
以下过程显示如何使用 JSON 或 YAML 格式的配置文件。如果使用 AWS CLI 版本 1，则必须指定 JSON 格式的配置文件。如果您使用 AWS CLI 版本 2，则可以指定格式为 YAML 或 JSON 的配置文件。

### JSON
<a name="enable-capacity-rebalancing-aws-cli-json"></a>

**创建和配置新的 Auto Scaling 组**
+ 使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建新的 Auto Scaling 组并启用容量重新平衡。该命令引用 JSON 文件作为自动扩缩组的唯一参数。

  ```
  aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json
  ```

  如果您还没有指定[混合实例策略](ec2-auto-scaling-mixed-instances-groups.md)的 CLI 配置文件，请创建一个。

  将以下行添加到配置文件中的顶级 JSON 对象。

  ```
  {
      "CapacityRebalance": true
  }
  ```

  下面是一个 `config.json` 示例文件。

  ```
  {
      "AutoScalingGroupName": "my-asg",
      "DesiredCapacity": 12,
      "MinSize": 12,
      "MaxSize": 15,
      "CapacityRebalance": true,
      "MixedInstancesPolicy": {
          "InstancesDistribution": {
              "OnDemandBaseCapacity": 0,
              "OnDemandPercentageAboveBaseCapacity": 25,
              "SpotAllocationStrategy": "price-capacity-optimized"
          },
          "LaunchTemplate": {
              "LaunchTemplateSpecification": {
                  "LaunchTemplateName": "my-launch-template",
                  "Version": "$Default"
              },
              "Overrides": [
                  {
                      "InstanceType": "c5.large"
                  },
                  {
                      "InstanceType": "c5a.large"
                  },
                  {
                      "InstanceType": "m5.large"
                  },
                  {
                      "InstanceType": "m5a.large"
                  },
                  {
                      "InstanceType": "c4.large"
                  },
                  {
                      "InstanceType": "m4.large"
                  },
                  {
                      "InstanceType": "c3.large"
                  },
                  {
                      "InstanceType": "m3.large"
                  }
              ]
          }
      },
      "TargetGroupARNs": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff",
      "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
  }
  ```

### YAML
<a name="enable-capacity-rebalancing-aws-cli-yaml"></a>

**创建和配置新的 Auto Scaling 组**
+ 使用以下[create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)命令创建新的 Auto Scaling 组并启用容量重新平衡。该命令引用 YAML 文件作为自动扩缩组的唯一参数。

  ```
  aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml
  ```

  将以下行添加到 YAML 格式的配置文件。

  ```
  CapacityRebalance: true
  ```

  下面是一个 `config.yaml` 示例文件。

  ```
  ---
  AutoScalingGroupName: my-asg
  DesiredCapacity: 12
  MinSize: 12
  MaxSize: 15
  CapacityRebalance: true
  MixedInstancesPolicy:
    InstancesDistribution:
      OnDemandBaseCapacity: 0
      OnDemandPercentageAboveBaseCapacity: 25
      SpotAllocationStrategy: price-capacity-optimized
    LaunchTemplate:
      LaunchTemplateSpecification:
        LaunchTemplateName: my-launch-template
        Version: $Default
      Overrides:
      - InstanceType: c5.large
      - InstanceType: c5a.large
      - InstanceType: m5.large
      - InstanceType: m5a.large
      - InstanceType: c4.large
      - InstanceType: m4.large
      - InstanceType: c3.large
      - InstanceType: m3.large
  TargetGroupARNs:
  - arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff
  VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782
  ```

**为现有 Auto Scaling 组启用容量再平衡**
+ 使用以下[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令启用容量重新平衡。

  ```
  aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
    --capacity-rebalance
  ```

**验证是否为 Auto Scaling 组启用容量再平衡**
+ 使用以下[describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)命令验证容量重新平衡是否已启用并查看详细信息。

  ```
  aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
  ```

  以下为响应示例。

  ```
  {
      "AutoScalingGroups": [
          {
              "AutoScalingGroupName": "my-asg",
              "AutoScalingGroupARN": "arn",
              ...
              "CapacityRebalance": true
          }
      ]
  }
  ```

**禁用容量再平衡**  
使用带有`--no-capacity-rebalance`选项的[update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)命令可禁用容量重新平衡。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \
  --no-capacity-rebalance
```

## 相关资源
<a name="capacity-rebalancing-related-resources"></a>

有关容量再平衡的更多信息，请参阅 AWS 计算博客上的 “[使用适用于 Amazon EC2 Auto Scaling 的全新容量再平衡功能主动管理竞价型实例生命周期](https://aws.amazon.com/blogs/compute/proactively-manage-spot-instance-lifecycle-using-the-new-capacity-rebalancing-feature-for-ec2-auto-scaling/)”。

有关 EC2 实例再平衡建议的更多信息，请参阅《Amazon EC2 用户指南》**中的 [EC2 实例再平衡建议](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/rebalance-recommendations.html)。

要了解有关生命周期挂钩的更多信息，请参阅以下资源。
+ [教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)（使用 EventBridge）
+ [教程：使用数据脚本和实例元数据检索生命周期状态](tutorial-lifecycle-hook-instance-metadata.md)

## 限制
<a name="capacity-rebalancing-limitations"></a>
+ Amazon EC2 Auto Scaling 只有在接收再平衡通知的实例未受横向缩减保护的情况下才能替换该实例。但是，横向缩减保护并不能阻止因 Spot 中断而终止。有关更多信息，请参阅 [使用实例横向缩减保护以控制实例终止](ec2-auto-scaling-instance-protection.md)。
+ 所有提供 Amazon EC2 Auto Scaling 的商业 AWS 区域 均支持容量再平衡，但不包括中东（阿联酋）区域。