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

使用容量重新平衡来处理 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 组具有多个实例类型和购买选项 中记录。

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

  • 如果可能,您应在区域内的所有可用区中创建 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 Auto Scaling 将继续尝试重新启动它们。当它尝试启动新实例时,您的旧实例最终将被中断并强制终止。

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

  • 您可以在启用容量再平衡时为 Auto Scaling 组配置终止生命周期钩子,以确保您能够在 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 会调用终止生命周期钩子并尝试立即启动替换。

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

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

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

  1. 打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  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. 打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  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. 打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  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 生命周期钩子