面向 Amazon ECS 的使用自定义指标的高级预测式扩缩策略 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

面向 Amazon ECS 的使用自定义指标的高级预测式扩缩策略

在预测式扩缩策略中,您可以使用预定义指标或自定义指标。当预定义指标(例如 CPU、内存等)不足以充分描述应用程序负载时,自定义指标非常有用。

使用自定义指标创建预测式扩缩策略时,您可以指定由 Amazon 提供的其他 CloudWatch 指标。或者,您可以指定自己定义和发布的指标。您还可以使用指标数学来聚合现有的指标并将其转换为 Amazon 会不自动跟踪的新时间序列。例如,通过计算新的总和或平均值来组合数据中的值时,该操作称为执行聚合。生成的数据称为聚合

以下部分包含了有关如何为构造策略的 JSON 结构的最佳实践和示例。

先决条件

要将自定义指标添加到预测性扩缩策略,您必须具有 cloudwatch:GetMetricData 权限。

要指定自己的指标而不是 Amazon 提供的指标,您必须首先将您的指标发布到 CloudWatch。有关更多信息,请参阅 Amazon CloudWatch 用户指南中的发布自定义指标

如果发布自己的指标,请确保以至少五分钟的频率发布数据点。根据所需的时间长度从 CloudWatch 中检索数据点。例如,负载指标规范以每小时为指标来衡量应用程序的负载。CloudWatch 使用您已发布的指标数据在任意一小时期间提供单个数据值,其方法是将所有数据点与每个一小时内的时间戳聚合起来。

最佳实践

以下最佳实践可帮助您更有效地使用自定义指标:

  • 对于负载指标规范,最有用的指标是作为一个整体表示自动扩缩组负载的指标。

  • 对于扩缩指标规范,要扩展的最有用指标是每个任务指标的平均吞吐量或利用率。

  • 目标利用率必须与扩展指标的类型匹配。例如,对于使用 CPU 利用率的策略配置,这是目标百分比。

  • 如果未遵循这些建议,那么时间序列的预测未来值可能会不正确。要验证数据是否正确,您可以在控制台中查看预测值。或者,在创建预测式扩缩策略之后,请检查对 GetPredictiveScalingForecast API 的调用返回的 LoadForecast 对象。

  • 我们强烈建议您在仅预测模式下配置预测式扩缩,以便在预测式扩缩启动主动扩缩之前对预测进行评估。

限制

  • 您可以在一个指标规范中查询最多 10 个指标的数据点。

  • 为满足此限制,一个表达式算作一个指标。

排查使用自定义指标的预测式扩缩策略的问题

如果在使用自定义指标时出现问题,建议您执行以下操作:

  • 如果您在使用搜索表达式时在蓝绿部署中遇到问题,请确保您创建的搜索表达式是在寻找部分匹配项而不是完全匹配项。此外,请检查您的查询是否只查找在特定应用程序中运行的自动扩缩组。有关搜索表达式语法的更多信息,请参阅 Amazon CloudWatch 用户指南中的 CloudWatch 搜索表达式语法

  • put-scaling-policy 命令会在您创建扩缩策略时对表达式进行验证。但是,此命令有可能无法识别所检测错误的确切原因。要修复这些问题,请解决您在 get-metric-data 命令请求的回应中收到的错误。您还可以通过 CloudWatch 控制台对表达式进行问题排查。

  • 如果 MetricDataQueries 自行指定 SEARCH () 函数,而没有像 SUM () 这样的数学函数,则必须为 ReturnData 指定 false。原因在于搜索表达式可能返回多个时间序列,而基于表达式的指标规范仅可以返回一个时间序列。

  • 搜索表达式中涉及的所有指标均应该具有相同的分辨率。

使用指标数学组合指标的预测性扩缩策略示例(Amazon CLI)

有时,您可能需要首先以某种方式处理其数据,而不是直接指定指标。例如,您可能有一个从 Amazon SQS 队列中提取工作的应用程序,并且可能希望使用队列中的项目数作为预测性扩展的标准。队列中的消息数不仅仅定义您需要的实例数。因此,需要执行更多工作来创建可用于计算每个实例的积压的指标。

以下示例是适用于此场景的预测扩展策略示例。它指定了基于 Amazon SQS ApproximateNumberOfMessagesVisible 指标的扩展和负载指标,即可从队列中获取的用于检索的消息数量。它还使用 Amazon EC2 Auto Scaling GroupInServiceInstances 指标和数学表达式,计算扩展指标的每个实例的积压。

aws application-autoscaling put-scaling-policy --policy-name my-sqs-custom-metrics-policy \ --policy-type PredictiveScaling \ --predictive-scaling-configuration file://config.json --service-namespace ecs \ --resource-id service/MyCluster/test \ "MetricSpecifications": [ { "TargetValue": 100, "CustomizedScalingMetricSpecification": { "MetricDataQueries": [ { "Label": "Get the queue size (the number of messages waiting to be processed)", "Id": "queue_size", "MetricStat": { "Metric": { "MetricName": "ApproximateNumberOfMessagesVisible", "Namespace": "AWS/SQS", "Dimensions": [ { "Name": "QueueName", "Value": "my-queue" } ] }, "Stat": "Sum" }, "ReturnData": false }, { "Label": "Get the group size (the number of running instances)", "Id": "running_capacity", "MetricStat": { "Metric": { "MetricName": "GroupInServiceInstances", "Namespace": "AWS/AutoScaling", "Dimensions": [ { "Name": "AutoScalingGroupName", "Value": "my-asg" } ] }, "Stat": "Sum" }, "ReturnData": false }, { "Label": "Calculate the backlog per instance", "Id": "scaling_metric", "Expression": "queue_size / running_capacity", "ReturnData": true } ] }, "CustomizedLoadMetricSpecification": { "MetricDataQueries": [ { "Id": "load_metric", "MetricStat": { "Metric": { "MetricName": "ApproximateNumberOfMessagesVisible", "Namespace": "AWS/SQS", "Dimensions": [ { "Name": "QueueName", "Value": "my-queue" } ], }, "Stat": "Sum" }, "ReturnData": true } ] } } ] }

该示例返回策略的 ARN。

{ "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-sqs-custom-metrics-policy", "Alarms": [] }