Amazon EC2 Auto Scaling 的步进和简单扩展策略 - Amazon EC2 Auto Scaling

Amazon EC2 Auto Scaling 的步进和简单扩展策略

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

我们强烈建议您使用目标跟踪扩展策略,根据类似于平均 CPU 利用率等指标或 应用程序负载均衡器 的 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 组。您有一个违规阈值为 50% 的 CloudWatch 警报以及扩展和缩减策略。对于每个策略,您有一组调整类型为 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 个实例)。

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

  • 如果您使用 AWS 管理控制台,则以绝对值的形式指定上限和下限。如果您使用 AWS CLI 或 AWS 开发工具包,则以违例阈值相对值的形式指定上限和下限。

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

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

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

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

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

扩展调整类型

您可以根据您选择的扩展调整类型来定义执行最佳扩展操作的扩展策略。您可以将调整类型指定为 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,则不会执行扩展操作。

实例预热

如果您创建步进策略,则可以指定新启动实例的预热时间(秒数)。在指定预热时间过期前,实例不会计入 Auto Scaling 组的聚合指标。

使用“分步调整”部分中的示例,假设指标值增加到 60,而在新实例仍在预热时又增加到 62。当前容量仍为 10 个实例,因此,添加了 1 个实例(10 个实例的 10%)。不过,组的所需容量已经是 11 个实例,因此,扩展策略不会进一步增加所需的容量。如果指标在新实例仍在预热时增长到 70,我们应添加 3 个实例(10 个实例的 30%)。但该组的所需容量已经是 11,所以我们只添加 2 个实例,因为新的所需容量为 13 个实例。

在扩展时,我们不会将正在预热的实例看作当前组容量的一部分。因此,落入同一分步调整中的多个警报违例只会导致一个扩展活动。这可确保添加的实例不会超出您的需要。

在缩减时,我们会将正在终止的实例视为当前组容量的一部分。因此不会从 Auto Scaling 组中删除更多实例。

正在进行扩展活动时不能启动收缩活动。

创建 CloudWatch 警报(控制台)

您可以使用以下过程创建 CloudWatch 警报,Amazon EC2 Auto Scaling 会使用这些警报确定何时扩展您的 Auto Scaling 组。每个 CloudWatch 警报监视一个指标,并在指标超出警报阈值时向 Amazon EC2 Auto Scaling 发送消息。

创建用于监视 CPU 利用率的 CloudWatch 警报

  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

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

  3. 在导航窗格中,选择 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 (静态)

    • 对于 Whenever CPUUtilization (每当 <CPU 利用率>),指定您希望在指标值大于、大于或等于、小于还是小于或等于阈值时触发警报。然后,在 than (大于/小于) 下,输入您希望触发警报的阈值。

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

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

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

  9. 选择 Next

  10. (可选)在 Notification (通知) 下,您可以选择或创建要用于接收通知的 Amazon SNS 主题。当然,您也可以立即删除通知,之后按需添加一个通知。

  11. 选择 Next (下一步)

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

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

示例:CPU 超过 80% 阈值时触发的 CloudWatch 警报


                        CloudWatch 警报

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

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

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

为向外扩展创建步进扩展策略

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

  2. 在导航窗格上的 AUTO SCALING 下,选择 Auto Scaling Groups (Auto Scaling 组)

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

    将在 Auto Scaling groups (Auto Scaling 组) 页面底部打开一个拆分窗格,其中显示有关所选组的信息。

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

  5. Automatic scaling (自动扩展) 选项卡的 Scaling policies (扩展策略) 中,选择 Add policy (添加策略)。(旧控制台:您可以通过扩展策略选项卡添加策略。)

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

    1. 对于 Policy type (策略类型),选择 Step scaling (步进扩展)。(旧控制台:选择 Create a scaling policy with steps (创建步进扩展策略)。)

    2. 指定策略的名称。

    3. 对于 CloudWatch alarm (CloudWatch 警报),请选择您的警报。如果尚未创建警报,请选择 Create a CloudWatch alarm (创建 CloudWatch 警报),然后完成步骤 4步骤 13以创建监控 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 (实例需要) 指定实例预热值,用于控制新启动的实例在多长时间后开始作用于 CloudWatch 指标。

  7. 选择 Create

为缩减创建步进扩展策略

  1. 选择 Add policy (添加策略) 以在为向外扩展创建策略之后继续之前的操作。

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

    1. 对于 Policy type (策略类型),选择 Step scaling (步进扩展)。(旧控制台:选择 Create a scaling policy with steps (创建步进扩展策略)。)

    2. 指定策略的名称。

    3. 对于 CloudWatch alarm (CloudWatch 警报),请选择您的警报。如果尚未创建警报,请选择 Create a CloudWatch alarm (创建 CloudWatch 警报),然后完成步骤 4步骤 13以创建监控 CPU 利用率的警报。将警报阈值设置为小于或等于 40%。

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

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

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

  3. 选择创建

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

按如下方式使用 AWS 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 在应用程序负载发生变化时该怎么做。

步进扩展策略

示例:my-step-scale-out-policy

使用以下 put-scaling-policy 命令创建名为 my-step-scale-out-policy 的步进扩展策略,其调整类型为 PercentChangeInCapacity、基于以下步进调整增加组容量(假设 CloudWatch 警报阈值为 60%):

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

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

  • 当指标值大于或等于 90% 时,将实例计数增加 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=10.0,MetricIntervalUpperBound=20.0,ScalingAdjustment=10 \ MetricIntervalLowerBound=20.0,MetricIntervalUpperBound=30.0,ScalingAdjustment=20 \ MetricIntervalLowerBound=30.0,ScalingAdjustment=30 \ --min-adjustment-magnitude 1

记下策略的 Amazon 资源名称 (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-policy

使用以下 put-scaling-policy 命令创建名为 my-step-scale-in-policy 的步进扩展策略,其调整类型为 ChangeInCapacity、将组容量减少 2 个实例:

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 资源名称 (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-policy

使用以下 put-scaling-policy 命令创建名为 my-simple-scale-out-policy 的简单扩展策略,其调整类型为 PercentChangeInCapacity、将组容量增加 30%:

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 资源名称 (ARN)。您需要使用它来为策略创建 CloudWatch 警报。

示例:my-simple-scale-in-policy

使用以下 put-scaling-policy 命令创建名为 my-simple-scale-in-policy 的简单扩展策略,其调整类型为 ChangeInCapacity、将组容量减少一个实例:

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 资源名称 (ARN)。您需要使用它来为策略创建 CloudWatch 警报。

第 3 步:创建 CloudWatch 警报

在步骤 2 中,您已创建扩展策略,这些策略可以指示 Auto Scaling 组在指定条件发生变化时如何缩减和扩展。在此步骤中,您将通过标识要监控的指标、定义用于扩展的条件来创建警报,然后将警报与扩展策略相关联。

示例:AddCapacity

使用以下 CloudWatch put-metric-alarm 命令创建警报,基于至少两个连续评估期(两分钟)内 60% 的平均 CPU 阈值增加 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 命令创建警报,基于至少两个连续评估期(两分钟)内 40% 的平均 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