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

基于 Amazon SQS 进行扩展

本部分向您介绍如何根据 Amazon Simple Queue Service (Amazon SQS) 队列的需求变化来扩展 Auto Scaling 组。Amazon SQS 提供了安全、持久且可用的托管队列,可让您集成和分离分布式软件系统和组件。如果您不熟悉 Amazon SQS,请参阅 Amazon Simple Queue Service 开发人员指南 以了解更多信息。

在多种情况下,您可能会考虑根据 Amazon SQS 队列中的活动扩展。假设您有 Web 应用程序,让用户上传图像并联机使用。每个图像需要先调整大小并编码,然后才能发布。该应用程序在 Auto Scaling 组中的 EC2 实例上运行,已配置为处理您的典型上传速率。不正常的实例将终止并进行替换,以始终保持当前的实例等级。该应用程序将图像的原始位图数据放在 Amazon SQS 队列中进行处理,然后发布处理后的图像供用户查看。

如果上传的图像数不随时间波动,此架构可以良好运作。如果上载水平发生变化,会发生什么情况? 如果上载按照可预见的计划增长和降低,您可以指定执行扩展活动的时间和日期。有关更多信息,请参阅 适用于 Amazon EC2 Auto Scaling 的计划扩展。按策略扩展是一种更为动态的 Auto Scaling 组扩展方法,可让您定义参数以控制扩展过程。例如,您可以创建策略,用于在平均上传数达到特定水平时扩大 EC2 实例的队组。在根据条件变化进行扩展,但却不知道条件何时改变时,可以使用这种方法。

此配置有三个主要部分:

  • 一个 Auto Scaling 组,用于管理处理来自 SQS 队列的消息的 EC2 实例。

  • 一个发送到 Amazon CloudWatch 的自定义指标,用于衡量 Auto Scaling 组中每个 EC2 实例的队列的消息数。

  • 一个目标跟踪策略,配置您的 Auto Scaling 组根据自定义指标和设定的目标值进行扩展。CloudWatch 警报调用该扩展策略。

下图演示了此配置的架构。


                    使用队列架构图的 Amazon EC2 Auto Scaling

选择有效的指标和目标值

Amazon SQS 队列中的消息数不仅仅定义所需的实例数。实际上,队组中的实例数由多种因素确定,包括处理消息所需的时间以及您应用程序可接受的延迟长度(队列延迟)。

该解决方案使用要维护的每个实例的积压 指标以及每个实例的可接受积压 的目标值。您可以按以下所示计算这些数字:

  • 每个实例的积压:要确定您每个实例的积压,首先通过 Amazon SQS 指标 ApproximateNumberOfMessages 确定 SQS 队列的长度(可从队列中检索的消息数)。将该数字除以队组的运行容量(对于 Auto Scaling 组,这是处于 InService 状态的实例数量),以获得每个实例的积压。

  • 每个实例的可接受积压:要确定您的目标值,请先计算您的应用程序可以接受的延迟。然后,将可接受的延迟值除以 EC2 实例处理一条消息所用的平均时间。

我们来举例说明,当前 ApproximateNumberOfMessages 为 1500,队组的运行容量为 10。如果每条消息的平均处理时间为 0.1 秒,最长可接受延迟为 10 秒,则每个实例可接受的积压为 10/0.1,即 100。这意味着您的目标跟踪策略的目标值为 100。由于当前每个实例的积压为 (1500/10),您的队组增加 5 个实例以维持与目标值的比例。

以下示例创建自定义指标和目标跟踪扩展策略,根据这些计算来配置您的 Auto Scaling 组进行扩展。

使用 AWS CLI 通过 Amazon SQS 进行扩展

以下部分向您说明如何使用 AWS CLI 为 SQS 队列设置自动扩展。前面的过程假设您已经有一个队列(标准队列或 FIFO 队列)、一个 Auto Scaling 组以及 EC2 实例(运行使用队列的应用程序)。

步骤 1:创建 CloudWatch 自定义指标

通过以下方式创建自定义计算指标:从您的 AWS 账户读取指标,计算之前部分中推荐的每实例积压指标,然后将此数字按 1 分钟的粒度发送到 CloudWatch。

只要可能,您应按照具有 1 分钟频率的指标扩展(也称为详细监控),因为这可以确保更快地响应使用率变化。如果将随指标扩展的频率设置为 5 分钟,可能会导致响应时间变慢,并且可能导致系统依据陈旧的指标数据进行扩展。默认情况下,Auto Scaling 实例是针对基本监控启用的,也就是说,实例的指标数据以 5 分钟的间隔提供。您可以启用详细监控,从而以 1 分钟的频率获取实例的指标数据。有关更多信息,请参阅使用 Amazon CloudWatch 监控 Auto Scaling 组和实例

创建 CloudWatch 自定义指标

  1. 使用 SQS get-queue-attributes 命令获取在队列中等待的消息数 (ApproximateNumberOfMessages):

    aws sqs get-queue-attributes --queue-url https://sqs.us-west-2.amazonaws.com/123456789/MyQueue --attribute-names ApproximateNumberOfMessages
  2. 使用 describe-auto-scaling-groups 命令获取组的运行容量,这是处于 InService 生命周期状态的实例数。此命令返回 Auto Scaling 组的实例及其生命周期状态。

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names MyAutoScalingGroup
  3. 通过将 ApproximateNumberOfMessages 指标除以队组的运行容量指标来计算每个实例的积压。

  4. 使用 AWS CLI 或 API,按照 1 分钟的粒度发布结果作为 CloudWatch 自定义指标。自定义指标是使用您选择的指标名称和命名空间定义的。自定义指标的命名空间不能以“AWS/”开头。有关发布自定义指标的更多信息,请参阅 Amazon CloudWatch 用户指南 中的发布自定义指标主题。

    以下是示例 CLI put-metric-data 命令:

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace --unit None --value 20

应用程序发出所需的指标之后,数据发送到 CloudWatch。这些指标在 CloudWatch 控制台中可见。您可以登录到 AWS 管理控制台并导航到 CloudWatch 页面来访问它们。您可以通过导航到指标页面或者使用搜索框搜索指标来查看指标。如需查看指标的帮助,请参阅 Amazon CloudWatch 用户指南 中的查看可用指标

步骤 2:创建扩展策略

接下来,创建当指定条件变化时告诉 Auto Scaling 组应该执行哪些操作的扩展策略。

创建扩展策略的步骤

  1. 使用以下命令可以在您的主目录的 config.json 文件中为扩展策略指定目标值。

    对于 TargetValue,计算每个实例指标的可接受积压值并在此处输入。要计算此数值,请考虑正常延迟值并将其除以处理一条消息所需的平均时间。

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Statistic":"Average", "Unit":"None" } }
  2. 使用 put-scaling-policy 命令以及在之前步骤中创建的 config.json 文件来创建扩展策略:

    aws autoscaling put-scaling-policy --policy-name MyScalingPolicy --auto-scaling-group-name MyAutoScalingGroup --policy-type TargetTrackingScaling --target-tracking-configuration file://~/config.json

    这会创建两个警报:一个用于增加实例数量,另一个用于减少实例数量。它还将返回注册到 CloudWatch 的策略的 Amazon 资源名称 (ARN),CloudWatch 使用该名称在突破指标时调用扩展。

步骤 3:测试扩展策略

您可以通过以下方式测试扩展策略:增加 SQS 队列中的消息数,然后验证 Auto Scaling 组是否已启动更多 EC2 实例。同样,您可以通过以下方式测试收缩策略:减少 SQS 队列中的消息数,然后验证 Auto Scaling 组是否终止了一个 EC2 实例。

测试扩展策略

  1. 按照教程:将消息发送到 Amazon SQS 队列中的步骤将消息添加到队列。请确保您增加了队列中的消息数量,使得每个实例指标的积压数超过目标值。

    您的更改触发 CloudWatch 警报可能需要几分钟时间。

  2. 使用 describe-auto-scaling-groups 命令验证该组是否已启动了实例:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name MyAutoScalingGroup

测试收缩策略

  1. 按照教程:将消息发送到 Amazon SQS 队列中的步骤从队列中删除消息。请确保您减少了队列中的消息数量,使得每个实例指标的积压数低于目标值。

    您的更改触发 CloudWatch 警报可能需要几分钟时间。

  2. 使用 describe-auto-scaling-groups 命令验证该组是否已终止了实例:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name MyAutoScalingGroup

有关目标跟踪的更深入消息,请参阅适用于 Amazon EC2 Auto Scaling 的目标跟踪扩展策略