配置基于 Amazon SQS 的缩放
以下步骤介绍如何配置基于 Amazon SQS 的自动扩缩。您将了解如何创建 CloudWatch 自定义指标,如何使用 Amazon CLI 设置目标跟踪策略,以及如何测试配置。
在开始之前,请确保您已经安装并配置 Amazon CLI。此外,您必须有一个要使用的 Amazon SQS 队列。以下任务假设您已经有一个队列(标准队列或 FIFO 队列)、一个自动扩缩组以及 EC2 实例(运行使用队列的应用程序)。
有关 Amazon SQS 权限的更多信息,请参阅 Amazon 简单队列服务开发人员指南。
步骤 1:创建 CloudWatch 自定义指标
自定义指标是使用您选择的指标名称和命名空间定义的。自定义指标的命名空间不能以 AWS/ 开头。有关发布自定义指标的更多信息,请参阅 Amazon CloudWatch 用户指南中的发布自定义指标主题。
按照此过程,通过首先从您的 Amazon 账户读取信息来创建自定义指标。然后,计算前面的章节中建议的每个实例的积压指标。最后,按照 1 分钟的粒度将该数字发布到 CloudWatch。只要可能,我们强烈建议您按 1 分钟粒度的指标进行扩展,以确保更快地响应系统负载变化。
要创建 CloudWatch 自定义指标(Amazon CLI)
-
使用 SQS get-queue-attributes
命令获取在队列中等待的消息数 ( ApproximateNumberOfMessages)。aws sqs get-queue-attributes --queue-urlhttps://sqs.region.amazonaws.com/123456789/MyQueue\ --attribute-names ApproximateNumberOfMessages -
使用 describe-auto-scaling-groups
命令获取组的运行容量,这是处于 InService生命周期状态的实例数。此命令返回 Auto Scaling 组的实例及其生命周期状态。aws autoscaling describe-auto-scaling-groups --auto-scaling-group-namesmy-asg -
将该队列中可供检索的大致消息数量除以该组的运行容量,计算得出每个实例的积压。
-
创建每分钟运行一次的脚本,以检索每个实例的积压,并将其发布到 CloudWatch 自定义指标。发布自定义指标时,需要指定该指标的名称、命名空间、单位、值以及零个或多个维度。维度由维度名称和维度值组成。
若要发布自定义指标,请将
斜体的占位符值替换为首选指标名称、指标值、命名空间(只要不是以 “AWS” 开头即可)和维度(可选),然后运行以下 put-metric-data命令。 aws cloudwatch put-metric-data --metric-nameMyBacklogPerInstance--namespaceMyNamespace\ --unit None --value20--dimensionsMyOptionalMetricDimensionName=MyOptionalMetricDimensionValue
应用程序发出所需的指标之后,数据发送到 CloudWatch。该指标会显示在 CloudWatch 控制台中。您可以登录到 Amazon Web Services 管理控制台 并导航到 CloudWatch 页面来访问它。然后,通过导航到指标页面或者使用搜索框搜索指标来查看指标。有关查看指标的更多信息,请参阅 Amazon CloudWatch 用户指南 中的查看可用指标。
步骤 2:创建目标跟踪扩展策略
现在,您可以将创建的指标添加到目标跟踪扩缩策略中。
创建目标跟踪扩缩策略(Amazon CLI)
-
使用以下
cat命令可以在您的主目录的名为config.json的 JSON 文件中存储扩缩策略的目标值和自定义指标规范。将每个用户输入占位符替换为您自己的信息。对于TargetValue,计算每个实例的可接受积压指标并在此处输入。要计算此数值,请考虑正常延迟值并将其除以处理一条消息所需的平均时间(如前面的章节所述)。如果您没有为步骤 1 中创建的指标指定任何维度,请不要在自定义指标规范中包含任何维度。
$ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } } -
使用 put-scaling-policy
命令以及在之前步骤中创建的 config.json文件来创建扩展策略:aws autoscaling put-scaling-policy --policy-namesqs100-target-tracking-scaling-policy\ --auto-scaling-group-namemy-asg--policy-type TargetTrackingScaling \ --target-tracking-configurationfile://~/config.json这会创建两个警报:一个用于增加实例数量,另一个用于减少实例数量。它还将返回注册到 CloudWatch 的策略的 Amazon 资源名称(ARN),CloudWatch 使用该名称在超过指标阈值的任何时候调用扩缩。
步骤 3:测试扩展策略
在您完成设置后,验证您的扩展策略是否正常工作。您可以通过以下方式测试:增加 SQS 队列中的消息数,然后验证 Auto Scaling 组是否已启动更多 EC2 实例。您还可以通过以下方式测试:减少 SQS 队列中的消息数,然后验证 Auto Scaling 组是否终止了一个 EC2 实例。
测试扩展函数
-
按照创建 Amazon SQS 标准队列并发送消息或创建 Amazon SQS FIFO 队列并发送消息中的步骤,将消息添加到您的队列。请确保您增加了队列中的消息数量,使得每个实例的积压指标超过目标值。
您的更改调用警报可能需要几分钟时间。
-
使用 describe-auto-scaling-groups
命令验证该组是否已启动了实例: aws autoscaling describe-auto-scaling-groups --auto-scaling-group-namemy-asg
测试横向缩减功能
-
按照接收和删除消息(控制台)中的步骤,从队列中删除消息。请确保您减少了队列中的消息数量,使得每个实例的积压指标低于目标值。
您的更改调用警报可能需要几分钟时间。
-
使用 describe-auto-scaling-groups
命令验证该组是否已终止了实例: aws autoscaling describe-auto-scaling-groups --auto-scaling-group-namemy-asg