面向 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": []
}