AutoScaling目標追蹤伸縮規則概述

tongkn發表於2019-02-20

彈性伸縮目標追蹤伸縮規則是彈性伸縮服務與雲監控深度結合的產物,定義了更加穩定,精準,快速的彈性伸縮策略,解決了當前伸縮組動態調整過程存在的一些難點和問題。

目標追蹤伸縮規則

目標追蹤伸縮規則是彈性伸縮服務提供的一種新型別的伸縮規則,目標追蹤伸縮規則擴充套件了彈性伸縮服務原有的伸縮規則。在本次擴充套件中,伸縮規則從原有的伸縮規則擴充套件為:簡單伸縮規則和目標追蹤伸縮規則。其中,簡單伸縮規則對應於原伸縮規則定義(本文中提到的簡單伸縮規則均指原伸縮規則定義的擴充套件方式);目標追蹤伸縮規則為全新型別的伸縮規則。

背景分析

彈性伸縮服務目前基於簡單伸縮規則與雲監控服務,為使用者提供了伸縮組動態調整的能力,即,使用者通過雲監控服務監控特定指標值,當滿足閾值條件時,則觸發指定的伸縮規則。基於簡單伸縮規則的動態調整策略為使用者帶來了極大的靈活性,同時節約了大量成本,使使用者真真實現了“按需使用”的目標。但是,該種方式下的動態調整策略仍存在以下問題:

  1. 定義模糊。對於大多數使用彈性伸縮動態調整策略的使用者來說,關心的核心問題在於是否達到目標監控指標期望值,而基於簡單伸縮規則的動態調整策略則將動態調整策略的定義拋給了使用者。
  2. 調整粒度固定。簡單伸縮規則定義了具體的擴縮容動作,其定義不感知監控指標的實際狀態,因此使用者只能夠根據經驗來設定一個固定的伸縮規則,其調整過程粒度無法實現動態調整。對於擴縮容過程,這意味著擴縮容過程的精度和效率無法協調。
  3. 調整過程缺乏控制。基於簡單報警規則的動態調整策略,僅僅是將如何調整和何時調整這兩個定義簡單組合起來,缺乏有效的控制手段。下面簡單介紹兩種主要的問題:

    1. 資料抖動。對於新加入伸縮組的例項,其監控資料在短時間內是不可獲得或不準確的,因此,例項的加入,將使得整體的監控資料發生較大的抖動,新加入的例項佔比越大,這種抖動帶來的影響也越大。在該階段,將可能導致報警事件的觸發不符合實際需要。
    2. 連續回撥。由於例項數變化帶來的監控指標變化通常不是同步的,當例項個數已經發生變化,但監控指標還未相應變化時,仍可能觸發報警事件,此時將再次觸發伸縮規則,導致響應了延遲資料觸發的擴縮容。
  4. 震盪問題。當使用者期望將監控指標值維持在某區間時,通常是針對同一指標值設定一條擴容規則和一條縮容規則,不合理的設定將可能導致伸縮組例項個數來回震盪。

目標追蹤伸縮規則與雲監控進行深度結合,重新定義了伸縮組動態調整過程。具體表現在以下幾點:

  1. 將如何擴容和何時擴容兩者定義整合到一起,將使用者關心的監控指標值暴露給使用者,使用者只需要關注監控指標的目標值。
  2. 快速、精準、動態的擴縮容。目標追蹤伸縮規則增加了對監控資料的感知能力,根據歷史的監控資料值和期望目標值計算出所需要的擴縮容例項數,使用盡量少的調整過程趨近監控指標目標值。
  3. 例項預熱。新例項加入伸縮組後,將首先進入例項預熱階段,在該階段,不會向雲監控上報其監控資料,也不作為擴縮容過程的基數例項。預熱階段能夠有效防止增加過多的例項。
  4. 動態穩定區間。根據伸縮組的歷史監控資料計算目標值穩定的區間。

支援的監控項

在使用目標追蹤伸縮規則時,對可選的監控指標有一定限制,指標需要能夠正確反映伸縮組內機器整體的繁忙程度,並且指標值需要滿足根據伸縮組內例項數量的變化而相應的增加或減少,滿足上述條件的監控指標適合應用於目標追蹤伸縮規則。例如:cpu平均使用率指標能夠有效的反映例項的繁忙程度,並且與例項的數量變化具有明顯的線性關係;相反,cpu平均負載則不能準確的反映例項的繁忙程度,當機器上存在大量io等待時,可能出現高負載低使用率的情況,這種情況下,通常不是機器過於繁忙,而應該考慮能否優化應用結構。

目前目標追蹤伸縮規則支援的監控指標如下:

指標名稱 指標描述
CpuUtilization cpu使用率
ClassicInternetRx 經典網路公網入流量
ClassicInternetTx 經典網路公網出流量
VpcInternetRx vpc網路公網入流量
VpcInternetTx vpc網路公網出流量
IntranetRx 內網入流量
IntranetTx 內網出流量

注意事項

  • 目標追蹤規則假設在指標值高於目標值時進行擴充套件操作,不支援在指標低於目標值時進行擴充套件操作。
  • 目標追蹤規則將為您建立2條雲監控報警規則,分別用於擴容過程和縮容過程,我們採用了相對激進的擴容策略和相對保守的縮容策略。伸縮組擴容報警規則取樣間隔為60s,連續3分鐘滿足閾值條件則進行擴容,縮容報警規則取樣間隔為60s,連續15分鐘滿足閾值條件則進行縮容。
  • 當計算得到的調整例項個數為小數時,對於擴容過程,採取向上取整;對於縮容過程,採取向下取整。例如,當需要增加例項個數為1.5時,實際將增加2個例項;當需要縮容的例項個數為-1.5時,實際將減少1個例項。
  • 當監控資料指標不足時,將不會觸發擴/縮容操作。
  • 當報警規則發生報警時,將觸發對應的擴縮容操作,彈性伸縮將根據監控指標的歷史資料計算擴縮容過程的例項個數。對於擴容過程,計算所得的擴容數量採取向上取整,避免擴容的機器不足;對於縮容過程,計算所得的擴容數量採取向下取整,避免釋放過多的例項數量。
  • 監控指標值可能與目標值存在較大的差距,這種情況通常發生在組內例項個數較少的情況下,此時,組內例項數量的變化,對伸縮組聚合指標值具有較大的影響。例如,您可能會遇到作用於縮容過程的報警規則一直處於報警狀態,卻沒有縮容活動發生的情況。這種情況主要是由於縮容過程計算得到的縮容例項數量少於一個,因此不會產生實際的伸縮活動。
  • 請勿編輯或刪除為目標追蹤伸縮規則建立的報警規則。任何修改都將導致拒絕執行對應的擴/縮容活動,當您刪除伸縮規則時,相應的報警規則會自動刪除。

禁用縮容

目標追蹤伸縮規則支援禁用縮容,通過指定disableScaleIn引數為true,便可禁用縮容過程,禁用縮容操作將不會建立或者刪除作用於縮容過程的報警規則。通過該功能,您可以使用其他方式控制伸縮組的縮容過程,例如,您可以通過報警規則監控其他指標,觸發一條簡單的伸縮規則用於縮容。

例項預熱

新的例項加入伸縮組之後,通常需要經歷業務部署,slb健康檢查,資料採集等過程,才能上報穩定的監控資料,不適合在此基礎上觸發新的伸縮活動。為了限制擴/縮容過程執行的頻率,我們通常建議對伸縮規則設定合適的冷卻時間,在冷卻期內,將拒絕執行伸縮規則。對於目標追蹤伸縮規則,我們引入了全新的例項預熱過程,下面我們將詳細介紹例項預熱過程。


注意:只有目標追蹤規則建立出來的例項才擁有例項預熱階段。

例項在預熱階段時具有以下行為:

  1. 例項將正常加入伸縮組,但是例項不會開始向雲監控上報資料,雲監控在聚合伸縮組維度監控指標時忽略預熱例項,不將預熱例項作為伸縮組內例項。
  2. 例項預熱結束後,將開始向雲監控上報資料,雲監控此時將其作為伸縮組內例項。
  3. 擴容過程中,預熱例項不會做為擴容基數。例如,當前組內例項數量為c,伸縮組觸發擴容活動,新增5個例項到伸縮組,預熱時間設定為300s,在例項預熱期間,再次觸發擴容活動,仍按照數量c作為擴容基數。假設本次需要擴容的例項數量為6,那麼實際上只需要再生產的例項數量為1,使得預熱例項數達到6個。這可確保新增的例項不會超出您的需要。
  4. 縮容過程中,對於縮容過程,將自動根據歷史執行情況,設定合適的冷卻時間,方式由於資料延遲引發的連續縮容事件導致例項過多釋放。

我們建議您根據實際的業務需要設定合適的例項預熱時間,這可幫助目標追蹤伸縮策略更高效,更準確的接近您所設定的目標值。

最佳實踐

使用SDK建立目標追蹤伸縮規則

這裡我們主要展示如何使用java SDK建立伸縮規則,並採用maven進行依賴管理。建立目標追蹤伸縮規則,需要使用aliyun-java-sdk-ess 2.2.9及以上版本。

程式所需的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-SNAPSHOT</version>
        </dependency>

建立目標追蹤伸縮規則

        CreateScalingRuleRequest request = new CreateScalingRuleRequest();
        request.setScalingGroupId(scalingGroupId);
        request.setScalingRuleType("TargetTrackingScalingRule");
        request.setTargetValue(targetValue);
        request.setMetricName(metricName);
        request.setDisableScaleIn(disableScaleIn);
        request.setEstimatedInstanceWarmup(estimateWarmupTime);
        CreateScalingRuleResponse response = client.getAcsResponse(request);

控制檯操作介紹

請參考 Auto Scaling 支援目標追蹤伸縮規則


相關文章