使用容量重新平衡来处理 Amazon EC2 Spot 中断 - Amazon A EC2 uto Scaling

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

使用容量重新平衡来处理 Amazon EC2 Spot 中断

您可以将 Amazon A EC2 uto Scaling 配置为监控并自动响应影响竞价型实例可用性的更改。容量再平衡通过在运行的实例被 Amazon 中断之前主动使用新的竞价型实例扩充队列,从而帮助您保持工作负载的可用性。 EC2

容量再平衡的目标是确保不间断地处理工作负载。当竞价型实例的中断风险较高时,Amazon EC2 Spot 服务会向 Amazon A EC2 uto Scaling 发出 EC2 实例再平衡建议。

当您为 Auto Scaling 组启用容量再平衡时,Amazon A EC2 uto Scaling 会尝试主动替换组中已收到再平衡建议的竞价型实例。这让您能够将工作负载转移到不具有较高中断风险的新竞价型实例。当 Amazon A EC2 uto Scaling 在现有实例中断之前启动新的竞价型实例时,您的工作负载可以继续处理工作。

当您不使用容量再平衡时,Amazon A EC2 uto Scaling 在亚马逊竞价服务中断实例并且其运行状况检查失败后才会取代 EC2 竞价型实例。在中断实例之前,Amazon EC2 始终会同时提供 EC2 实例再平衡建议和 Spot 两分钟实例中断通知。

概览

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

  1. 将您的自动扩缩组配置为使用多种实例类型和多个可用区。这样,Amazon A EC2 uto Scaling 就可以查看每个可用区域中竞价型实例的可用容量。有关更多信息,请参阅 Auto Scaling 组具有多个实例类型和购买选项

  2. 根据需要添加生命周期挂钩,以便在收到再平衡通知的实例内正常关闭应用程序。有关更多信息,请参阅 Amazon A EC2 uto Scaling 生命周期挂钩

    以下是可能需要使用生命周期挂钩的一些原因:

    • 用于正常关闭 Amazon SQS 工件

    • 完成从域名系统 (DNS) 取消注册

    • 提取系统或应用程序日志并将其上传到 Amazon Simple Storage Service (Amazon S3)

  3. 为生命周期挂钩开发自定义操作。若要尽快调用您的自定义操作,您需要知道实例何时可以终止。可以通过检测实例的生命周期状态来找出答案。

    • 要在实例外部调用操作,请编写一条 EventBridge 规则,并在事件模式与规则匹配时自动执行什么操作。

    • 要在实例内部调用操作,请将实例配置为运行关闭脚本并通过实例元数据检索生命周期状态。

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

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

容量再平衡行为

通过容量再平衡,当实例收到再平衡建议时,Amazon A EC2 uto Scaling 的行为方式如下:

  • 当新的竞价型实例启动时,Amazon A EC2 uto Scaling 会等到新实例通过运行状况检查后才会终止先前的实例。替换多个实例时,每个旧实例的终止将在新实例启动并通过其运行状况检查后开始。

  • 由于 Amazon A EC2 uto Scaling 会在终止之前尝试启动新实例,因此达到或接近指定的最大容量可能会阻碍或完全停止再平衡活动。为避免此问题,Amazon A EC2 uto Scaling 可以暂时超出组的最大容量,最多可超过所需容量的 10%。

  • 如果您没有向 Auto Scaling 组添加生命周期挂钩,则在新实例通过运行状况检查后,Amazon A EC2 uto Scaling 会立即终止之前的实例。

  • 如果您添加了生命周期挂钩,这将延长我们开始按您为生命周期挂钩指定的超时值终止之前的实例所花费的时间。

  • 如果使用扩缩策略或计划缩,那么扩缩活动将并行运行。如果扩展活动正在进行中,并且您的 Auto Scaling 组低于其新的所需容量,则 Amazon A EC2 uto Scaling 会先进行扩展,然后再终止以前的实例。

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

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

注意事项

使用容量再平衡时,请考虑以下因素:

将您的应用程序设计为可以容忍 Spot 中断

您的应用程序应该能够处理实例数量的动态变化以及竞价型实例提前中断的可能性。例如,如果您的 Auto Scaling 组位于 Elastic Load Balancing 负载均衡器之后,Amazon A EC2 uto Scaling 会等待实例从负载均衡器注销,然后再调用您的生命周期挂钩。如果注销实例和完成生命周期操作的时间过长,则实例可能会中断,而 Amazon A EC2 uto Scaling 会等待您的生命周期操作完成后再终止实例。

在两分钟竞价型实例中断 EC2 通知之前,Amazon 并不总是可能发送再平衡建议信号。有时候,再平衡建议信号可能会在两分钟的中断通知到达的同时一起到达。发生这种情况时,Amazon A EC2 uto Scaling 会调用生命周期挂钩并尝试立即启动新的竞价型实例。

避免替换竞价型实例中断的风险升高

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

只有在可用性相同或更好的情况下,Amazon A EC2 uto Scaling 才会启动新实例

容量再平衡的目标之一是提高竞价型实例的可用性。如果现有竞价型实例收到再平衡建议,则只有在新实例提供与现有实例相同或更好的可用性时,Amazon A EC2 uto Scaling 才会启动新实例。如果新实例的中断风险比现有实例更严重,那么 Amazon A EC2 uto Scaling 将不会启动新实例。但是,Amazon A EC2 uto Scaling 将继续根据亚马逊竞价服务提供的信息评估 EC2 竞价容量池,并在可用性提高时启动新实例。

如果没有 Amazon A EC2 uto Scaling 主动启动新实例,您的现有实例可能会被中断。发生这种情况时,Amazon A EC2 uto Scaling 会在收到竞价型实例中断通知后立即尝试启动新实例。无论新实例中断的风险是否很高,都会发生这种情况。

容量再平衡不会提高您的竞价型实例中断率

当您启用容量再平衡时,它不会增加您的竞价型实例中断率(Amazon EC2 需要恢复容量时回收的竞价型实例数量)。但是,如果容量再平衡检测到实例存在中断风险,Amazon A EC2 uto Scaling 将立即尝试启动新实例。因此,与您在风险实例中断后等待 Amazon A EC2 uto Scaling 启动新实例相比,替换的实例可能更多。

虽然您可能会在启用容量重新平衡的情况下替换更多的实例,但您会因为处于主动而非被动地位而受益。这使您在实例中断之前有更多时间采取行动。使用 Spot Instance interruption notice(竞价型实例中断通知),您通常最多只有两分钟的时间来正常关闭您的实例。借助容量再平衡提前启动新实例,可以让现有流程更有可能在有风险的实例上完成。您还可以启动实例关闭过程,防止在有风险的实例上安排新作业,并使新启动的实例做好接管应用程序的准备。借助容量再平衡的主动替换,您可以因绝佳的连续性而受益。

以下理论示例演示了使用容量再平衡的风险和优势:

  • 下午 2:00 — 收到了重新平衡建议,例如 A。Amazon A EC2 uto Scaling 会立即尝试启动替换实例 B,这样您就可以有时间开始关闭程序。

  • 下午 2:30 - 收到针对实例 B 的再平衡建议,该实例将被替换为实例 C,让您有时间启动关闭程序。

  • 下午 2:32 - 如果未启用容量再平衡,并且实例 A 在下午 2:32 收到竞价型实例中断通知,则您只有两分钟的时间采取行动。但是,实例 A 将一直运行到此时。