Application Auto Scaling 的目标跟踪扩缩策略
要创建目标跟踪扩缩策略,您需要指定一个 Amazon CloudWatch 指标和一个目标值,目标值用来表示应用程序的理想平均利用率或吞吐量水平。然后 Application Auto Scaling 可以横向扩展可扩展目标(增加容量)以处理峰值流量,并在利用率或吞吐量较低时横向缩减该可扩展目标(删除容量)以降低成本。
例如,假设您当前有一个在竞价型实例集上运行的应用程序,并希望在应用程序负载变化时将该实例集的 CPU 利用率保持在 50% 左右。这为您提供额外容量以处理流量高峰,而无需维护过多的空闲资源。
创建一个将目标平均 CPU 利用率设置为 50% 的目标跟踪扩缩策略即可满足此需求。然后,Application Auto Scaling 会根据需要增减实例数量,以确保实际指标值等于或接近 50%。
下图概述显示设置完成时目标跟踪扩缩策略的工作原理。

注意事项
使用目标跟踪扩缩策略时,需要注意以下事项:
-
请勿创建、编辑或删除与目标跟踪扩缩策略一起使用的 CloudWatch 警报。Application Auto Scaling 会创建并管理与您的目标跟踪扩缩策略关联的 CloudWatch 警报,并在不需要时将其删除。
-
为了确保应用程序可用性,Application Auto Scaling 针对指标尽快按比例横向扩展,但会逐渐横向缩减。
-
如果指标缺少数据点,则会导致 CloudWatch 警报状态变为
INSUFFICIENT_DATA
。发生这种情况时,在找到新的数据点之前,Application Auto Scaling 无法扩展您的可扩展目标。有关在数据不足时创建警报的信息,请参阅 使用 CloudWatch 警报进行监控。 -
您可能会看到目标值与实际指标数据点之间存在差距。这是因为 Application Auto Scaling 在确定要添加或删除多少容量时将始终通过向上或向下舍入保守地进行操作,以免添加的容量不足或删除的容量过多。但是,对于具有小容量的可扩展目标,实际指标数据点可能看起来与目标值差距很大。
-
对于容量更高的可扩展目标,添加或删除容量将缩小目标值与实际指标数据点之间的差距。
-
目标跟踪扩展策略假设它应该在指定指标高于目标值时执行向外扩展。因此,不能使用目标跟踪扩展策略在指定指标低于目标值时向外扩展。
多个扩缩策略
-
一个可扩展目标可以具有多个目标跟踪扩展策略,前提是它们分别使用不同的指标。Application Auto Scaling 的目的是始终优先考虑可用性,因此其行为会有所不同,具体取决于目标跟踪策略是否已准备好横向扩展或横向缩减。如果任何目标跟踪策略已准备好进行向外扩展,它将向外扩展可扩展目标,但仅在所有目标跟踪策略(启用了缩减部分)准备好缩减时才执行缩减。
-
如果多个扩缩策略指示可扩展目标同时横向扩展或横向缩减,则 Application Auto Scaling 会根据为横向缩减和横向扩展提供最大容量的策略进行扩展。这让您能够更灵活地覆盖多种场景,并确保始终有足够的容量来处理工作负载。
-
您可以禁用目标跟踪扩展策略的缩减部分。利用此功能,您可以灵活地使用与用于向外扩展的方法不同的缩减方法。例如,您可以使用步进扩展策略进行缩减,同时使用目标跟踪扩展策略进行横向扩展。
-
不过,在将目标跟踪扩展策略与步进扩展策略结合使用时,我们建议您务必谨慎,因为这些策略之间的冲突可能会导致意外的行为。例如,如果步进扩展策略在目标跟踪策略准备执行缩减之前启动缩减活动,则不会阻止缩减活动。在缩减活动完成后,目标跟踪策略可能会指示可扩展目标重新横向扩展。
在高利用率期间支持应用程序可用性
目标跟踪扩展策略在利用率提高时添加容量比在利用率降低时删除容量更为积极。例如,如果策略的指定指标达到其目标值,则策略假定您的应用程序已达到高负载。因此,它通过尽可能快地添加与指标值成比例的容量来进行响应。指标越高,添加的容量就越多。
当指标低于目标值时,策略预计利用率最终会再次增加。在此场景中,只有当利用率超过远低于目标值(通常比目标值低 10% 以上)的阈值时,它才会通过删除容量来减慢扩缩速度,从而认为利用率已放缓。这种更保守的行为旨在确保只有当应用程序不再遇到与之前相同的高级别需求时,才会删除容量。
对于具有周期性质的工作负载,您还可以选择使用计划扩展按计划自动更改容量。对于每个计划的操作,可以定义新的最小容量值和新的最大容量值。这些值构成扩展策略的边界。
当立即需要容量时,计划扩展和目标跟踪扩展的组合有助于减少利用率级别急剧增加的影响。
选择指标
您可以使用预定义的指标或自定义指标,创建目标跟踪扩展策略。
使用预定义指标创建目标跟踪扩展策略时,您可以从以下预定义指标列表中选择一个指标。
- AppStream 2.0
-
AppStreamAverageCapacityUtilization
(百分比) - Aurora
-
RDSReaderAverageCPUUtilization
(百分比)RDSReaderAverageDatabaseConnections
(计数) - Amazon Comprehend
-
ComprehendInferenceUtilization
(百分比) - DynamoDB
-
DynamoDBReadCapacityUtilization
(百分比)DynamoDBWriteCapacityUtilization
(百分比) - Amazon ECS
-
ALBRequestCountPerTarget
(计数)ECSServiceAverageCPUUtilization
(百分比)ECSServiceAverageMemoryUtilization
(百分比) - ElastiCache
-
ElastiCachePrimaryEngineCPUUtilization
(百分比)ElastiCacheReplicaEngineCPUUtilization
(百分比)ElastiCacheDatabaseMemoryUsageCountedForEvictPercentage
(百分比) - Amazon Keyspaces (for Apache Cassandra)
-
CassandraReadCapacityUtilization
(百分比)CassandraWriteCapacityUtilization
(百分比) - Lambda
-
LambdaProvisionedConcurrencyUtilization
(百分比) - Amazon Managed Streaming for Apache Kafka (MSK)
-
KafkaBrokerStorageUtilization
(百分比) - Neptune
-
NeptuneReaderAverageCPUUtilization
(百分比) - Spot 实例集(Amazon EC2)
-
ALBRequestCountPerTarget
(计数)EC2SpotFleetRequestAverageCPUUtilization
(百分比)EC2SpotFleetRequestAverageNetworkIn
(计数)EC2SpotFleetRequestAverageNetworkOut
(计数) - SageMaker
-
SageMakerVariantInvocationsPerInstance
(计数)
提示
每个预定义指标都基于相应服务发布的指标。有关这些指标的更多信息,请参阅 指标与维度 中的表格内可用的服务文档。
选择指标时请记住原则:
-
并非所有指标都适用于目标跟踪。当指定自定义指标时,这可能很重要。指标必须是有效的使用率指标并且描述可扩展目标的繁忙程度。指标值必须根据可扩展目标的容量按比例增加或减少,以便指标数据可用于按比例扩展可扩展目标。
-
要使用
ALBRequestCountPerTarget
指标,您必须指定ResourceLabel
参数以标识与该指标关联的目标组。 -
指标向 CloudWatch 发出实际 0 值时(例如,
ALBRequestCountPerTarget
),Application Auto Scaling 在应用程序没有流量时可以横向缩减为 0。要在没有请求路由时将可扩展目标横向缩减到 0,可扩展目标的最小容量必须设置为 0。 -
使用自定义指标创建目标跟踪扩展策略时,您可以使用指标数学来组合多个指标。有关更多信息,请参阅使用指标数学为 Application Auto Scaling 创建目标跟踪扩展策略。
-
要查看您使用的服务是否支持在控制台中指定自定义指标,请参阅该服务的文档。
对 Amazon EC2 使用详细的监控
在扩缩策略中使用 EC2 实例指标时,我们建议您以 1 分钟的粒度配置这些指标,以确保更快地响应指标值的变化。如果以 5 分钟的粒度根据实例指标扩缩,可能会导致响应速度变慢,并根据过时的指标数据进行扩缩。
要获取此级别的 Amazon EC2 指标数据,您必须专门启用详细监控功能。默认情况下,EC2 实例针对基本监控启用,也就是说,实例的指标数据以 5 分钟一次的粒度提供。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的对实例启用或禁用详细监控。
定义目标值
创建目标跟踪扩缩策略时,必须指定一个目标值。目标值表示应用程序的最佳平均利用率或吞吐量。为了经济高效地使用资源,目标值的设置应尽可能高,并为流量的意外增加提供合的理缓冲。当应用程序针对正常流量进行最佳横向扩展时,实际指标值应等于或略低于目标值。
当扩缩策略基于吞吐量(例如,每目标的应用程序负载均衡器请求计数、网络 I/O 或其他计数指标)时,目标值表示单个实体(例如 Application Load Balancer 目标组的单个目标)在一分钟内的最佳平均吞吐量。
定义冷却时间
等待上一个扩展活动生效的时间量称为冷却时间。
对于目标跟踪扩展策略,有两种类型的冷却时间:
-
使用 scale-out cooldown period (向外扩展冷却时间),目的是持续(但不过度)向外扩展。Application Auto Scaling 使用目标跟踪扩展策略成功向外扩展后,它将开始计算冷却时间。除非触发更大的向外扩展或冷却时间结束,否则扩展策略不会再次增加所需容量。尽管此向外扩展冷却时间有效,但启动向外扩展活动所添加的容量将计算为下一个向外扩展活动所需容量的一部分。
-
使用 scale-in cooldown period(横向缩减冷却时间),目的是以保守方式进行横向缩减以保护应用程序的可用性,因此在冷却时间过期之前阻止横向缩减活动。但是,如果另一个警报在缩减冷却时间内触发了向外扩展活动,Application Auto Scaling 将立即向外扩展目标。在这种情况下,缩减冷却时间停止而不完成。
每个冷却时间以秒为单位进行度量,仅适用于与扩展策略相关的扩展活动。在冷却时间内,当计划的操作在计划的时间开始时,它可以立即触发扩展活动,而无需等待冷却时间到期。
您可以从默认值开始,稍后可对其进行微调。例如,您可能需要延长冷却时间,以防止目标跟踪扩展策略对短时间内发生的更改过于激进。有关默认值,请参阅 Application Auto Scaling API 参考中的 TargetTrackingScalingPolicyConfiguration。
扩缩策略创建、管理和删除的常用命令
使用扩缩策略的常用命令包括:
-
register-scalable-target 将 Amazon 或自定义资源注册为可扩展目标(Application Auto Scaling 可以扩展的资源),并暂停和恢复扩缩。
-
put-scaling-policy 可添加或修改现有可扩展目标的扩缩策略。
-
describe-scaling-activities 可返回关于 Amazon 区域中扩缩活动的信息。
-
describe-scaling-policies 可返回关于 Amazon 区域中扩缩策略的信息。
-
delete-scaling-policy 可删除扩缩策略。
限制
以下是使用目标跟踪扩缩策略时的限制:
-
可扩展目标不能是 Amazon EMR 集群。Amazon EMR 不支持目标跟踪扩缩策略。
-
当 Amazon MSK 集群是可扩展目标时,横向缩减将禁用且无法启用。
-
您不能使用
RegisterScalableTarget
或PutScalingPolicy
API 操作来更新 Amazon Auto Scaling 扩展计划。有关如何使用扩缩计划的更多信息,请参阅 Amazon Auto Scaling 文档。