有关更多信息,请参阅 Amazon EC2 Auto Scaling 的步进和简单扩展策略 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

有关更多信息,请参阅 Amazon EC2 Auto Scaling 的步进和简单扩展策略

通过步进缩放和简单缩放,您可以选择缩放指标和阈值 CloudWatch 调用扩展过程的警报。您还可以定义在指定数目的评估期内违反阈值时应如何扩展 Auto Scaling 组。

我们强烈建议您使用目标跟踪扩展策略,根据类似于平均 CPU 利用率等指标或 Application Load Balancer 的 RequestCountPerTarget 指标来扩展。使用目标跟踪,可以通过在容量增加时减少以及在容量减少时增加的指标,按比例扩展或缩减实例数。这有助于确保 Amazon EC2 Auto Scaling 密切遵循应用程序的需求曲线。有关更多信息,请参阅目标跟踪扩展策略:您仍然可以选择使用步进扩展作为附加策略来实现更高级的配置。例如,您可以在利用率达到特定级别时配置更积极的响应。

步进扩展策略和简单扩展策略之间的区别

步进扩展策略和简单扩展策略是可供您使用的两个动态扩展选项。两者都需要你创建 CloudWatch 扩展策略的警报。两者都要求您为警报指定高阈值和低阈值。这均需要您定义添加还是删除实例及实例的数量,或者将组设置为确切的大小。

策略类型之间的主要区别在于通过步进扩展策略获得的步进调整。当应用步进调整并且增加或减少了 Auto Scaling 组的当前容量时,调整会根据警报违规的大小而有所不同。

在大多数情况下,步进扩展策略是比简单扩展策略更好的选择,即使您仅有单个扩展调整也是如此。

简单扩缩的主要问题是,在扩缩活动开始后,该策略必须等待扩缩活动或运行状况检查替换完成并且冷却时间到期,然后才会响应其他警报。冷却时间有助于防止在先前活动产生明显影响前启动其他扩展活动。

与之对比,步进扩展策略可以继续响应其他警报,甚至在进行扩展活动或运行状况检查替换时也是如此。因此,Amazon EC2 Auto Scaling 会在收到警报消息时评估任何违例警报。

Amazon EC2 Auto Scaling 起初只支持简单扩展策略。如果您在引入目标跟踪和分步策略前创建了自己的扩展策略,您的策略将被视为简单扩展策略。

步进扩展的分步调整

在创建分步扩展策略时,您可以指定一个或多个步进调整,这些步进调整会根据警报违规的大小自动扩展实例数量。每个分步调整指定以下内容:

  • 指标值的下限

  • 指标值的上限

  • 要扩展的数量(基于扩展调整类型)

CloudWatch 根据与您关联的指标的统计数据聚合指标数据点 CloudWatch 警报。超过警报时,将调用相应的扩缩策略。Amazon EC2 Auto Scaling 会将聚合类型应用于来自的最新指标数据点 CloudWatch (与原始指标数据相反)。它将此聚合指标值与步进调整定义的上限和下限进行比较,以确定执行哪个步进调整。

您可以指定相对于违例阈值的上限和下限。例如,假设您有一个既具有当前容量又具有所需容量 10 的 Auto Scaling 组。你有一个 CloudWatch 警报,违规阈值为 50%,并采用横向扩展和缩小政策。对于每个策略,您有一组调整类型为 PercentChangeInCapacity (或控制台中的 % 的组)的步进调整:

示例:扩展策略的步进调整
下限 上限 调整

0

10

0

10

20

10

20

null

30

示例:缩放策略的步进调整
下限 上限 调整

-10

0

0

-20

-10

-10

null

-20

-30

这将创建以下扩展配置。

Metric value -infinity 30% 40% 60% 70% infinity ----------------------------------------------------------------------- -30% | -10% | Unchanged | +10% | +30% -----------------------------------------------------------------------

以下几点总结了扩展配置相对于组的所需容量和当前容量的行为:

  • 在聚合指标值大于 40 并小于 60 时,将保留所需容量和当前容量。

  • 如果指标值达到 60,根据扩展策略的第二个分步调整 (增加 10 个实例的 10%),组的所需容量将增加 1 个实例,总共达到 11 个实例。在新实例运行并且其指定预热时间过期后,当前组容量将增加到 11 个实例。如果指标值即使在这一容量增加之后也上升到 70,则组的所需容量将再增加 3 个实例,达到 14 个实例。这基于扩展策略的第三个步进调整(添加 11 个实例的 30%,即 3.3 个实例,向下舍入到 3 个实例)。

  • 如果指标值降到 40,根据缩减策略的第二个分步调整 (删除 14 个实例的 10%,向下取整为 1 个实例),组的所需容量将减小 1 个实例,达到 13 个实例。如果指标值即使在这一容量减少之后也下降至 30,则组的所需容量将再减少 3 个实例,达到 10 个实例。这基于缩减策略的第三个步进调整(移除 13 个实例的 30%,即 3.9 个实例,向下舍入为 3 个实例)。

为扩展策略指定步进调整时,请注意以下事项:

  • 如果您使用 Amazon Web Services Management Console,则以绝对值的形式指定上限和下限。如果您使用 Amazon CLI 或开发工具包,则以违例阈值相对值的形式指定上限和下限。

  • 分步调整范围不能重叠或有间隙。

  • 只有一个分步调整可以有空下限 (负无穷)。如果一个分步调整有负下限,则必须有一个分步调整有空下限。

  • 只有一个分步调整可以有空上限 (正无穷)。如果一个分步调整有正上限,则必须有一个分步调整有空上限。

  • 同一分步调整中的上限和下限不能为空。

  • 如果指标值高于违例阈值,则含下限而不含上限。如果指标值低于违例阈值,则不含下限而含上限。

扩展调整类型

您可以根据您选择的扩展调整类型来定义执行最佳扩展操作的扩展策略。您可以将调整类型指定为 Auto Scaling 组当前容量的百分比或以容量单位指定。通常,一个容量单位意味着一个实例,除非您使用的是实例权重功能。

对于步进扩展和简单扩展,Amazon EC2 Auto Scaling 支持以下调整类型:

  • ChangeInCapacity — 将当前组容量增加或减少指定的值。正值将增加容量,负调整值将减小容量。例如:如果组的当前容量为 3,调整值为 5,那么当执行此策略时,我们会向容量添加 5 个容量单位,共计 8 个容量单位。

  • ExactCapacity — 将组的当前容量更改为指定值。为此调整类型指定一个非负值。例如:如果当前组容量为 3,调整值为 5,则当执行此策略时,我们会将容量更改为 5 个容量单位。

  • PercentChangeInCapacity — 将当前组容量增加或减少指定的百分比。正值将增加容量,负值将减少容量。例如:如果当前容量为 10,调整值为 10%,那么当执行此策略时,我们会向容量添加 1 个容量单位,总共 11 个容量单位。

    注意

    如果得出的值不是整数,将按如下所示进行取整:

    • 大于 1 的值向下取整。例如,12.7 取整为 12

    • 0 和 1 之间的值舍入到 1。例如,.67 取整为 1

    • 0 和 -1 之间的值舍入到 -1。例如,-.58 取整为 -1

    • 小于 -1 的值向上取整。例如,-6.67 取整为 -6

通过 PercentChangeInCapacity,您还可以使用 MinAdjustmentMagnitude 参数指定要扩展的最小实例。例如,假定您创建一个增加 25% 的策略,并且您指定最小增量为 2 个实例。如果您有一个 Auto Scaling 组包含 4 个实例,而要执行该扩展策略,则 4 的 25% 就是 1 个实例。但是,因为您指定了最小增量 2,则将添加 2 个实例。

使用实例权重时,将 MinAdjustmentMagnitude 参数设置为非零值的效果会发生变化。该值以容量单位为单位。如需设置所要扩展的最小实例数,请将此参数设置为至少与最大实例权重一样大的值。

如果您使用实例权重,请记住,Auto Scaling 组的当前容量可以根据需要超过所需容量。如果要递减的绝对数或百分比表示递减的数量小于当前容量和所需容量之间的差值,则不会执行任何扩展操作。在您查看超过警报阈值时扩缩策略的结果时,必须考虑这些行为。例如,假设所需容量为 30,当前容量为 32。超过警报时,如果扩缩策略将所需容量减少 1,则不会执行扩缩操作。

实例预热

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

当实例处于预热时间时,仅当未预热实例的指标值大于策略的告警阈值上限时,您的扩缩策略才会横向扩展。

如果组再次横向扩展,则仍在预热的实例将计算为下一横向扩展活动所需容量的一部分。因此,落入同一分步调整中的多个警报违例只会导致一个扩展活动。旨在持续 (但不过度) 扩大。

例如,假设您创建了一个包含两个步骤的策略。当指标达到60时,第一步增加10%;当指标达到70%时,第二步增加30%。您的 Auto Scaling 组的所需容量和当前容量为 10。当聚合指标值小于 60 时,所需容量和当前容量不会发生变化。假设指标达到 60,因此添加了 1 个实例(10 个实例中的 10%)。然后,在新实例仍在预热期间,该指标变为62。扩展策略根据当前容量(仍为 10)计算新的所需容量。但是,该组的所需容量已经增加到 11 个实例,因此扩展策略不会进一步增加所需的容量。如果指标在新实例仍在预热时增长到 70,我们应添加 3 个实例(10 个实例的 30%)。但该组的所需容量已经是 11,所以我们只添加 2 个实例,因为新的所需容量为 13 个实例。

当横向扩展活动正在进行时,通过扩缩策略启动的所有横向缩减活动都将被阻止,直到实例完成预热。当实例完成预热后,如果发生缩减事件,则在计算新的所需容量时,当前正在终止的任何实例都将计入该组的当前容量。因此不会从 Auto Scaling 组中删除更多实例。例如,当一个实例已经终止时,如果警报在将所需容量减少 1 的相同步长调整范围内,则不会采取任何扩展操作。

默认值

如果未设置任何值,则扩展策略将使用默认值,即为组定义的默认实例预热值。如果默认实例预热为空,则它将回退到默认冷却时间值。我们建议使用默认实例预热,以便在预热时间发生变化时更轻松地更新所有扩展策略。有关更多信息,请参阅为 Auto Scaling 组设置原定设置实例预热

创建 CloudWatch 指标高阈值和低阈值警报(控制台)

你可以使用 CloudWatch 控制台创建两个警报,一个用于扩展(指标高),另一个用于缩小(指标低)。例如,当超过警报的阈值时,由于流量增加,警报将进入 ALARM (警报) 状态。此状态更改会调用与警报关联的扩缩策略。然后,该策略指示 Amazon EC2 Auto Scaling 如何响应“超过警报”事件,例如添加或删除指定数量的实例。

示例:要创建 CloudWatch 指标高阈值警报
  1. 打开 CloudWatch 控制台位于https://console.aws.amazon.com/cloudwatch/

  2. 如果需要,可以更改区域。从导航栏中,选择您的自动扩缩组所在的区域。

  3. 在导航窗格中,选择 Alarms, All alarms(警报,所有警报),然后选择 Create alarm(创建警报)。

  4. 选择选择指标

  5. All metrics(所有指标)选项卡上,选择 EC2By Auto Scaling Group(按 Auto Scaling 组),然后在搜索字段中输入 Auto Scaling 组的名称。然后,选择 CPUUtilization 并选择 Select metric(选择指标)。将显示 Specify metric and conditions(指定指标和条件)页面,其中显示一个图表以及有关指标的其他信息。

  6. Period(周期)下,选择警报的评估周期,例如 1 分钟。评估警报时,每个周期都聚合到一个数据点。

    注意

    周期越短,创建的警报越敏感。

  7. Conditions(条件)下,执行以下操作:

    • 对于 Threshold type(阈值类型),选择 Static(静态)。

    • 对于每当 CPUUtilization,请指定您是希望指标值大于、大于等于、小于还是小于等于阈值以触发警报。然后,在 than(大于/小于)下,输入您希望超过警报的阈值。

      重要

      要使警报与横向扩展策略(指标的高阈值)一起使用,请确保不要选择小于或小于等于阈值。要使警报与横向缩减策略(警报的低阈值)一起使用,请确保不要选择大于或大于等于阈值。

  8. 其他配置下,执行以下操作:

    • 对于 Datapoints to alarm(触发警报的数据点数),输入指标值必须满足阈值条件才会触发警报的数据点(评估时间段)数。例如,2 个连续的 5 分钟时间段需要花 10 分钟才会调用警报状态。

    • 对于 Missing data treatment(缺失数据处理),选择 Treat missing data as bad (breaching threshold)(将丢失的数据视为不良数据(违反阈值))。有关更多信息,请参阅配置方式 CloudWatch 警报处理丢失的数据亚马逊 CloudWatch 用户指南

  9. 选择下一步

    Configure actions(配置操作)页面会显示。

  10. Notification(通知)下面,选择一个在警报处于 ALARMOKINSUFFICIENT_DATA 状态时通知的 Amazon SNS 主题。

    要使告警为相同告警状态或不同告警状态发送多个通知,请选择 Add notification(添加通知)

    要让警报不发送通知,请选择删除

  11. 您可以保留 Configure actions(配置操作)页面的其他部分为空。将其他部分留空会创建警报,而不会将其与扩展策略相关联。然后,您可以从 Amazon EC2 Auto Scaling 控制台将警报与扩展策略关联。

  12. 选择 Next(下一步)。

  13. 输入警报的名称(例如,Step-Scaling-AlarmHigh-AddCapacity)和可选的描述,然后选择 Next(下一步)。

  14. 选择Create alarm(创建警报)

示例: CloudWatch 如果 CPU 在 4 分钟内超过 80% 的阈值,则会发出警报


                        CloudWatch 警报

创建步骤扩展策略(控制台)

创建自动扩缩组后,您可以选择在该组上配置分步扩缩策略。

以下过程说明如何使用 Amazon EC2 Auto Scaling 控制台创建两个步进扩展策略:将组容量增加 30% 的扩展策略,以及将组容量减小到两个实例的收缩策略。

在配置您的扩展策略时,您可以同时创建警报。或者,您也可以使用从 CloudWatch 控制台创建的警报,如上一部分中所述。

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

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

    这时将在页面底部打开一个拆分窗格。

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

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

  5. 要为向外扩展(增加容量)定义策略,请执行以下操作:

    1. 对于 Policy type(策略类型),选择 Step scaling(步进扩展)。

    2. 指定策略的名称。

    3. 对于CloudWatch 警报,选择您的闹钟。如果您尚未创建警报,请选择创建一个 CloudWatch 警报并完成中的步骤 4 到步骤 14创建 CloudWatch 指标高阈值和低阈值警报(控制台)创建监控 CPU 利用率的警报。将警报阈值设置为大于或等于 80%。

    4. 指定在使用 Take the action (执行操作) 来完成操作时,此策略对当前组大小进行的更改。您可以添加特定数量的实例或现有组大小的百分比,也可将组设置为准确的大小。

      例如,选择 Add,在下一个字段中输入 30,然后选择 percent of group。默认情况下,此步骤调整的下限为警报阈值,上限为正 (+) 无穷。

    5. 要添加另一个步骤,请选择 Add step (添加步进),然后定义要缩放的量以及步进相对于警报阈值的下限和上限。

    6. 要设置可扩展的最少实例数,请更新 Add capacity units in increments of at least (添加容量单位的增量至少为) 1 capacity units (容量单位) 中的数量字段。

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

  6. 选择创建

为缩减创建步进扩展策略
  1. 选择创建动态扩展策略以在为向外扩展创建策略之后继续之前的操作。

  2. 要为缩减(减少容量)定义策略,请执行以下操作:

    1. 对于 Policy type(策略类型),选择 Step scaling(步进扩展)。

    2. 指定策略的名称。

    3. 对于CloudWatch 警报,选择您的闹钟。如果您尚未创建警报,请选择创建一个 CloudWatch 警报并完成中的步骤 4 到步骤 14创建 CloudWatch 指标高阈值和低阈值警报(控制台)创建监控 CPU 利用率的警报。将警报阈值设置为小于或等于 40%。

    4. 指定在使用 Take the action (执行操作) 来完成操作时,此策略对当前组大小进行的更改。您可以删除特定数量的实例或现有组大小的百分比,也可将组设置为准确的大小。

      例如,选择 Remove,在下一个字段中输入 2,然后选择 capacity units。默认情况下,此步骤调整的上限为警报阈值,下限为负 (-) 无穷。

    5. 要添加另一个步骤,请选择 Add step (添加步进),然后定义要缩放的量以及步进相对于警报阈值的下限和上限。

  3. 选择创建

创建扩展策略和 CloudWatch警报 (Amazon CLI)

按如下方式使用 Amazon CLI,为您的 Auto Scaling 组配置步进扩展策略或简单扩展策略。

第 1 步:创建 Auto Scaling 组

使用以下内容create-auto-scaling-group命令创建名为的 Auto Scaling 组my-asg使用启动模板my-template。如果您没有启动模板,请参阅 使用启动模板的 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 在应用程序负载发生变化时该怎么做。

分步扩展策略

示例: my-step-scale-out-政策

使用以下内容put-scaling-policy命令创建名为的步进缩放策略my-step-scale-out-policy,调整类型为PercentChangeInCapacity这会根据以下步骤调整来增加组的能力(假设 CloudWatch 警报阈值为 60%):

  • 当指标值大于或等于 60% 但小于 75% 时,将实例计数增加 10%

  • 当指标值大于或等于 75% 但小于 85% 时,将实例计数增加 20%

  • 当指标值大于或等于 85% 时,将实例计数增加 30%

aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-asg \ --policy-name my-step-scale-out-policy \ --policy-type StepScaling \ --adjustment-type PercentChangeInCapacity \ --metric-aggregation-type Average \ --step-adjustments MetricIntervalLowerBound=0.0,MetricIntervalUpperBound=15.0,ScalingAdjustment=10 \ MetricIntervalLowerBound=15.0,MetricIntervalUpperBound=25.0,ScalingAdjustment=20 \ MetricIntervalLowerBound=25.0,ScalingAdjustment=30 \ --min-adjustment-magnitude 1

记下策略的 Amazon Resource Name (ARN)。你需要它来创建 CloudWatch 为该政策发出警报。

{ "PolicyARN": "arn:aws:autoscaling:region:123456789012:scalingPolicy:4ee9e543-86b5-4121-b53b-aa4c23b5bbcc:autoScalingGroupName/my-asg:policyName/my-step-scale-in-policy }
示例: my-step-scale-in-政策

使用以下内容put-scaling-policy命令创建名为的步进缩放策略my-step-scale-in-policy,调整类型为ChangeInCapacity当关联时,这会使组的容量减少 2 个实例 CloudWatch 警报违反了指标的低阈值。

aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-asg \ --policy-name my-step-scale-in-policy \ --policy-type StepScaling \ --adjustment-type ChangeInCapacity \ --step-adjustments MetricIntervalUpperBound=0.0,ScalingAdjustment=-2

记下策略的 Amazon Resource Name (ARN)。你需要它来创建 CloudWatch 为该政策发出警报。

{ "PolicyARN": "arn:aws:autoscaling:region:123456789012:scalingPolicy:ac542982-cbeb-4294-891c-a5a941dfa787:autoScalingGroupName/my-asg:policyName/my-step-scale-out-policy }

简单扩展策略

或者,您可以使用以下 CLI 命令而不是前文中的 CLI 命令创建简单扩展策略。请记住,使用简单扩展策略会取代冷却时间。

示例: my-simple-scale-out-政策

使用以下内容put-scaling-policy命令创建名为的简单扩展策略my-simple-scale-out-policy,调整类型为PercentChangeInCapacity当关联时,这会使组的容量增加 30% CloudWatch 警报违反了指标的高阈值。

aws autoscaling put-scaling-policy --policy-name my-simple-scale-out-policy \ --auto-scaling-group-name my-asg --scaling-adjustment 30 \ --adjustment-type PercentChangeInCapacity

记下策略的 Amazon Resource Name (ARN)。你需要它来创建 CloudWatch 为该政策发出警报。

示例: my-simple-scale-in-政策

使用以下内容put-scaling-policy命令创建名为的简单扩展策略my-simple-scale-in-policy,调整类型为ChangeInCapacity当关联时,这会使组的容量减少一个实例 CloudWatch 警报违反了指标的低阈值。

aws autoscaling put-scaling-policy --policy-name my-simple-scale-in-policy \ --auto-scaling-group-name my-asg --scaling-adjustment -1 \ --adjustment-type ChangeInCapacity --cooldown 180

记下策略的 Amazon Resource Name (ARN)。你需要它来创建 CloudWatch 为该政策发出警报。

步骤 3:创建 CloudWatch 指标高阈值和低阈值的警报

在步骤 2 中,您已创建扩缩策略,这些策略可以指示 Amazon EC2 Auto Scaling 在指标值增加或降低时如何横向扩展和横向缩减。在此步骤中,您可以创建两个警报,方法为标识要监控的指标、为警报定义指标的高、低阈值和其他详细信息,然后将警报与扩缩策略关联。

示例: AddCapacity

使用以下内容 CloudWatch put-metric-alarm命令创建警报,在至少两个连续两分钟的评估周期内,根据平均 CPU 阈值为 60%,增加 Auto Scaling 组的大小。要使用您自己的自定义指标,请在 --metric-name 中指定其名称,并在 --namespace 指定其命名空间。

aws cloudwatch put-metric-alarm --alarm-name Step-Scaling-AlarmHigh-AddCapacity \ --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average \ --period 120 --evaluation-periods 2 --threshold 60 \ --comparison-operator GreaterThanOrEqualToThreshold \ --dimensions "Name=AutoScalingGroupName,Value=my-asg" \ --alarm-actions PolicyARN
示例: RemoveCapacity

使用以下内容 CloudWatch put-metric-alarm命令创建警报,根据平均 CPU 阈值减小 Auto Scaling 组的大小,至少连续两个评估期(两分钟)。要使用您自己的自定义指标,请在 --metric-name 中指定其名称,并在 --namespace 指定其命名空间。

aws cloudwatch put-metric-alarm --alarm-name Step-Scaling-AlarmLow-RemoveCapacity \ --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average \ --period 120 --evaluation-periods 2 --threshold 40 \ --comparison-operator LessThanOrEqualToThreshold \ --dimensions "Name=AutoScalingGroupName,Value=my-asg" \ --alarm-actions PolicyARN