使用自定义指标进行高级预测性扩展策略配置 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用自定义指标进行高级预测性扩展策略配置

在预测性扩展策略中,您可以使用预定义指标或自定义指标。您指定的自定义指标可以包括 CloudWatch 中可用的其他指标以及您发布到 CloudWatch 的新指标。当预定义指标(CPU、网络 I/O 和 Application Load Balancer 请求计数)未充分描述应用程序负载时,自定义指标非常有用。

指标数学表达式还可用于聚合从 CloudWatch 接收的指标数据,然后再将其用于预测性扩展。例如,通过计算新的总和或平均值来组合数据中的值时,该操作称为执行聚合。生成的数据称为聚合

在 Amazon EC2 Auto Scaling 控制台的图表屏幕上,您可以查看带有指标数据的 Load(负载)和 Capacity(容量)图表,其方式与指定预定义指标时相同。但是,您目前无法使用 Amazon EC2 Auto Scaling 控制台创建或更新指定自定义指标的预测性扩展策略。为此,您必须使用 Amazon CLI 或 Amazon SDK。

最佳实践

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

  • 对于负载指标规范,最有用的指标是作为一个整体表示 Auto Scaling 组负载的指标,而不管该组的容量如何。

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

  • 扩展指标必须与容量成反比。也就是说,如果 Auto Scaling 组中的实例数量增加,则扩展指标应该减少大致相同的比例。为确保预测性扩展按预期采取行动,负载指标和扩展指标还必须彼此之间密切关联。

  • 目标利用率必须与扩展指标的类型匹配。对于使用 CPU 利用率的策略配置,这是目标百分比。对于使用吞吐量(例如请求数或消息数)的策略配置,这是在任何一分钟间隔内每个实例的目标请求数或目标消息数。

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

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

先决条件

要在策略中指定自定义指标,您必须具备 cloudwatch:GetMetricData 权限。

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

注意

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

包含自定义扩展指标和自定义负载指标的预测性扩展策略示例

以下示例策略显示了一个完整的策略配置,该配置指定了的自定义扩展指标、自定义负载指标和 50 的目标利用率。将此配置保存在名为 config.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" } } ] } } ] }

有关 Amazon EC2 Auto Scaling 参数和指标数据查询的值的信息,请参阅 Amazon EC2 Auto Scaling API 参考中的 MetricDataQuery

注意

以下是一些可以提供帮助的额外资源:

  • 有关 Amazon 服务可用指标的更多信息,请参阅 Amazon CloudWatch 用户指南中的发布 CloudWatch 指标的 Amazon 服务

  • 要获取带有 Amazon CLI 的 CloudWatch 指标的确切指标名称、命名空间和维度(如果适用),请参阅列出指标.

要创建此策略,请运行指定配置文件的 put-scaling-policy 命令,如下例所示。

aws autoscaling put-scaling-policy --policy-name my-predictive-scaling-policy \ --auto-scaling-group-name my-asg --policy-type PredictiveScaling \ --predictive-scaling-configuration file://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": [] }

使用指标数学表达式

在创建使用量度数学表达式的预测性扩展策略时,以下 Amazon CLI 示例可能与您的场景相关。您可以使用这些预测性扩展策略配置示例作为起点,然后根据自己的需求自定义它们。

了解指标数学

如果您想要做的只是聚合现有指标数据,那么 CloudWatch 指标数学可以节省向 CloudWatch 发布另一个指标的精力和成本。您可以使用 Amazon 提供的任何指标,还可以使用定义为应用程序一部分的指标。例如,您可能想要计算每个实例的 Amazon SQS 队列积压。您可以从队列中获取用于检索的可用消息的大约数量,然后将该数量除以 Auto Scaling 组的运行容量来实现这一点。

有关更多信息,请参阅 Amazon CloudWatch User Guide (Amazon CloudWatch 用户指南) 中的 Using metric math (使用指标数学)。

如果您选择在预测性扩展策略中使用指标数学表达式,请考虑以下几点:

  • 指标数学运算使用指标名称、命名空间和维度键/值对指标的唯一组合的数据点。

  • 您可以使用任意算术运算符 (+ - * / ^)、统计函数(例如 AVG 或 SUM)或 CloudWatch 支持的其他函数。

  • 您可以在数学表达式的公式中同时使用指标和其他数学表达式的结果。

  • 指标数学表达式可以由不同的聚合组成。但是,得到最终聚合结果的最佳实践是针对扩展指标使用 Average 以及针对负载指标使用 Sum

  • 指标规范中使用的任何表达式最终都必须返回一个单个时间序列。

要使用指标数学,请执行以下操作:

  • 选择一个或多个 CloudWatch 指标。然后,创建表达式。有关更多信息,请参阅 Amazon CloudWatch User Guide (Amazon CloudWatch 用户指南) 中的 Using metric math (使用指标数学)。

  • 使用 CloudWatch 控制台或 CloudWatch GetMetricData API 验证指标数学表达式是否有效。

使用指标数学结合指标的预测性扩展策略示例

有时,您可能需要首先以某种方式处理其数据,而不是直接指定指标。例如,您可能有一个从 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": [] }

在蓝/绿部署方案中使用的预测扩展策略示例

搜索表达式提供了一个高级选项,您可以在其中查询多个 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 个指标的数据点。

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