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

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

在使用目标跟踪扩缩策略时,您可以选择一个指标并设置一个目标值。Amazon EC2 Auto Scaling 创建和管理触发扩缩策略的 CloudWatch 警报,并根据指标和目标值计算扩缩调整。扩展策略根据需要增加或减少容量,将指标保持在指定的目标值或接近指定的目标值。除了将指标保持在目标值附近以外,目标跟踪扩展策略还会对由于负载模式变化而造成的指标变化进行调整。

例如,您可以使用目标跟踪扩展进行以下操作:

  • 配置目标跟踪扩缩策略,使 Auto Scaling 组的平均聚合 CPU 利用率保持在 40%。

  • 为 Auto Scaling 组配置目标跟踪扩缩策略,使 Application Load Balancer 目标组的每目标请求数保持在 1000。

根据应用程序的需求,您可能会发现这些常用扩展指标之一在使用目标跟踪时最适合您,或者可能会发现这些指标的组合或其他指标能够更好地满足您的需求。

注意事项

在为您的 Auto Scaling 组创建目标跟踪扩缩策略之前,您应该了解目标跟踪扩缩策略的以下特征和行为:

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

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

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

  • 为了确保应用程序可用性,Auto Scaling 组会针对指标尽快按比例扩展,但会逐渐缩减。

  • 您可以为 Auto Scaling 组提供多个目标跟踪扩缩策略,前提是它们各自使用不同的指标。Amazon EC2 Auto Scaling 的目的是始终优先考虑可用性,因此其行为会有所不同,具体取决于目标跟踪策略是否已准备好扩展或缩减。如果任何目标跟踪策略已准备好进行扩展,它将扩展 Auto Scaling 组,但仅在所有目标跟踪策略(启用了缩减部分)准备好缩减时才执行缩减。有关更多信息,请参阅 多个动态扩缩策略

  • 您可以禁用目标跟踪扩展策略的缩减部分。通过使用该功能,您可以灵活地使用不同的方法缩减 Auto Scaling 组。例如,您可以使用不同的策略类型进行缩减,同时使用目标跟踪扩缩策略进行扩展。

  • 请勿编辑或删除为目标跟踪扩缩策略配置的 CloudWatch 警报。与您的目标跟踪扩缩策略关联的 CloudWatch 警报由 Amazon 管理,不再需要时自动删除。

选择指标

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

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

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

  • ASGAverageNetworkIn—Auto Scaling 组在所有网络接口上收到的平均字节数。

  • ASGAverageNetworkOut—Auto Scaling 组在所有网络接口上发送的平均字节数。

  • ALBRequestCountPerTarget — Auto Scaling 组的每个目标的平均 Application Load Balancer 请求计数。

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

选择指标时请记住原则:

  • 并非所有 指标都适用于目标跟踪。当指定自定义指标时,这可能很重要。指标必须是有效的使用率指标,它用于描述实例的繁忙程度。指标值必须随着 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 组的大小按比例发生变化。但是,用于测量消息数(Auto Scaling 组的每个 EC2 实例的队列中)的自定义指标能够正常工作。有关更多信息,请参阅 根据 Amazon SQS 进行扩展

  • 当指定指标没有数据时,目标跟踪扩缩策略不会缩减 Auto Scaling 组,除非您使用 ALBRequestCountPerTarget 指标。其中的原理是 ALBRequestCountPerTarget 指标为不存在关联数据的时间段发出零,而且目标跟踪处理需要指标数据来解释低使用率趋势。要实现在不存在路由到 Application Load Balancer 目标组的请求时使您的 Auto Scaling 组缩减为 0 个实例,组的最小容量必须设置为 0。

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

监控 Amazon EC2 指标

为了确保更快地响应指标值的变化,我们建议您以 1 分钟一次的频率对指标进行扩展。如果将随指标扩展的频率设置为 5 分钟,可能会导致响应速度变慢,并根据过期的指标数据进行扩展。

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

实例预热

重要

我们建议使用 DefaultInstanceWarmup 设置,它统一了 Auto Scaling 组的所有预热和冷却设置。有关更多信息,请参阅可用的预热和冷却设置

当您创建目标跟踪扩展策略时,可以指定新启动实例的预热时间(秒数)。在指定预热时间过期前,实例不会计入 Auto Scaling 组的聚合指标。

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

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

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

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

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

要创建具有目标跟踪扩缩策略的 Auto Scaling 组

  1. 打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  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(实例需要)指定实例预热值。这样您就可以控制新启动的实例在什么时间开始作用于 CloudWatch 指标。

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

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

为现有 Auto Scaling 组创建目标跟踪扩展策略

  1. 打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  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(实例需要)指定实例预热值。这样您就可以控制新启动的实例在什么时间开始作用于 CloudWatch 指标。

    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-launch-config 创建名为 my-asg 的 Auto Scaling 组。如果您没有要使用的启动配置,可以通过调用 create-launch-configuration 创建一个。

aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \ --launch-configuration-name my-launch-config \ --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" } ] }