AutoScaling 成本優化模式升級--混合實例策略

伸縮組成本優化模式以成本爲目標,始終建立最低價的實例,同時,經過多可用區,多實例規格分佈,以此來提升服務穩定性。可是,對於成本優點最大化的競價實例,伸縮組難以防範競價實例大範圍回收可能致使的服務雪崩,本次升級容許用戶制定更詳細的成本控制策略,在成本和穩定性之間進行調整和權衡。java

成本優化模式簡介

當您的伸縮配置選擇了多實例規格,並想以最低的價格來使用同等規模的 ECS 實例配置時,您能夠選擇使用 成本優化策略 的伸縮組,來下降您的 ECS 實例使用成本;當您的伸縮配置選擇的實例爲搶佔式實例時,您可能會遇到因爲價格、庫存等緣由致使搶佔式實例建立失敗場景,從而致使擴容不及時,影響到業務,您也能夠選擇使用 成本優化策略 的伸縮組,在搶佔式實例建立失敗的時候自動爲您嘗試建立同規格的按量實例,來保證業務的穩定性。maven

從上述的描述,咱們能夠清晰的看到,成本優化模式的核心策略:優化

  1. 建立實例時,以單核cpu價格價格最低來選擇建立實例的 InstanceType(實例規格),ZoneId(可用區)等配置信息。
  2. 競價實例建立失敗時,調整爲建立按量實例,以保證業務連續性。

咱們將上述的策略稱爲最低價策略(LowestPrice)。url

關於成本優化模式更詳細的信息,請查看 AutoScaling 推出成本優化模式code

成本優化模式升級

成本優化模式的升級策略主要針對競價實例回收機制可能帶來的業務雪崩狀況。主要集中在如下兩點:接口

  1. 混合實例配比。容許用戶爲成本優化伸縮組制定按量實例與競價實例的混合策略。
  2. 競價實例主動替換。在競價實例釋放前建立新實例,主動替換掉當前的競價實例。

在下面的文章中,咱們將原成本優化伸縮組稱爲普通成本優化伸縮組,將指定實例混合策略的成本優化伸縮組稱爲成本優化混合實例伸縮組。ci

參數詳解

  • OnDemandBaseCapacity

伸縮組所須要的按量實例的最小個數,當伸縮組中按量實例個數小於該值時,將優先建立按量實例。get

  • OnDemandPercentageAboveBaseCapacity

知足 OnDemandBaseCapacity 條件後,建立實例中按量實例所佔的比例。it

  • SpotInstancePools

SpotInstancePools 指定了最低價的多個實例規格,當建立競價實例時,將在 SpotInstancePools 中進行均衡分佈。io

  • SpotInstanceRemedy

是否開啓競價實例的補償機制。開啓後在競價實例被回收前5分鐘左右,將主動替換掉當前競價實例。

兼容性介紹

成本優化混合實例伸縮組與普通成本優化伸縮組在接口和功能方面是徹底兼容的。當您不指定混合實例策略的相關參數時,您將建立出普通成本優化伸縮組。同時,對於成本優化混合實例伸縮組,經過合理的制定混合實例策略,可以具備與普通成本優化伸縮組徹底相同的行爲。下面舉例說明:

  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);



本文做者:tongkn

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索