Amazon EC2 Auto Scaling 的暖池 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon EC2 Auto Scaling 的暖池

暖池使您能够减少引导时间非常长的应用程序的延迟,例如,因为实例需要将大量数据写入磁盘。使用暖池,您不再需要过度配置 Auto Scaling 组来管理延迟以提高应用程序性能。有关更多信息,请参阅以下博客文章 利用 EC2 Auto Scaling 暖池更快地扩展您的应用程序

重要

在不需要的情况下创建暖池可能会导致不必要的成本。如果您的首次启动时间不会给您的应用程序带来明显的延迟问题,则您可能不需要使用暖池。

核心概念

在您开始之前,请熟悉以下核心概念:

暖池

暖池是预初始化的 EC2 实例的池,它位于 Auto Scaling 组旁边。无论何时您的应用程序需要向外扩展,Auto Scaling 组都可以在暖池上绘制,以满足其新的所需容量。它可帮助您确保实例准备好快速开启为应用程序提供流量,从而加快对横向扩展事件的响应。当实例离开暖池时,它们将计入该组的所需容量。这称为热启动

当实例处于预热池中时,仅当处于 InService 状态的实例的指标值大于扩缩策略的告警阈值上限(与目标跟踪扩缩策略的目标利用率相同)时,扩缩策略才会横向扩展。

暖池大小

默认情况下,暖池的大小以 Auto Scaling 组的最大容量与其所需容量之差来计算。例如,如果 Auto Scaling 组的所需容量为 6 且最大容量为 10,则当您首次设置暖池并且该池正在初始化时,暖池的大小将为 4。

要单独指定暖池的最大容量,请设置一个大于该组当前容量的最大预热容量值。如果您设置了最大预热容量值,则暖池的大小将以该组的最大预热容量与当前所需容量之差来计算。例如,如果您的 Auto Scaling 组的所需容量为 6,最大容量为 10,最大预热容量为 8,则当您首次设置暖池并且该池正在初始化时,该暖池的大小将为 2。

在使用较大的自动扩缩组来管理使用暖池的成本效益时,您可能仅需要使用最大预热容量选项。例如,与在暖池中持续预留 500 个实例以备未来使用的方案相比,拥有 1,000 个实例的自动扩缩组、最大容量为 1,500(用于为紧急流量峰值提供额外容量)和拥有 100 个实例的暖池方案可能有利于更好地实现目标。

暖池实例状态

您可以将暖池中的实例保持在以下三种状态之一:StoppedRunningHibernated。将实例保持在 Stopped 状态是一个有效的方法,以最大限度地降低成本。对于已停止的实例,您只需为您使用的卷和已附加到实例的弹性 IP 地址付费。

或者,您也可以将实例保持在 Hibernated 状态,以停止实例而不删除其内存内容 (RAM)。当某个实例处于休眠状态时,这表示操作系统会将 RAM 的内容保存到 Amazon EBS 根卷中。当再次开启此实例时,会将此根卷还原到其之前的状态,还将重新加载 RAM 内容。当实例处于休眠状态时,您只需为 EBS 卷(包括 RAM 内容的存储空间,以及已附加到实例的弹性 IP 地址)付费。

此外还可以将暖池中的实例保持在 Running 状态,但我们强烈建议不要这样操作,以避免产生不必要的费用。当实例停止或休眠时,您可以节省实例本身的成本。您仅在实例正在运行时为它们付费。

生命周期钩子

生命周期钩子允许您将实例置于等待状态,以便您可以对实例执行自定义操作。自定义操作将在实例启动时或其终止之前执行。

在暖池配置中,生命周期钩子还可以延迟实例停止或休眠以及延迟在横向扩展事件期间投入使用,直到它们完成初始化。如果您在没有生命周期钩子的情况下向 Auto Scaling 组添加暖池,则需要很长时间才能完成初始化的实例可能会停止或休眠,然后在准备就绪之前在横向扩展事件期间投入使用。

实例再使用策略

默认情况下,Amazon EC2 Auto Scaling 会在您的 Auto Scaling 组横向缩减时终止您的实例。然后,它会将新实例启动到暖池中,以替换已终止的实例。

而如果您希望将实例返回到暖池,则可以指定实例再使用策略。这使您可以再使用这些已配置为给应用程序提供流量的实例。为了确保您的暖池不会过度预置,当暖池中的实例大小根据其设置超出必要时,Amazon EC2 Auto Scaling 可以终止这些实例,以减小其大小。当终止暖池中的实例时,它会使用默认终止策略来选择首先终止哪些实例。

重要

如果您希望在横向缩减时休眠实例,并且 Auto Scaling 组中有现有实例,则它们必须满足实例休眠的要求。如果不这样做,当实例返回到暖池时,它们将回退到停止状态,而不是休眠状态。

注意

目前,您只能通过使用 Amazon CLI 或 SDK 来指定实例再使用策略。此功能在控制台中不可用。

先决条件

决定如何使用生命周期钩子来准备实例以供使用。可以通过两种方法对您的实例执行自定义操作。

  • 对于您希望在启动时对实例运行命令的简单场景,可以在为 Auto Scaling 组创建启动模板或启动配置时包含用户数据脚本。用户数据脚本只是在您的实例开启时由 cloud-init 运行的普通 shell 脚本或 cloud-init 指令。该脚本还可通过使用实例(该脚本运行所在的实例)的 ID 来控制您的实例何时转换到下一个状态。如果您尚未这样做,请更新脚本,从实例元数据中检索实例的实例 ID。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的检索实例元数据

    提示

    要在实例重新开启时运行用户数据脚本,用户数据必须采用 MIME 多段格式,并在用户数据的 #cloud-config 部分中指定以下内容:

    #cloud-config cloud_final_modules: - [scripts-user, always]
  • 对于需要服务(例如 Amazon Lambda 要在实例进入或离开暖池时执行某些操作)的高级场景,您可以为 Auto Scaling 组创建生命周期钩子,并将目标服务配置为根据生命周期通知执行自定义操作。有关更多信息,请参阅支持的通知目标

有关更多信息,请参阅我们的 GitHub 存储库中的生命周期钩子示例。

使实例为休眠做好准备

要使 Auto Scaling 实例为使用 Hibernated 池状态做好准备,请按照适用于 Linux 实例的 Amazon EC2 用户指南中的休眠先决条件主题中所述,创建正确设置的新启动模板或启动配置,以支持实例休眠。然后,将新启动模板或启动配置与 Auto Scaling 组关联起来,并开启实例刷新,以替换与之前的启动模板或启动配置关联的实例。有关更多信息,请参阅基于实例刷新替换 Auto Scaling 实例

创建暖池

按照以下说明使用控制台创建暖池。

在您开始之前,请确认您已为 Auto Scaling 组创建了生命周期钩子。

创建暖池(控制台)

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

  2. 选中现有组旁边的复选框。

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

  3. 选择实例管理选项卡。

  4. 暖池下,选择创建暖池

  5. 要配置暖池,请执行以下操作:

    1. 对于暖池实例状态,选择要在实例进入暖池时将其转换为哪个状态。默认为 Stopped

    2. 对于最小暖池大小,输入要在暖池中保留的最少实例数。

    3. 对于 Max prepared capacity(最大准备容量),您可以通过定义一组固定数量的实例来指定最大准备容量,或者保留原定设置选项以不定义最大准备容量。

      如果保留原定设置 Equal to the Auto Scaling group's maximum capacity(等于 Auto Scaling 组的最大容量),则暖池的大小将与 Auto Scaling 组的最大容量与所需容量之差一致。要通过调整组的最大容量来更轻松地管理暖池的大小,我们建议您使用原定设置选项。

      如果选择 Define a set number of instances(定义一组固定数量的实例)选项,请输入一个表示允许同时位于暖池和 Auto Scaling 组中的最大实例数的值。

  6. 选择 Create (创建)

更新暖池

要更改暖池的启动模板或启动配置,请将新启动模板或启动配置与 Auto Scaling 组关联起来。所有新实例都将使用新 AMI 和在启动模板或启动配置中指定的其他更新启动,但现有实例不受影响。

要强制启动使用新启动模板或启动配置的替换暖池实例,您可以终止暖池中的现有实例。Amazon EC2 Auto Scaling 立即开始启动新实例以替换您终止的实例。或者,您可以启动实例刷新以执行组的滚动更新。实例刷新首先将替换 InService 实例。然后,它将替换暖池中的实例。有关更多信息,请参阅基于实例刷新替换 Auto Scaling 实例

删除暖池

当您不再需要暖池时,您可以使用以下步骤将其删除。

要删除暖池(控制台)

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

  2. 选中现有组旁边的复选框。

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

  3. 选择实例管理选项卡。

  4. 对于 Warm pool(暖池),选择 Actions(操作)、Delete(删除)。

  5. 当系统提示进行确认时,选择 Delete(删除)

限制

  • 您不能将暖池添加到具有混合实例策略或启动 Spot 实例的 Auto Scaling 组。

  • 仅当 Amazon EC2 Auto Scaling 将 Amazon EBS 卷作为其根设备时,前者才可将实例置于 StoppedHibernated 状态。无法停止或休眠对根设备使用实例存储的实例。

  • 仅当满足适用于 Linux 实例的 Amazon EC2 用户指南内的休眠先决条件主题中列出的所有要求时,Amazon EC2 Auto Scaling 才可将实例置于 Hibernated 状态。

  • 如果您的暖池在发生向外扩展事件时耗尽,则实例将直接启动到 Auto Scaling 组(冷启动)。如果可用区容量不足,您也可能会遇到冷启动。

  • 如果您尝试将暖池与 Amazon Elastic Kubernetes Service (Amazon EKS) 托管节点组一起使用,则仍在初始化的实例可能会注册到您的 Amazon EKS 集群。因此,在准备停止或休眠时,集群可能会在实例上安排作业。

  • 同样,如果您尝试将暖池与 Amazon ECS 集群一起使用,则实例可能会在完成初始化之前注册到集群。要解决此问题,您必须配置启动模板或启动配置,使其包含用户数据中的特殊代理配置变量。有关更多信息,请参阅 《Amazon Elastic Container Service 开发人员指南》中的为自动扩缩组使用暖池

  • 对暖池的休眠支持已在所有提供 Amazon EC2 Auto Scaling 的所有商业 Amazon Web Services 区域开放,但中国(北京)、中国(宁夏)、和 Amazon GovCloud(美国东部和美国西部)区域除外。