基于 Amazon SQS 进行扩展
https://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/as-using-sqs-queue.html
此配置有三个主要部分:
-
一个 Auto Scaling 组,用于管理处理来自 SQS 队列的消息的 EC2 实例。
-
一个发送到 Amazon CloudWatch 的自定义指标,用于衡量 Auto Scaling 组中每个 EC2 实例的队列的消息数。
-
一个目标跟踪策略,配置您的 Auto Scaling 组根据自定义指标和设定的目标值进行扩展。CloudWatch 警报调用该扩展策略。
下图演示了此配置的架构。
![使用队列架构图的 Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/sqs-as-custom-metric-diagram.png)
配置 Amazon SQS 扩展
以下部分向您说明如何使用 AWS CLI 为 SQS 队列设置自动扩展。前面的过程假设您已经有一个队列(标准队列或 FIFO 队列)、一个 Auto Scaling 组以及 EC2 实例(运行使用队列的应用程序)。
步骤 1:创建 CloudWatch 自定义指标
首先,从您的 AWS 账户中读取指标以创建自定义计算指标。然后,计算前面的章节中建议的每个实例的积压指标。最后,按照 1 分钟的粒度将该数字发布到 CloudWatch。
只要可能,您应该按照 1 分钟的频率根据 EC2 实例指标进行扩展(也称为详细监控),因为这会确保更快地响应使用率变化。如果将随指标扩展的频率设置为 5 分钟,可能会导致响应速度变慢,并根据过期的指标数据进行扩展。默认情况下,为 EC2 实例启用基本监控,也就是说,实例的指标数据以 5 分钟为间隔提供。您可以启用详细监控,以按照 1 分钟的频率获取实例的指标数据。有关更多信息,请参阅 使用 Amazon CloudWatch 监控 Auto Scaling 组和实例。
创建 CloudWatch 自定义指标
-
使用 SQS get-queue-attributes 命令获取在队列中等待的消息数 (
ApproximateNumberOfMessages
):aws sqs get-queue-attributes --queue-url
https://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-names
my-asg
-
通过将
ApproximateNumberOfMessages
指标除以队列的运行容量指标来计算每个实例的积压。 -
使用 AWS CLI 或 API,按照 1 分钟的粒度将结果发布为 CloudWatch 自定义指标。自定义指标是使用您选择的指标名称和命名空间定义的。自定义指标的命名空间不能以“AWS/”开头。有关发布自定义指标的更多信息,请参阅 Amazon CloudWatch 用户指南 中的发布自定义指标主题。
以下是一个 CLI put-metric-data 命令的示例。
aws cloudwatch put-metric-data --metric-name
MyBacklogPerInstance
--namespaceMyNamespace
\ --unit None --value20
--dimensionsMyOptionalMetricDimensionName=MyOptionalMetricDimensionValue
应用程序发出所需的指标之后,数据发送到 CloudWatch。该指标会显示在 CloudWatch 控制台中。您可以登录到 AWS 管理控制台并导航到 CloudWatch 页面来访问它。然后,通过导航到指标页面或者使用搜索框搜索指标来查看指标。如需有关查看指标方面的帮助,请参阅 Amazon CloudWatch 用户指南 中的查看可用指标。
步骤 2:创建目标跟踪扩展策略
然后,创建目标跟踪扩展策略,指示 Auto Scaling 组在应用程序负载变化时动态地增加或减少组中正在运行的 EC2 实例。您可以使用目标跟踪扩展策略,因为扩展指标是与组容量成比例增加或减少的使用率指标。
创建目标跟踪扩展策略
-
使用以下命令可以在您的主目录的
config.json
文件中为扩展策略指定目标值。对于
TargetValue
,计算每个实例的可接受积压指标并在此处输入。要计算此数值,请考虑正常延迟值并将其除以处理一条消息所需的平均时间。$ 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-name
my-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 队列中的步骤将消息添加到队列。请确保您增加了队列中的消息数量,使得每个实例的积压指标超过目标值。
您的更改触发 CloudWatch 警报可能需要几分钟时间。
-
使用 describe-auto-scaling-groups 命令确认该组已启动一个实例:
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name
my-asg
测试缩减函数
-
按照教程:将消息发送到 Amazon SQS 队列中的步骤从队列中删除消息。请确保您减少了队列中的消息数量,使得每个实例的积压指标低于目标值。
您的更改触发 CloudWatch 警报可能需要几分钟时间。
-
使用 describe-auto-scaling-groups 命令确认该组已终止一个实例:
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name
my-asg