本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用自定义指标进行高级预测性扩展策略配置
在预测性扩展策略中,您可以使用预定义指标或自定义指标。当预定义指标(CPU、网络 I/O 和 Application Load Balancer 请求计数)未充分描述应用程序负载时,自定义指标非常有用。
使用自定义指标创建预测性扩缩策略时,您可以指定由Amazon提供的其他 CloudWatch 指标,也可以指定自己定义和发布的指标。您还可以使用指标数学来聚合现有的指标并将其转换为 Amazon 会不自动跟踪的新时间序列。例如,通过计算新的总和或平均值来组合数据中的值时,该操作称为执行聚合。生成的数据称为聚合。
以下部分包含了有关如何为构造策略的 JSON 结构的最佳实践和示例。
最佳实践
以下最佳实践可帮助您更有效地使用自定义指标:
-
对于负载指标规范,最有用的指标是作为一个整体表示 Auto Scaling 组负载的指标,而不管该组的容量如何。
-
对于扩展指标规范,要扩展的最有用指标是每个实例的平均吞吐量或利用率指标。
-
扩展指标必须与容量成反比。也就是说,如果 Auto Scaling 组中的实例数量增加,则扩展指标应该减少大致相同的比例。为确保预测性扩展按预期采取行动,负载指标和扩展指标还必须彼此之间密切关联。
-
目标利用率必须与扩展指标的类型匹配。对于使用 CPU 利用率的策略配置,这是目标百分比。对于使用吞吐量(例如请求数或消息数)的策略配置,这是在任何一分钟间隔内每个实例的目标请求数或目标消息数。
-
如果未遵循这些建议,那么时间序列的预测未来值可能会不正确。要验证数据是否正确,您可以在 Amazon EC2 Auto Scaling 控制台中查看预测值。或者,在创建预测性扩展策略之后,请检查 GetPredictiveScalingForecastAPI 返回的
LoadForecast
和CapacityForecast
对象。 -
我们强烈建议您在仅预测模式下配置预测式扩展,以便在预测式扩展开始主动扩展容量之前对预测进行评估。
先决条件
要将自定义指标添加到预测性扩缩策略,您必须具有 cloudwatch:GetMetricData
权限。
要指定自己的指标而不是Amazon提供的指标,您必须首先将您的指标发布到 CloudWatch。有关更多信息,请参阅亚马逊 CloudWatch 用户指南中的发布自定义指标。
如果发布自己的指标,请确保以至少五分钟的频率发布数据点。Amazon EC2 Auto Scaling CloudWatch 根据所需的时间长度从中检索数据点。例如,负载指标规范以每小时为指标来衡量应用程序的负载。 CloudWatch 使用您已发布的指标数据提供任意一小时期间的单个数据值,其方法是将所有数据点与每个一小时内的时间戳聚合起来。
构造自定义指标的 JSON
以下部分包含了有关如何配置预测行扩缩以从查询数据的示例 CloudWatch。配置此选项有两种不同的方法,您选择的方法会影响您为预测性扩缩策略构造 JSON 时使用的格式。使用指标数学时,JSON 格式会根据所执行的指标数学进一步变化。
-
要创建直接从提供的其他 CloudWatch 指标Amazon或您发布到的指标中获取数据的策略 CloudWatch,请参阅包含自定义负载和扩缩指标的预测性扩缩策略示例(Amazon CLI)。
-
要创建可以查询多个 CloudWatch 指标并使用数学表达式来创建基于这些指标的新时间序列的策略,请参阅使用指标数学表达式。
包含自定义负载和扩缩指标的预测性扩缩策略示例(Amazon CLI)
要通过 Amazon CLI 使用自定义负载和扩缩指标创建预测性扩缩策略,请将 --predictive-scaling-configuration
的参数存储在名为 config.json
的 JSON 文件中。
您可以将以下示例中的可替换值替换为您的指标和目标利用率值,从而开始添加自定义指标。
{ "MetricSpecifications": [ { "TargetValue":
50
, "CustomizedScalingMetricSpecification": { "MetricDataQueries": [ { "MetricStat": { "Metric": { "MetricName": "MyUtilizationMetric
", "Namespace": "MyNameSpace
", "Dimensions": [ { "Name": "MyOptionalMetricDimensionName
", "Value": "MyOptionalMetricDimensionValue
" } ] }, "Stat": "Average
" } } ] }, "CustomizedLoadMetricSpecification": { "MetricDataQueries": [ { "MetricStat": { "Metric": { "MetricName": "MyLoadMetric
", "Namespace": "MyNameSpace
", "Dimensions": [ { "Name": "MyOptionalMetricDimensionName
", "Value": "MyOptionalMetricDimensionValue
" } ] }, "Stat": "Sum
" } } ] } } ] }
有关更多信息,请参阅 MetricDataQueryAmazon EC2 Auto Scaling API 参考中的。
注意
以下是一些可以帮助您查找指标名称、命名空间、维度和统计数据的其他资源: CloudWatch
-
有关Amazon服务可用指标的信息,请参阅亚马逊 CloudWatch 用户指南中发布 CloudWatch 指标的Amazon服务。
-
要获取使用监控指标的确切指标名称、命名空间和维度(如果适用),请参阅 List-Amazon CLI metrics(指标)。 CloudWatch
要创建此策略,请使用 JSON 文件作为输入运行put-scaling-policy命令,如下例所示。
aws autoscaling put-scaling-policy --policy-name
my-predictive-scaling-policy
\ --auto-scaling-group-namemy-asg
--policy-type PredictiveScaling \ --predictive-scaling-configurationfile://config.json
如果成功,此命令将返回策略的 Amazon Resource Name (ARN)。
{
"PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-predictive-scaling-policy",
"Alarms": []
}
使用指标数学表达式
以下部分提供了预测性扩缩策略的信息和示例,这些示例演示了如何在策略中使用指标数学。
了解指标数学
如果您想要做的只是聚合现有指标数据,那么 CloudWatch 指标数学可以节省向发布另一个指标的精力和成本 CloudWatch。您可以使用 Amazon 提供的任何指标,还可以使用定义为应用程序一部分的指标。例如,您可能想要计算每个实例的 Amazon SQS 队列积压。您可以从队列中获取用于检索的可用消息的大约数量,然后将该数量除以 Auto Scaling 组的运行容量来实现这一点。
有关更多信息,请参阅《亚马逊 CloudWatch 用户指南》中的使用指标数学。
如果您选择在预测性扩展策略中使用指标数学表达式,请考虑以下几点:
-
指标数学运算使用指标名称、命名空间和维度键/值对指标的唯一组合的数据点。
-
您可以使用任意算术运算符 (+-*/^)、统计函数(例如 AVG 或 SUM)或其他 CloudWatch 支持的函数。
-
您可以在数学表达式的公式中同时使用指标和其他数学表达式的结果。
-
指标数学表达式可以由不同的聚合组成。但是,得到最终聚合结果的最佳实践是针对扩展指标使用
Average
以及针对负载指标使用Sum
。 -
指标规范中使用的任何表达式最终都必须返回一个单个时间序列。
要使用指标数学,请执行以下操作:
-
选择一个或多个 CloudWatch 指标。然后,创建表达式。有关更多信息,请参阅《亚马逊 CloudWatch 用户指南》中的使用指标数学。
-
使用 CloudWatch控制台或 CloudWatch GetMetricDataAPI 验证指标数学表达式是否有效。
使用指标数学组合指标的预测性扩缩策略示例(Amazon CLI)
有时,您可能需要首先以某种方式处理其数据,而不是直接指定指标。例如,您可能有一个从 Amazon SQS 队列中提取工作的应用程序,并且可能希望使用队列中的项目数作为预测性扩展的标准。队列中的消息数不仅仅定义您需要的实例数。因此,需要执行更多工作来创建可用于计算每个实例的积压的指标。有关更多信息,请参阅 根据 Amazon SQS 进行扩展。
以下示例是适用于此场景的预测扩展策略示例。它指定了基于 Amazon SQS ApproximateNumberOfMessagesVisible
指标的扩展和负载指标,即可从队列中获取的用于检索的消息数量。它还使用 Amazon EC2 Auto Scaling GroupInServiceInstances
指标和数学表达式,计算扩展指标的每个实例的积压。
aws autoscaling put-scaling-policy --policy-name my-sqs-custom-metrics-policy
\
--auto-scaling-group-name my-asg
--policy-type PredictiveScaling \
--predictive-scaling-configuration file://config.json
{
"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": []
}
在蓝/绿部署场景中使用的预测扩缩策略示例(Amazon CLI)
搜索表达式提供了一个高级选项,您可以在其中查询多个 Auto Scaling 组中的指标并对其执行数学表达式。此选项对于蓝/绿部署尤其有效。
注意
蓝/绿部署是一种部署方法,您可以在其中创建两个独立但相同的 Auto Scaling 组。只有其中一个组接收生产流量。用户流量最初定向到较早的Auto Scaling 组(“蓝色”),而新组(“绿色”)用于测试和评估应用程序或服务的新版本。测试并接受新部署后,用户流量将转移到“绿色”的 Auto Scaling 组。然后,您可以在部署成功后删除“蓝色”组。
作为蓝/绿部署的一部分创建新的 Auto Scaling 组时,每个组的指标历史记录可以自动包含在预测性扩展策略中,而无需更改其指标规范。有关更多信息,请参阅 Amazon 计算博客中的将 EC2 Auto Scaling 预测性扩展策略与蓝/绿部署结合使用
以下示例策略说明了如何执行此操作。在此示例中,策略使用 Amazon EC2 发出的 CPUUtilization
指标。它使用 Amazon EC2 Auto Scaling GroupInServiceInstances
指标和数学表达式,计算每个实例的扩展指标的值。它还指定了一个容量指标规范来获取 GroupInServiceInstances
指标。
根据指定的搜索条件,搜索表达式查找多个 Auto Scaling 组中实例的 CPUUtilization
。如果您稍后创建了匹配相同搜索条件的新 Auto Scaling 组,则自动包含新 Auto Scaling 组中实例的 CPUUtilization
。
aws autoscaling put-scaling-policy --policy-name my-blue-green-predictive-scaling-policy
\
--auto-scaling-group-name my-asg
--policy-type PredictiveScaling \
--predictive-scaling-configuration file://config.json
{
"MetricSpecifications": [
{
"TargetValue": 25
,
"CustomizedScalingMetricSpecification": {
"MetricDataQueries": [
{
"Id": "load_sum
",
"Expression": "SUM(SEARCH('{AWS/EC2,AutoScalingGroupName} MetricName=\"CPUUtilization\" ASG-myapp', 'Sum', 300))
",
"ReturnData": false
},
{
"Id": "capacity_sum
",
"Expression": "SUM(SEARCH('{AWS/AutoScaling,AutoScalingGroupName} MetricName=\"GroupInServiceInstances\" ASG-myapp', 'Average', 300))
",
"ReturnData": false
},
{
"Id": "weighted_average
",
"Expression": "load_sum / capacity_sum
",
"ReturnData": true
}
]
},
"CustomizedLoadMetricSpecification": {
"MetricDataQueries": [
{
"Id": "load_sum
",
"Expression": "SUM(SEARCH('{AWS/EC2,AutoScalingGroupName} MetricName=\"CPUUtilization\" ASG-myapp', 'Sum', 3600))
"
}
]
},
"CustomizedCapacityMetricSpecification": {
"MetricDataQueries": [
{
"Id": "capacity_sum
",
"Expression": "SUM(SEARCH('{AWS/AutoScaling,AutoScalingGroupName} MetricName=\"GroupInServiceInstances\" ASG-myapp', 'Average', 300))
"
}
]
}
}
]
}
该示例返回策略的 ARN。
{
"PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-blue-green-predictive-scaling-policy",
"Alarms": []
}
注意事项和问题排查
如果在使用自定义指标时出现问题,建议您执行以下操作:
-
如果提供了错误消息,请阅读该消息并解决其报告的问题(如果可能)。
-
如果在蓝/绿部署方案中尝试使用搜索表达式时出现问题,请首先确保您了解如何创建查找部分匹配而非完全匹配的搜索表达式。此外,请检查您的查询是否只查找运行特定应用程序的 Auto Scaling 组。有关搜索表达式语法的更多信息,请参阅《Amazon CloudWatch 用户指南》中的CloudWatch 搜索表达式语法。
-
如果您没有提前验证表达式,put-scaling-policy命令会在创建扩展策略时对其进行验证。但是,此命令有可能无法识别所检测错误的确切原因。要修复这些问题,请解决您在get-metric-data命令请求的回应中收到的错误。您还可以通过 CloudWatch 控制台对表达式进行问题排查。
-
查看控制台中的 Load (负载) 和 Capacity (容量) 图表时,Capacity (容量) 图表可能不显示任何数据。为确保图表具有完整的数据,请确保始终为 Auto Scaling 组启用组指标。有关更多信息,请参阅 启用 Auto Scaling 组指标(控制台)。
-
只有具备在其生命周期内于不同的 Auto Scaling 组中运行的应用程序时,容量指标规范才适用于蓝色/绿色部署。此自定义指标允许您提供多个 Auto Scaling 组的总容量。预测性扩展使用此功能在控制台中的 Capacity (容量) 图表内显示历史数据。
-
如果
MetricDataQueries
自行指定 SEARCH () 函数,而没有像 SUM () 这样的数学函数,则必须为ReturnData
指定false
。原因在于搜索表达式可能返回多个时间序列,而基于表达式的指标规范仅可以返回一个时间序列。 -
搜索表达式中涉及的所有指标均应该具有相同的分辨率。
限制
-
您可以在一个指标规范中查询最多 10 个指标的数据点。
-
为满足此限制,一个表达式算作一个指标。