Amazon EC2 Auto Scaling 实例权重 - Amazon EC2 Auto Scaling
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon EC2 Auto Scaling 实例权重

在将 Auto Scaling 组配置为启动多个实例类型时,您可以选择使用实例权重定义每个实例对所需的组容量贡献的容量单位数。这样,您可以通过直接映射到应用程序性能的方式指定每种实例类型的相对权重。您可以对实例加权以满足您的特定应用程序需求,例如,依据内核 (vCPU) 或内存 (GiB) 加权。

例如,假设您运行一个计算密集型应用程序,该应用程序在至少具有 8 个 vCPU 和 15 GiB RAM 时性能最佳。如果您使用 c5.2xlarge 作为基本单元,以下任何 EC2 实例类型都将满足您的应用程序需求。

实例类型示例
实例类型 vCPU 内存 (GiB)
c5.2xlarge 8 16
c5.4xlarge 16 32
c5.12xlarge 48 96
c5.18xlarge 72 144
c5.24xlarge 96 192

默认情况下,所有实例类型都被视为具有相同权重。换句话说,无论 Amazon EC2 Auto Scaling 启动大型还是小型实例类型,每个实例都会计入组的所需容量。

但是,通过实例权重,您可以分配一个数值,该值指定与每个实例类型关联的容量单位数。例如,如果实例大小不相同,c5.2xlarge 实例的权重可能为 2,而 c5.4xlarge(大两倍)的权重可能为 4,依此类推。然后,在 Amazon EC2 Auto Scaling 启动实例时,这些实例的权重会计入您所需的容量中。

每单位小时价格

下表比较美国东部(弗吉尼亚北部、俄亥俄)不同可用区中 Spot 实例的每小时价格和同一区域中按需实例的价格。显示的价格是示例定价,而不是当前定价。这些价格是您每实例小时的成本。

示例:每实例小时的 Spot 定价
实例类型 us–east–1a us–east–1b us–east–1c 按需定价
c5.2xlarge 0.180 USD 0.191 USD 0.170 USD 0.34 USD
c5.4xlarge 0.341 USD 0.361 USD 0.318 USD 0.68 USD
c5.12xlarge 0.779 USD 0.777 USD 0.777 USD 2.04 USD
c5.18xlarge 1.207 USD 1.475 USD 1.357 USD 3.06 USD
c5.24xlarge 1.555 USD 1.555 USD 1.555 USD 4.08 USD

通过实例权重,您可以根据每单位小时 的使用量来评估您的成本。您可以将某种实例类型的价格除以它表示的单位数来确定每单位小时价格。对于按需实例,部署一个实例类型时的每单位小时 价格与部署不同大小的相同实例类型时的价格相同。但是,相比之下,每单位小时 的 Spot 价格因 Spot 池而异。

了解每单位小时 价格计算如何与权重实例配合工作的最简单方法是使用示例。例如,为便于计算,假定您只想启动 us-east-1a 中的 Spot 实例。每单位小时价格如下所示。

示例:每单位小时 Spot 价格示例
实例类型 us–east–1a 实例权重 每单位小时价格
c5.2xlarge 0.180 USD 2 0.090 USD
c5.4xlarge 0.341 USD 4 0.085 USD
c5.12xlarge 0.779 USD 12 0.065 USD
c5.18xlarge 1.207 USD 18 0.067 USD
c5.24xlarge 1.555 USD 24 0.065 USD

注意事项

本节讨论有效实施实例权重的关键注意事项。

  • 首先选择能够反映应用程序实际性能要求的几种实例类型。然后,通过指定实例类型的权重,确定每种实例类型应计入 Auto Scaling 组所需容量的数量。该权重应用于组中的当前和未来实例。

  • 在为权重选择超大范围时应小心谨慎。例如,当较大实例类型的权重为 200 时,我们建议不要将前一个实例类型的权重指定为 1。此外,最小权重和最大权重之间的差异不能太极端。如果任何实例类型的权重差异太大,这可能会对持续的性价比优化产生负面影响。

  • Auto Scaling 组大小以容量单位计量,而不是以实例计量。例如,如果权重基于 vCPU,则必须指定所需核心数、最小核心数和最大核心数。

  • 设置权重和所需容量,使所需容量至少比最大权重大两到三倍。

  • 如果您选择为 Spot 设置您自己的最高价格,则必须指定对最贵实例类型足够高的每实例小时 价格。如果可用区中的当前 Spot 价格低于最高价格且容量可用,Amazon EC2 Auto Scaling 则会预配置 Spot 实例。如果一个 Spot 实例池无法满足 Spot 实例请求,它将继续尝试其他 Spot 池以便利用 Spot 实例节约成本。

通过实例权重,引入了以下新行为:

  • 当前容量等于或高于所需容量。由于 Amazon EC2 Auto Scaling 希望预配置实例直到完全达到所需容量,因此可能会超过目标。例如,假设您指定了两个实例类型 c5.2xlargec5.12xlarge,并且您为 c5.2xlarge 分配了实例权重 2,为 c5.12xlarge 分配了实例权重 12。如果还剩 5 个单位才能实现所需容量,Amazon EC2 Auto Scaling 会预配置 c5.12xlarge,所需容量将超过 7 个单位。

  • 当 Amazon EC2 Auto Scaling 预配置实例以达到所需容量时,同避免超过目标相比,跨可用区分配实例和遵从按需实例与 Spot 实例的分配策略都会具有更高优先级。

  • 通过使用您的首选分配策略,Amazon EC2 Auto Scaling 可以超出最大容量限制,以便在可用区之间保持平衡。Amazon EC2 Auto Scaling 强制执行的硬性限制是一个值,该值等于所需容量加上最大重量的和。

添加或修改现有组的权重时,请注意以下事项:

  • 向现有 Auto Scaling 组添加实例权重时,您必须包含已在组中运行的任何实例类型。

  • 修改现有实例权重时,Amazon EC2 Auto Scaling 将根据新权重启动或终止实例以达到所需容量。

  • 如果您删除了实例类型,该实例类型的所有正在运行的实例都将继续采用其上次更新的权重值,即使该实例类型已被删除也是如此。

添加或修改 Auto Scaling 组的权重

您可以向现有 Auto Scaling 组添加权重,也可以在创建新 Auto Scaling 组时添加权重。您还可以更新现有 Auto Scaling 组以定义新的配置选项(Spot/按需使用情况、Spot 分配策略、实例类型)。如果您更改了所需的 Spot 或按需实例数量,Amazon EC2 Auto Scaling 会逐步替换现有实例以匹配新的购买选项。

在使用实例权重创建 Auto Scaling 组之前,我们建议您熟悉启动具有多种实例类型的组。有关更多信息和其他示例,请参阅Auto Scaling 组具有多个实例类型和购买选项

以下示例说明如何使用 AWS CLI 在您创建 Auto Scaling 组时添加权重,以及添加或修改现有 Auto Scaling 组的权重。您可以在 JSON 文件中配置各种参数,然后将 JSON 文件作为 Auto Scaling 组的唯一参数引用。

在创建时向 Auto Scaling 组添加权重

  • 使用 create-auto-scaling-group 命令可以创建新的 Auto Scaling 组。例如,以下命令创建一个新的 Auto Scaling 组,并通过指定以下内容添加实例权重:

    • 作为按需实例 (0) 启动的组的百分比以及以 (10) 开头的按需实例的基本数量

    • 每个可用区中 Spot 实例的分配策略(capacity-optimized)。

    • 按优先级顺序启动(m4.16xlargem5.24xlarge)的实例类型

    • 与实例类型之间的相对大小差异 (vCPU) 相对应的实例权重(1624

    • 要在其中启动实例的子网(subnet-5ea0c127subnet-6194ea3bsubnet-c934b782),每个子网对应于不同的可用区

    • 启动模板 (my-launch-template) 和启动模板版本 ($Latest)

    aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json

    下面是一个 config.json 示例文件。

    { "AutoScalingGroupName": "my-asg", "MixedInstancesPolicy": { "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Latest" }, "Overrides": [ { "InstanceType": "m4.16xlarge", "WeightedCapacity": "16" }, { "InstanceType": "m5.24xlarge", "WeightedCapacity": "24" } ] }, "InstancesDistribution": { "OnDemandBaseCapacity": 10, "OnDemandPercentageAboveBaseCapacity": 0, "SpotAllocationStrategy": "capacity-optimized" } }, "MinSize": 160, "MaxSize": 720, "DesiredCapacity": 480, "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782", "Tags": [] }

添加或修改现有 Auto Scaling 组的权重

  • 使用 update-auto-scaling-group 命令添加或修改权重。例如,以下命令通过指定以下内容向现有 Auto Scaling 组中的实例类型添加权重:

    • 按优先级顺序启动(c5.18xlargec5.24xlargec5.2xlargec5.4xlarge)的实例类型

    • 与实例类型之间的相对大小差异 (vCPU) 相对应的实例权重(182424

    • 新增加的所需容量,大于最大权重

    aws autoscaling update-auto-scaling-group --cli-input-json file://~/config.json

    下面是一个 config.json 示例文件。

    { "AutoScalingGroupName": "my-existing-asg", "MixedInstancesPolicy": { "LaunchTemplate": { "Overrides": [ { "InstanceType": "c5.18xlarge", "WeightedCapacity": "18" }, { "InstanceType": "c5.24xlarge", "WeightedCapacity": "24" }, { "InstanceType": "c5.2xlarge", "WeightedCapacity": "2" }, { "InstanceType": "c5.4xlarge", "WeightedCapacity": "4" } ] } }, "MinSize": 0, "MaxSize": 100, "DesiredCapacity": 100 }

验证 Auto Scaling 组的权重

  • 使用以下 describe-auto-scaling-groups 命令验证权重。

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

    以下为响应示例:

    { "AutoScalingGroups": [ { "AutoScalingGroupName": "my-asg", "AutoScalingGroupARN": "arn", "MixedInstancesPolicy": { "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-0b97f1e282EXAMPLE", "LaunchTemplateName": "my-launch-template", "Version": "$Latest" }, "Overrides": [ { "InstanceType": "m4.16xlarge", "WeightedCapacity": "16" }, { "InstanceType": "m5.24xlarge", "WeightedCapacity": "24" } ] }, "InstancesDistribution": { "OnDemandAllocationStrategy": "prioritized", "OnDemandBaseCapacity": 10, "OnDemandPercentageAboveBaseCapacity": 0, "SpotAllocationStrategy": "capacity-optimized" } }, "MinSize": 160, "MaxSize": 720, "DesiredCapacity": 480, "DefaultCooldown": 300, "AvailabilityZones": [ "us-west-2a", "us-west-2b", "us-west-2c" ], "LoadBalancerNames": [], "TargetGroupARNs": [], "HealthCheckType": "EC2", "HealthCheckGracePeriod": 0, "Instances": [ { "InstanceId": "i-027327f0ace86f499", "InstanceType": "m5.24xlarge", "AvailabilityZone": "us-west-2a", "LifecycleState": "InService", "HealthStatus": "Healthy", "LaunchTemplate": { "LaunchTemplateId": "lt-0b97f1e282EXAMPLE", "LaunchTemplateName": "my-launch-template", "Version": "7" }, "ProtectedFromScaleIn": false, "WeightedCapacity": "24" }, { "InstanceId": "i-0ec0d761cc134878d", "InstanceType": "m4.16xlarge", "AvailabilityZone": "us-west-2a", "LifecycleState": "Pending", "HealthStatus": "Healthy", "LaunchTemplate": { "LaunchTemplateId": "lt-0b97f1e282EXAMPLE", "LaunchTemplateName": "my-launch-template", "Version": "7" }, "ProtectedFromScaleIn": false, "WeightedCapacity": "16" }, ... } ] }