使用容量重新平衡来处理 Amazon EC2 竞价型实例中断 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用容量重新平衡来处理 Amazon EC2 竞价型实例中断

您可以配置 Amazon EC2 Auto Scaling,以监控和自动响应影响竞价型实例可用性的更改。容量再平衡功能可在运行中的实例被 Amazon EC2 中断之前,主动使用新竞价型实例扩展您的队列,从而帮助您维护工作负载的可用性。

工作原理

容量再平衡的目标是确保不间断地处理工作负载。如果竞价型实例处于较高的中断风险,Amazon EC2 Spot 服务将通过 EC2 实例再平衡建议通知 Amazon EC2 Auto Scaling。

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

您还可以选择使用生命周期钩子在终止之前对实例执行自定义操作。

有关 EC2 实例再平衡建议的更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的 EC2 实例再平衡建议

有关容量再平衡功能的详细信息和演练,请参阅 Amazon 计算博客上的博客文章使用用于 EC2 Auto Scaling 的新容量再平衡功能主动管理竞价型实例生命周期

注意

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

注意事项

容量再平衡时需考虑以下事项:

  • 我们建议您将 Auto Scaling 组配置为使用多个实例类型。这样可灵活在每个可用区内的各种竞价型实例池中启动实例,如 Auto Scaling 组具有多个实例类型和购买选项 中记录。

  • 如果可能,您应在区域内的所有可用区中创建 Auto Scaling 组。这样,Amazon EC2 Auto Scaling 可以检查每个可用区中的可用容量。如果在一个可用区中启动失败,Amazon EC2 Auto Scaling 会继续尝试跨指定可用区启动竞价型实例,直到成功为止。

  • 如果您使用 lowest-price 分配策略,替换竞价型实例可能会面临中断升高的风险。这是因为,即使替换竞价型实例可能在启动后不久中断,我们始终会在当时具有可用容量的价格最低池中启动实例。为避免中断风险升高,我们强烈建议不要使用 lowest-price 分配策略,而建议使用 price-capacity-optimizedcapacity-optimizedcapacity-optimized-prioritized 分配策略。这些策略旨在确保替换竞价型实例在最佳竞价型容量池中启动,因此在不久的将来不太可能发生中断。

  • 使用容量再平衡时,Amazon EC2 Auto Scaling 的行为方式如下:

    新的竞价型实例启动时,Amazon EC2 Auto Scaling 会等待新实例通过其运行状况检查,然后继续终止旧实例。替换多个实例时,每个旧实例的终止将在新实例启动并通过其运行状况检查后开始。因为 Amazon EC2 Auto Scaling 尝试在终止旧实例之前启动新实例,所以达到或接近指定的最大容量可能会阻碍或完全停止再平衡活动。为避免此问题,在再平衡活动期间,Amazon EC2 Auto Scaling 可以暂时超出某组的指定最大容量。

    • 如果新实例无法启动或启动但运行状况检查失败,Amazon EC2 Auto Scaling 将继续尝试重新启动它们。当它尝试启动新实例时,您的旧实例最终将被中断并强制终止。

    • 如果某个扩缩活动正在进行并且您的 Auto Scaling 组低于其新的所需容量,则 Amazon EC2 Auto Scaling 首先横向扩展,然后再终止旧实例。

  • 您可以在启用容量再平衡时为 Auto Scaling 组配置终止生命周期钩子,以确保您能够在 Amazon EC2 Auto Scaling 终止实例之前,尝试从容关闭收到再平衡通知的实例中的应用程序。如果您没有配置生命周期钩子,Amazon EC2 Auto Scaling 将在新实例通过运行状况检查后立即开始终止旧实例。

只有可用性相同或更好时,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 将在收到竞价型实例中断通知后立即尝试启动新实例,无论新实例中断的风险是否很高。

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

当您启用容量再平衡时,它不会提高您的竞价型实例中断率(在 Amazon EC2 需要收回容量时回收的竞价型实例的数量)。但是,如果容量再平衡检测到实例存在中断风险,Amazon EC2 Auto Scaling 将立即尝试启动新实例。结果是,与您在中断存在风险的实例后等待 Amazon EC2 Auto Scaling 启动新实例的情况相比,可以替换更多实例。

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

作为演示使用容量再平衡的风险和优点的理论示例,请考虑以下场景:

  • 下午 2:00 - 收到针对实例 A 的再平衡建议,Amazon EC2 Auto Scaling 立即开始尝试启动替换实例 B,让您有时间启动关闭程序。

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

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

启用容量再平衡

您可以随时启用或禁用容量再平衡。

启用容量再平衡(控制台)

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

为新的 Auto Scaling 组启用容量再平衡
  1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

  2. 选择 Create Auto Scaling group(创建 Auto Scaling 组)。

  3. 在第 1 步中,为 Auto Scaling 组输入一个名称,选择一个启动模板,然后选择 Next(下一步)以继续执行下一步骤。

  4. 对于 Step 2: Choose instance launch options(第 2 步:选择实例启动选项),在 Network(网络)下选择需要的选项。

  5. 对于 Instance type requirements(实例类型要求),选择设置以创建混合实例组,包括该组可以启动的实例类型、实例购买选项以及竞价型和按需型实例的分配策略。预设情况下,这些设置均未配置。要进行配置,必须选择 Override launch template(覆盖启动模板)。有关创建混合实例组的更多信息,请参阅 Auto Scaling 组具有多个实例类型和购买选项

  6. Allocation strategies(分配策略)部分的页面底部,选择一个竞价型实例分配策略。要启用或禁用容量再平衡,请选中或清除 Capacity rebalance(容量再平衡)复选框。仅当您在 Instance purchase options(实例购买选项)部分指定了 Auto Scaling 组要作为竞价型实例启动的百分比时,才会看到此选项。

  7. 创建 Auto Scaling 组。

为现有 Auto Scaling 组启用容量再平衡
  1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

  2. 选中您的 Auto Scaling 组旁边的复选框。

    这时将在 Auto Scaling groups(Auto Scaling 组)页面底部打开一个拆分窗格。

  3. Details(详细信息)选项卡上,依次选择 Allocation strategies(分配策略)、Edit(编辑)。

  4. Allocation strategies (分配策略) 中,执行以下操作:

    • 要启用容量再平衡,请选择容量再平衡复选框。

    • 要禁用容量再平衡,请清除容量再平衡复选框。

  5. 选择 Update(更新)。

启用容量再平衡(Amazon CLI)

以下示例显示如何使用 Amazon CLI 以启用和禁用容量再平衡。

使用 create-auto-scaling-groupupdate-auto-scaling-group 命令以及以下参数:

  • --capacity-rebalance / --no-capacity-rebalance — 指示是否启用容量再平衡的布尔值。

在您调用 create-auto-scaling-group 命令之前,您需要配置为与 Auto Scaling 组配合使用的启动模板的名称。有关更多信息,请参阅为 Auto Scaling 组创建启动模板

注意

以下过程显示如何使用 JSON 或 YAML 格式的配置文件。如果您使用 Amazon CLI 版本 1,必须指定 JSON 格式的配置文件。如果您使用 Amazon CLI 版本 2,可以指定 YAML 或 JSON 格式的配置文件。

创建和配置新的 Auto Scaling 组
  • 使用以下 create-auto-scaling-group 命令创建新的 Auto Scaling 组并启用容量再平衡,引用 JSON 文件作为 Auto Scaling 组的唯一参数。

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

    如果您还没有指定混合实例策略的 CLI 配置文件,请创建一个。

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

    { "CapacityRebalance": true }

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

    { "AutoScalingGroupName": "my-asg", "DesiredCapacity": 12, "MinSize": 12, "MaxSize": 15, "CapacityRebalance": true, "MixedInstancesPolicy": { "InstancesDistribution": { "OnDemandBaseCapacity": 0, "OnDemandPercentageAboveBaseCapacity": 25, "SpotAllocationStrategy": "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 组
  • 使用以下 create-auto-scaling-group 命令创建新的 Auto Scaling 组并启用容量再平衡,引用 YAML 文件作为 Auto Scaling 组的唯一参数。

    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: 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 命令启用容量再平衡。

    aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --capacity-rebalance
验证是否为 Auto Scaling 组启用容量再平衡
  • 使用以下 describe-auto-scaling-groups 命令验证是否启用了容量再平衡并查看详细信息。

    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 命令以禁用容量再平衡。

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

添加终止生命周期钩子

您还可以在启用容量重新平衡时配置终止生命周期钩子。借助生命周期钩子,您可以在实例终止之前在实例上执行自定义操作。

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

  • 将系统或应用程序日志上载到 Amazon Simple Storage Service (Amazon S3)

  • 用于正常关闭 Amazon SQS 工件

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

如果您还没有终止生命周期钩子,请使用以下步骤创建。

添加终止生命周期钩子
  1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

  2. 选中您的 Auto Scaling 组旁边的复选框。

    这时将在 Auto Scaling groups(Auto Scaling 组)页面底部打开一个拆分窗格。

  3. Instance management (实例管理) 选项卡的 Lifecycle hooks (生命周期挂钩) 中,选择 Create lifecycle hook (创建生命周期挂钩)

  4. 要定义生命周期挂钩,请执行以下操作:

    1. 对于 Lifecycle hook name (生命周期挂钩名称),请指定生命周期挂钩的名称。

    2. 对于生命周期转换,请选择实例终止

    3. 对于检测信号超时中,指定完成生命周期操作所需的时间量(以秒为单位),或直到超时期结束。我们建议您使用 30 秒到 120 秒的值,具体取决于关闭应用程序需要的时间。

    4. 对于 Default result(默认结果),请指定超时结束或发生意外故障时 Auto Scaling 组执行的操作。ABANDON(放弃)和 CONTINUE(继续)都允许终止实例。

      • 如果您选择 CONTINUE(继续),Auto Scaling 组可以在终止之前继续执行任何剩余操作(如其他生命周期钩子)。

      • 如果选择 ABANDON(放弃),Auto Scaling 组将立即终止实例。

    5. (可选)对于 Notification metadata(通知元数据),请指定您希望 Amazon EC2 Auto Scaling 每次在向您在第 6 步中配置的 Amazon Lambda 函数或其他通知目标发送消息时包含的其他信息。

  5. 选择 Create(创建)。

  6. (可选)要在实例终止之前使用 Lambda 之类的服务执行自定义操作,请参阅教程:配置调用 Lambda 函数的生命周期钩子。本教程将帮助您了解如何为生命周期钩子设置 Lambda 函数。否则,要使 EC2 实例自动运行操作,您必须将其配置为运行关机脚本。我们建议您编写一个可在一到两分钟内完成的关闭顺序脚本,以确保在实例终止之前有足够的时间完成任务。

要了解更多信息以帮助您了解有关生命周期钩子用法的不同方面,请参阅Amazon EC2 Auto Scaling 生命周期钩子

限制

  • Amazon EC2 Auto Scaling 只有在接收再平衡通知的实例未受横向缩减保护的情况下才能终止该实例。

  • 您的应用程序应该能够处理竞价型实例提前中断的可能性。例如,当实例开始终止时,Amazon EC2 Auto Scaling 将等待实例终止。如果 Auto Scaling 组位于 Elastic Load Balancing 负载均衡器后面,则 Amazon EC2 Auto Scaling 会等待实例从负载均衡器中取消注册,然后再调用终止生命周期钩子(如果已配置)。如果注销实例和完成生命周期操作花费的时间过长,则实例可能会在 Amazon EC2 Auto Scaling 等待实例终止期间中断。

    Amazon EC2 也并不总能在两分钟的竞价型实例中断通知之前发送再平衡建议信号。在某些情况下,再平衡建议信号可能会随两分钟的中断通知一起到达。

    如果实例收到最后两分钟的中断通知,Amazon EC2 Auto Scaling 会调用终止生命周期钩子并尝试立即启动替换。

  • 所有提供 Amazon EC2 Auto Scaling 的商业 Amazon Web Services 区域 均支持容量再平衡,但不包括中东(阿联酋)区域。