Amazon EC2 Auto Scaling 的目标跟踪扩缩策略 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon EC2 Auto Scaling 的目标跟踪扩缩策略

要创建目标跟踪扩缩策略,您需要指定一个 Amazon CloudWatch 指标和一个目标值,目标值用来表示应用程序的理想平均利用率或吞吐量水平。然后 Amazon EC2 Auto Scaling 可以横向扩展该组(增加实例)以处理高峰流量,并在利用率或吞吐量较低时横向缩减该组(减少运行的实例数量)以降低成本。

例如,假设您当前有一个在两个实例上运行的 Web 应用程序,并希望在应用程序负载变化时将自动扩缩组的 CPU 利用率保持在 50% 左右。这为您提供额外容量以处理流量高峰,而无需维护过多的空闲资源。

创建一个将目标平均 CPU 利用率设置为 50% 的目标跟踪扩缩策略即可满足此需求。然后,您的自动扩缩组会根据需要增减实例数量,以确保实际指标值等于或接近 50%。

多个目标跟踪扩缩策略

为帮助优化扩缩性能,您可以将多个目标跟踪扩缩策略组合使用,但前提是其中的每个策略都各自使用不同的指标。例如,利用率和吞吐量可能会相互影响。每当其中一个指标发生变化时,通常意味着其他指标也将受到影响。因此,使用多个指标可以提供有关自动扩缩组所承担负载的额外信息,并改进有关需要向组中增加的容量的决策。

Amazon EC2 Auto Scaling 的目的是始终优先考虑可用性,因此其行为会有所不同,具体取决于目标跟踪策略是否已准备好扩展或缩减。如果任何目标跟踪策略已准备好进行扩展,它将扩展 Auto Scaling 组,但仅在所有目标跟踪策略(启用了缩减部分)准备好缩减时才执行缩减。

注意事项

使用目标跟踪扩缩策略时,需要注意以下事项:

  • 请勿创建、编辑或删除与目标跟踪扩缩策略一起使用的 CloudWatch 警报。Amazon EC2 Auto Scaling 会创建并管理与您的目标跟踪扩缩策略关联的 CloudWatch 警报,并在不需要时将其删除。

  • 在流量波动时,目标跟踪扩缩策略会优先考虑可用性,在流量减少时以更缓步的方式横向缩减。如果您希望自动扩缩组在工作负载完成后立即横向缩减,则可以禁用策略的横向缩减部分。这使您能够灵活地使用最适合您需求的横向缩减方法。为确保尽快进行横向缩减,我们建议不要使用简单扩缩策略以防止增加冷却时间。

  • 如果指标缺少数据点,则会导致 CloudWatch 警报状态变为 INSUFFICIENT_DATA。发生这种情况时,在找到新的数据点之前,Amazon EC2 Auto Scaling 无法扩展您的组。

  • 您可能会看到目标值与实际指标数据点之间存在差距。这是因为我们在确定需要添加或删除多少个实例时通过向上或向下取整来保守地进行操作,以免添加的实例数量不足或删除的实例数量过多。但是,对于实例较少的 Auto Scaling 组,组的使用率可能偏离目标值较远。例如,假设您将 CPU 使用率的目标值设置为 50%,然后 Auto Scaling 组超过了该目标。我们可以确定,添加 1.5 个实例会将 CPU 使用率降低到接近 50%。由于不可能添加 1.5 个实例,我们将该值向上取整,添加两个实例。这可能会将 CPU 使用率降至 50% 以下,但可确保应用程序具有充足的支持资源。同样,如果我们确定删除 1.5 个实例可使 CPU 使用率提高到 50% 以上,我们将只删除一个实例。

  • 对于包含更多实例的更大 Auto Scaling 组,使用率分布在更多实例上,在这种情况下,添加或删除实例会导致目标值与实际指标数据点之间的差距缩小。

  • 目标跟踪扩缩策略假设它应该在指定指标高于目标值时扩展 Auto Scaling 组。在指定指标低于目标值时,不能使用目标跟踪扩缩策略来横向扩展自动扩缩组。

选择指标

在目标跟踪扩展策略中,您可以使用预定义指标或自定义指标。

可供使用的预定义指标如下:

  • ASGAverageCPUUtilization—Auto Scaling 组的平均 CPU 利用率。

  • ASGAverageNetworkIn – 单个实例在所有网络接口上收到的平均字节数。

  • ASGAverageNetworkOut – 单个实例在所有网络接口上发送的平均字节数。

  • ALBRequestCountPerTarget – 每目标的应用程序负载均衡器请求计数。

重要

对于 CPU 利用率、网络 I/O 和每目标的应用程序负载均衡器请求计数等指标,有关其他的重要信息,请分别参见《适用于 Linux 实例的 Amazon EC2 用户指南》中的列出实例的可用 CloudWatch 指标主题和《适用于应用程序负载均衡器的用户指南》中的应用程序负载均衡器的 CloudWatch 指标主题。

您可以选择其他可用的 CloudWatch 指标,也可以在 CloudWatch 中指定自定义指标来选择您自己的指标。您必须使用 Amazon CLI 或开发工具包,创建包含自定义指标的目标跟踪策略。

选择指标时请记住原则:

  • 并非所有指标都适用于目标跟踪。当指定自定义指标时,这可能很重要。指标必须是有效的使用率指标,它用于描述实例的繁忙程度。指标值必须随着 Auto Scaling 组中的实例数按比例增加或减少。这样,指标数据可用于随实例数量按比例扩展或缩减。例如,如果某个 Auto Scaling 组的负载分布在各个实例上,则该 Auto Scaling 组的 CPU 使用率指标(即指标维度为 AutoScalingGroupName 的 Amazon EC2 指标 CPUUtilization)能够正常工作。

  • 以下指标不适用于目标跟踪:

    • Auto Scaling 组前面的负载均衡器收到的请求数(即,Elastic Load Balancing 指标 RequestCount)。负载均衡器收到的请求数不会根据 Auto Scaling 组的使用率而发生变化。

    • 负载均衡器请求延迟(即,Elastic Load Balancing 指标 Latency)。请求延迟可能会根据使用率增加而增加,但不一定按比例变化。

    • CloudWatch Amazon SQS 队列指标 ApproximateNumberOfMessagesVisible。队列中的消息数可能不会随着处理队列中的消息的 Auto Scaling 组的大小按比例发生变化。但是,用于测量消息数(自动扩缩组的每个 EC2 实例的队列中)的自定义指标能够正常工作。有关更多信息,请参阅根据 Amazon SQS 进行扩展

  • 要使用 ALBRequestCountPerTarget 指标,您必须指定 ResourceLabel 参数以标识与该指标关联的负载均衡器目标组。

  • 指标向 CloudWatch 发出实际 0 值时(例如,ALBRequestCountPerTarget),自动扩缩组可在应用程序没有流量时可以横向缩减至 0。要在没有请求路由时将自动扩缩组横向缩减至 0,组的最小容量必须设置为 0。

在扩缩策略中使用 EC2 实例指标时,我们建议您以 1 分钟的粒度配置这些指标,以确保更快地响应指标值的变化。如果以 5 分钟的粒度根据实例指标扩缩,可能会导致响应速度变慢,并根据过时的指标数据进行扩缩。

要获取此级别的 Amazon EC2 指标数据,您必须专门启用详细监控功能。默认情况下,EC2 实例针对基本监控启用,也就是说,实例的指标数据以 5 分钟一次的粒度提供。有关更多信息,请参阅配置 Auto Scaling 实例的监控

定义目标值

创建目标跟踪扩缩策略时,必须指定一个目标值。目标值表示自动扩缩组的最佳平均利用率或吞吐量。为了经济高效地使用资源,目标值的设置应尽可能高,并为流量的意外增加提供合的理缓冲。当应用程序针对正常流量进行最佳横向扩展时,实际指标值应等于或略低于目标值。

当扩缩策略基于吞吐量(例如,每目标的应用程序负载均衡器请求计数、网络 I/O 或其他计数指标)时,目标值表示单个实例在一分钟内的最佳平均吞吐量。

定义实例预热时间

重要

我们建议使用默认实例预热设置,该设置统一了自动扩缩组的所有预热和冷却设置。有关更多信息,请参阅可用的预热和冷却设置

您可以指定新启动实例的预热时间(单位为秒)。在指定的预热时间过期前,实例不会计入自动扩缩组的聚合 EC2 实例指标。

当实例处于预热时间时,仅当未预热实例的指标值大于策略的目标利用率时,您的扩缩策略才会横向扩展。

如果组再次横向扩展,则仍在预热的实例将计算为下一横向扩展活动所需容量的一部分。旨在持续 (但不过度) 扩大。

当横向扩展活动正在进行时,通过扩缩策略启动的所有横向缩减活动都将被阻止,直到实例完成预热。

创建目标跟踪扩缩策略(控制台)

您可以选择在创建 Auto Scaling 组时或在创建 Auto Scaling 组之后对其配置目标跟踪扩缩策略。

要创建具有目标跟踪扩缩策略的 Auto Scaling 组
  1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

  2. 选择 Create Auto Scaling group(创建 Auto Scaling 组)。

  3. 在步骤 1、2 和 3 中,根据需要选择选项,然后继续步骤 4:配置组大小和扩缩策略

  4. 组大小下方,通过更新最小容量和最大容量来指定扩缩范围。这两个设置允许您的 Auto Scaling 组动态扩缩。Amazon EC2 Auto Scaling 按最小容量和最大容量指定的值范围扩缩您的组。

  5. 扩缩策略下方,选择目标跟踪扩缩策略

  6. 要定义策略,请执行以下操作:

    1. 指定策略的名称。

    2. 对于 Metric type(指标类型), 选择一个指标。

      如果您选择了每个目标的 Application Load Balancer 请求计数,请在目标组中选择目标组。

    3. 为指标指定 Target value(目标值)。

    4. (可选)对于 Instances need(实例需要),请根据需要更新实例预热值。

    5. (可选)选择 Disable scale in to create only a scale-out policy(禁用缩减以创建仅扩展策略)。这样,可以根据需要创建独立的其他类型的缩减策略。

  7. 继续创建 Auto Scaling 组。您的扩展策略将在创建 Auto Scaling 组后创建。

为现有 Auto Scaling 组创建目标跟踪扩展策略
  1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

  2. 选中您的 Auto Scaling 组旁边的复选框。

    这时将在 Auto Scaling groups(Auto Scaling 组)页面底部打开一个拆分窗格。

  3. 验证是否正确设置了最小和最大容量。例如,如果组已经是最大大小,则指定一个新的最大值才能进行扩展。Amazon EC2 Auto Scaling 不会超出最小或最大容量范围。要更新组,请在 Details(详细信息)选项卡上,更改最小容量和最大容量的当前设置。

  4. Automatic scaling(自动扩展)选项卡的 Dynamic scaling policies(动态扩展策略)中,选择 Create dynamic scaling policy(创建动态扩展策略)。

  5. 要定义策略,请执行以下操作:

    1. 对于 Policy type(策略类型),保留默认的 Target tracking scaling(目标跟踪扩展)。

    2. 指定策略的名称。

    3. 对于 Metric type(指标类型), 选择一个指标。您只能选择一种指标类型。要使用多个指标,请创建多个策略。

      如果您选择了每个目标的 Application Load Balancer 请求计数,请在目标组中选择目标组。

    4. 为指标指定 Target value(目标值)。

    5. (可选)对于 Instances need(实例需要),请根据需要更新实例预热值。

    6. (可选)选择 Disable scale in to create only a scale-out policy(禁用缩减以创建仅扩展策略)。这样,可以根据需要创建独立的其他类型的缩减策略。

  6. 选择 Create(创建)。

创建目标跟踪扩展策略 (Amazon CLI)

按如下方式使用 Amazon CLI 为 Auto Scaling 组配置目标跟踪扩展策略。

第 1 步:创建 Auto Scaling 组

使用 create-auto-scaling-group 命令并利用启动模板 my-template 创建名为 my-asg 的自动扩缩组。如果您没有启动模板,请参阅 使用启动模板的 Amazon CLI 示例

aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \ --launch-template LaunchTemplateName=my-template,Version='2' \ --vpc-zone-identifier "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782" \ --max-size 5 --min-size 1

步骤 2:创建目标跟踪扩展策略

在您创建 Auto Scaling 组后,可以创建目标跟踪扩展策略,指示 Amazon EC2 Auto Scaling 在应用程序负载变化时动态地增加或减少组中正在运行的 EC2 实例数量。

示例:目标跟踪配置文件

以下是将 CPU 平均使用率保持在 40% 的示例目标跟踪配置。将此配置保存在名为 config.json 的文件中。

{ "TargetValue": 40.0, "PredefinedMetricSpecification": { "PredefinedMetricType": "ASGAverageCPUUtilization" } }

有关更多信息,请参阅 Amazon EC2 Auto Scaling API 参考中的 PredefinedMetricSpecification

或者,您可以通过创建自定义指标规范并为 CloudWatch 的每个参数添加值来使用自定义指标进行扩缩。以下是一个示例目标跟踪配置,它将指定指标的平均利用率保持在 40%。

{ "TargetValue":40.0, "CustomizedMetricSpecification":{ "MetricName":"MyUtilizationMetric", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"Percent" } }

有关更多信息,请参阅 Amazon EC2 Auto Scaling API 参考中的 CustomizedMetricSpecification

示例:cpu40-target-tracking-scaling-policy

使用 put-scaling-policy 命令及之前创建的 config.json 文件创建一个名为 cpu40-target-tracking-scaling-policy 的扩展策略,用于将 Auto Scaling 组的 CPU 平均使用率保持在 40%:

aws autoscaling put-scaling-policy --policy-name cpu40-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://config.json

如果成功,此命令将返回包含代表您创建的两个 CloudWatch 警报的 ARN 和名称。

{ "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:228f02c2-c665-4bfd-aaac-8b04080bea3c:autoScalingGroupName/my-asg:policyName/cpu40-target-tracking-scaling-policy", "Alarms": [ { "AlarmARN": "arn:aws:cloudwatch:region:account-id:alarm:TargetTracking-my-asg-AlarmHigh-fc0e4183-23ac-497e-9992-691c9980c38e", "AlarmName": "TargetTracking-my-asg-AlarmHigh-fc0e4183-23ac-497e-9992-691c9980c38e" }, { "AlarmARN": "arn:aws:cloudwatch:region:account-id:alarm:TargetTracking-my-asg-AlarmLow-61a39305-ed0c-47af-bd9e-471a352ee1a2", "AlarmName": "TargetTracking-my-asg-AlarmLow-61a39305-ed0c-47af-bd9e-471a352ee1a2" } ] }