

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

# 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.amazonaws.cn/AWSEC2/latest/UserGuide/spot-interruptions.html)（在 Amazon EC2 需要收回容量时回收的竞价型实例的数量）。但是，如果容量再平衡检测到实例存在中断风险，Amazon EC2 Auto Scaling 将立即尝试启动新实例。因此，与您在中断存在风险的实例后等待 Amazon EC2 Auto Scaling 启动新实例的情况相比，可以替换更多实例。  
虽然您可能会在启用容量重新平衡的情况下替换更多的实例，但您会因为处于主动而非被动地位而受益。这使您在实例中断之前有更多时间采取行动。使用 [Spot Instance interruption notice](https://docs.amazonaws.cn/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 将一直运行到此时。