AutoScaling 成本优化模式升级--混合实例策略

伸缩组成本优化模式以成本为目标,始终建立最低价的实例,同时,经过多可用区,多实例规格分布,以此来提升服务稳定性。可是,对于成本优点最大化的竞价实例,伸缩组难以防范竞价实例大范围回收可能致使的服务雪崩,本次升级容许用户制定更详细的成本控制策略,在成本和稳定性之间进行调整和权衡。java

成本优化模式简介

当您的伸缩配置选择了多实例规格,并想以最低的价格来使用同等规模的 ECS 实例配置时,您能够选择使用 成本优化策略 的伸缩组,来下降您的 ECS 实例使用成本;当您的伸缩配置选择的实例为抢占式实例时,您可能会遇到因为价格、库存等缘由致使抢占式实例建立失败场景,从而致使扩容不及时,影响到业务,您也能够选择使用 成本优化策略 的伸缩组,在抢占式实例建立失败的时候自动为您尝试建立同规格的按量实例,来保证业务的稳定性。maven

从上述的描述,咱们能够清晰的看到,成本优化模式的核心策略:优化

  1. 建立实例时,以单核cpu价格价格最低来选择建立实例的 InstanceType(实例规格),ZoneId(可用区)等配置信息。
  2. 竞价实例建立失败时,调整为建立按量实例,以保证业务连续性。

咱们将上述的策略称为最低价策略(LowestPrice)。spa

成本优化模式升级

成本优化模式的升级策略主要针对竞价实例回收机制可能带来的业务雪崩状况。主要集中在如下两点:code

  1. 混合实例配比。容许用户为成本优化伸缩组制定按量实例与竞价实例的混合策略。
  2. 竞价实例主动替换。在竞价实例释放前建立新实例,主动替换掉当前的竞价实例。

在下面的文章中,咱们将原成本优化伸缩组称为普通成本优化伸缩组,将指定实例混合策略的成本优化伸缩组称为成本优化混合实例伸缩组。接口

参数详解

  • OnDemandBaseCapacity

伸缩组所须要的按量实例的最小个数,当伸缩组中按量实例个数小于该值时,将优先建立按量实例。ci

  • OnDemandPercentageAboveBaseCapacity

知足 OnDemandBaseCapacity 条件后,建立实例中按量实例所占的比例。get

  • SpotInstancePools

SpotInstancePools 指定了最低价的多个实例规格,当建立竞价实例时,将在 SpotInstancePools 中进行均衡分布。it

  • SpotInstanceRemedy

是否开启竞价实例的补偿机制。开启后在竞价实例被回收前5分钟左右,将主动替换掉当前竞价实例。io

兼容性介绍

成本优化混合实例伸缩组与普通成本优化伸缩组在接口和功能方面是彻底兼容的。当您不指定混合实例策略的相关参数时,您将建立出普通成本优化伸缩组。同时,对于成本优化混合实例伸缩组,经过合理的制定混合实例策略,可以具备与普通成本优化伸缩组彻底相同的行为。下面举例说明:

  1. 假设普通成本优化伸缩组建立的全为按量实例。

此时,你建立的成本优化混合实例伸缩组只须要指定OnDemandBaseCapacity=0, OnDemandPercentageAboveBaseCapacity=100,spotInstancePools=1,那么将拥有彻底相同的行为。

  1. 假设普通成本优化伸缩组优先建立竞价实例。

此时,你建立的成本优化混合实例伸缩组只须要指定OnDemandBaseCapacity=0, OnDemandPercentageAboveBaseCapacity=0,spotInstancePools=1,那么将拥有彻底相同的行为。

扩缩容策略

成本优化混合实例伸缩组拥有一套相对独立的扩缩容策略,您在大多数状况下不须要关注实例的选择过程,若是您须要对伸缩组行为具备更详细的了解,本节中对扩缩容过程进行了详细的描述。

扩容策略

当指定了伸缩组的实例混合策略以后,伸缩组并不是仅对新建立出来的实例按照混合比例进行建立,而是保证伸缩组总体的实例配比趋近目标配比。

  • 按量实例扩容策略

按量实例部分,采用了 LowestPrice 的建立方式,多实例规格与多可用区按照优先级方式依此进行选择,该部分与普通成本优化伸缩组保持一致。

  • 竞价实例扩容策略

竞价实例部分,采用了 LowestPrice 的建立方式,当配置多实例规格时,将根据 SpotInstancePools 配置,在最低价的多个实例规格之间平均分配,针对每一种实例规格,当没法成功建立时,按照价格顺序依次选取下一规格继续进行建立,当竞价实例所有不可建立,将退回到建立对应的按量实例。多可用区则按照优先级的方式依次进行选择。

下面,咱们经过示例来描述成本优化混合实例伸缩组的扩容行为:

假设伸缩组组内按量实例个数为3,竞价实例为1个ecs.n1.tiny规格实例,OnDemandBaseCapacity = 5,OnDemandPercentageAboveBaseCapacity = 40,SpotInstancePools = 2,伸缩组实例规格配置为:ecs.n1.tiny, ecs.n1.small,ecs.n1.medium(价格依此上升)。

扩容数量 按量实例分配状况 竞价实例分配状况
0 3 1(tiny)
1 4 1(tiny)
2 5 1(tiny)
3 6 1(tiny)
4 7 1(tiny)
5 7 1(tiny)1(small)
6 7 2(tiny)1(small)
7 8 2(tiny)1(small)
8 8 2(tiny)2(small)

缩容策略

成本优化混合实例伸缩组的释放策略不遵循伸缩组上指定的释放策略,为了保持实例伸缩组内实例的混合配比,将采用如下描述的实例释放策略。首先,将根据伸缩组实例混合策略,肯定将要释放的按量实例与竞价实例的个数,咱们将在保证足够数量的实例被释放的前提下,按照伸缩组总体趋近指望配比的方式肯定释放按量实例和竞价实例的个数。当按量实例个数不足时,将释放更多的竞价实例;当竞价实例个数不足时,将改成释放按量实例。

  • 按量实例缩容策略

释放按量实例时,将按照如下条件选择可释放的实例:

  1. 优先释放价格高的实例;
  2. 价格相同时,按照伸缩组指定的释放策略选取合适数量的实例进行释放。
  • 竞价实例缩容策略

释放竞价实例时,将按照如下条件选择可释放的实例:

  1. 将首先释放不属于spotInstancePools中规格类型的实例,这部分实例的释放策略与上述按量实例的缩容策略相同;
  2. 若是还须要释放规格类型属于spotInstancePools的实例,将进一步选择释放所须要的实例,选择方式以下:

    1. 选择释放的实例将使得剩余实例的实例规格在spotInstancePools中趋于均衡分布;
    2. 相同规格的多个实例可供选择时,将按照伸缩组指定的释放策略选择释放的实例。

下面,一样咱们经过简单的示例来描述成本优化混合实例伸缩组在缩容时的实例选择过程:

假设伸缩组组内按量实例个数为8,竞价实例为2个ecs.n1.tiny规格实例,2个ecs.n1.small规格实例,OnDemandBaseCapacity = 5,OnDemandPercentageAboveBaseCapacity = 40,SpotInstancePools = 2,伸缩组实例规格配置为:ecs.n1.tiny, ecs.n1.small,ecs.n1.medium(价格依此上升)。

缩容数量 按量实例分配状况 竞价实例分配状况
0 8 2(tiny)2(small)
1 8 2(tiny)1(small)
2 7 2(tiny)1(small)
3 7 1(tiny)1(small)
4 7 1(tiny)
5 6 1(tiny)
6 6 0
7 5 0
8 4 0

竞价实例补偿

竞价实例在系统回收以前五分钟左右将会发送系统回收消息,当您开启竞价实例主动替换功能以后,在系统发送竞价实例的回收消息以后,弹性伸缩将会为该竞价实例建立补偿任务,并在稍后经过建立新的竞价实例来替换即将释放的实例。咱们将这一主动替换即将被回收的竞价实例的行为称为竞价实例补偿

竞价实例补偿是保障业务连续性的辅助保障机制,该补偿机制具备如下特色,你须要对这些特色有充分的认识,以便您配置合理的成本优化伸缩组。

  1. 竞价实例补偿的时间窗口。在收到竞价实例系统回收消息后,将为对应的实例生成补偿任务,大约五分钟时间后实例将被回收,当实例被回收后,伸缩组内的对应实例将被健康检查机制清除伸缩组(大约6分钟)。竞价实例补偿任务的有效期为:补偿任务生成到健康检查将实例移除伸缩组之间。一旦错过补偿时间窗口,对应的补偿任务将会失效和清理,意味着对应实例错过补偿期。
  2. 有限的补偿能力。一次竞价实例的补偿过程分为新实例启动和旧实例释放两个过程,补偿任务执行过程当中,伸缩组将处于锁定状态。因为暂时伸缩组不支持并行伸缩活动处理,所以,在有限的补偿时间窗口内,可以进行的补偿任务次数和实例数是有限的。因为竞价实例回收一般是呈现批次状,所以,为了最大程度利用有限的补偿能力,咱们将对补偿任务进行必定程度的聚合以后,按批次进行下发,最大程度的补偿更多的实例。

最佳实践

这里咱们主要展现如何使用java SDK建立伸缩规则,并采用maven进行依赖管理。建立目标追踪伸缩规则,须要使用aliyun-java-sdk-ess 2.3.1及以上版本。

程序所需的maven依赖以下:

<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.0.8</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ess</artifactId>
            <version>2.3.1</version>
        </dependency>

建立混合实例的成本优化伸缩组:

CreateScalingGroupRequest request = new CreateScalingGroupRequest();
request.setScalingGroupName(name);
request.setMinSize(0);
request.setMaxSize(100);
request.setVSwitchId(vsId);
request.setMultiAZPolicy("COST_OPTIMIZED");
request.setOnDemandBaseCapacity(onDemandBaseCapacity);
request.setOnDemandPercentageAboveBaseCapacity(onDemandPercentageAboveBaseCapacity);
request.setSpotInstanceRemedy(spotInstanceRemedy);
request.setSpotInstancePools(spotInstancePools);
CreateScalingGroupResponse response = client.getAcsResponse(request);


原文连接 本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索