AutoScaling 生命週期掛鉤功能

摘要: AutoScaling 伸縮組實例管理功能全面升級,新上線生命週期掛鉤(LifecycleHook)功能,方便用戶更加靈活地管理伸縮組內實例。使用生命週期掛鉤能夠在伸縮組發生伸縮活動時將伸縮活動掛起,執行自定義操做。後端

使用 LifecycleHook 功能,能夠更加靈活地管理控制伸縮組內 ECS 實例的生命週期,靈活地控制伸縮組內實例的建立和移出過程。當伸縮組發生伸縮活動,觸發生命週期掛鉤時,伸縮活動將被掛起,結束當前被掛起的伸縮活動有兩種方式:服務器

  1. 等待生命週期活動超時
  2. 調用接口 CompleteLifecycleAction 主動結束生命週期活動

本文將系統地介紹生命週期掛鉤功能的使用方式和使用場景,並給出生命週期掛鉤功能的最佳實踐。併發

LifecycleHook 介紹負載均衡

LifecycleHook 使用場景測試

使用 LifecycleHook,能夠在伸縮組發生伸縮活動時將正在擴張或即將釋放的 ECS 實例掛起,執行用戶自定義操做,能夠更加靈活地管理 ECS 實例在伸縮組內的生命週期。幾個簡單的 LifecycleHook 應用場景:3d

  • 伸縮組彈出 ECS 實例後須要延遲一段時間(測試服務沒問題之後)掛載到 SLB ,而後對外提供服務
  • 伸縮組釋放 ECS 實例時須要先將實例從 SLB 後端服務移除(防止接收新的請求),待檢測已經接收到的請求處理完成,中止並釋放實例
  • 伸縮組釋放 ECS 實例時執行數據備份操做
  • 伸縮組彈性擴張或者收縮執行一些用戶自定義操做

針對上述第二種場景,若是能夠肯定每一個請求的最長處理時間,能夠調用 建立生命週期掛鉤 接口建立生命週期掛鉤,設置 LifecycleTransition 參數值爲 SCALE_IN,設置 HeartbeatTimeout 爲請求最長處理時間,不須要設置通知對象,當發生彈性收縮類型伸縮活動時,ECS 實例從 SLB 移除後會掛起一段時間(HeartbeatTimeout),等待請求處理完成。對象

LifecycleHook 工做方式blog

當伸縮組建立了 LifecycleHook,併發生 LifecycleHook 配置的伸縮活動類型(LifecycleTransition)時,那麼伸縮活動唄掛起,用戶能夠在伸縮活動掛起這段時間內執行自定義操做,一直到 LifecycleHook 超時(HeartbeatTimeout),或者經過調用 CompleteLifecycleAction 接口提早終止伸縮活動掛起。接口

對於彈性擴張(SCALE_OUT)伸縮活動:生命週期

ECS 實例先進入 Pending(加入中)狀態,當實例啓動成功,並添加到 RDS 白名單(若是伸縮組設置了 RDS)之後,觸發 LifecycleHook ,ECS 實例進入 Pending:Wait(加入中掛起)狀態。若是LifecycleHook 配置了通知對象(MNS),則發送通知內容到 MNS,用戶可經過 MNS控制檯 的方式來消費 MNS 主題或者隊列中的消息,也能夠經過 OpenAPI 的方式消費,具體可參考 ESS 事件通知#消息接收 章節。當用戶接收到 MNS 消息後能夠執行自定義操做,例如在 ECS 實例上安裝軟件、部署服務等,執行完自定義操做之後,用戶能夠經過 CompleteLifecycleAction 接口提早結束掛起的伸縮活動,也能夠等待 LifecycleHook 掛起超時。LifecycleHook 掛起結束後有兩個執行方向,CONTINUE or ABANDON,對於彈性擴張伸縮活動,執行方向解釋以下:

  • CONTINUE 繼續,ECS 實例將被投入伸縮組中使用
  • ABANDON 拒絕,伸縮活動回滾,ECS 實例將被釋放
  • 若是伸縮組配置了多個彈性擴張類型的 LifecycleHook,那麼發生彈性擴張伸縮活動時會觸發多個 LifecycleHook,伸縮活動最終的執行方向(CONTINUE or ABANDON)以最後一個結束的 LifecycleHook 執行方向爲準。

結束 LifecycleHook 掛起狀態之後,若是伸縮組配置了負載均衡(SLB),那麼將 ECS 實例掛載到 SLB 上之後,實例進入 Inservice(服務中)狀態,此時彈性擴張伸縮活動結束。

對於彈性收縮(SCALE_IN)伸縮活動:

ECS 實例先進入 Terminating(移出中)狀態,,將實例從 SLB 後端服務器移除之後(若是伸縮組配置了負載均衡(SLB)),觸發 LifecycleHook ,ECS 實例進入 Terminating:Wait(移出中掛起)狀態。若是 LifecycleHook 配置了通知對象(MNS),則發送通知內容到 MNS,用戶可經過 MNS控制檯 的方式來消費 MNS 主題或者隊列中的消息,也能夠經過 OpenAPI 的方式消費,具體可參考 ESS 事件通知#消息接收 章節。當用戶接收到 MNS 消息後能夠執行自定義操做,例如檢測 ECS 接收到的請求是否處理完成、中止接收服務等,執行完自定義操做之後,用戶能夠經過 CompleteLifecycleAction 接口提早結束掛起的伸縮活動,也能夠等待 LifecycleHook 掛起超時。LifecycleHook 掛起結束後有兩個執行方向,CONTINUE or ABANDON,對於彈性收縮伸縮活動,執行方向解釋以下:

  • CONTINUE 繼續,ECS 實例將從伸縮組中移出
  • ABANDON 拒絕,ECS 實例將從伸縮組中移出
  • 若是伸縮組配置了多個彈性收縮類型的 LifecycleHook,那麼發生彈性收縮活動時會觸發多個 LifecycleHook,若是某個 LifecycleHook 掛起結束執行結果爲 ABANDON,則其他掛起的 LifecycleHook 會被提早結束掉,ECS 實例從伸縮組中移出,若是某個 LifecycleHook 掛起結束執行結果爲 CONTINUE,則其他掛起的 LifecycleHook 繼續掛起,直到最後一個 LifecycleHook 掛起結束,伸縮活動恢復執行。

結束 LifecycleHook 掛起狀態之後,彈性伸縮服務會將 ECS 實例先從 RDS 白名單移除(若是伸縮組配置了 RDS),再將 ECS 實例中止(若是 ECS 實例是伸縮組彈出來的不是手動添加的),而後釋放實例(若是 ECS 實例是伸縮組彈出來的不是手動添加的),並將實例從伸縮組中移出。

LifecycleHook 通知方式

若是生命週期掛鉤配置了通知對象,那麼當伸縮組發生伸縮活動觸發 LifecycleHook 時,通知對象將接收到當前的伸縮活動詳細信息,若是生命週期掛鉤沒有配置通知對象,那麼當伸縮組發生伸縮活動觸發 LifecycleHook 時不會發出任何通知信息。

生命週期掛鉤目前支持如下兩種通知方式:

  • 消息服務(MNS)隊列(Queue)
  • 消息服務(MNS)主題(Topic)

關於 MNS 主題和隊列的介紹,您能夠參考 隊列使用幫助、主題使用幫助 來了解主題、隊列的建立,消息的接收方式,以及如何爲主題設置訂閱等。
須要注意的是,MNS 消息服務會收取相應的費用,具體的收費標準可參考 雲產品訂價#消息服務 進行詳細瞭解。

LifecycleHook 通知內容

當伸縮組發生伸縮活動觸發 LifecycleHook 時,若是生命週期掛鉤配置了通知對象(目前只支持通知到 MNS),那麼通知對象將收到關於這次伸縮活動的詳細信息,通知內容以下:

上述內容中:

  • resourceArn 伸縮組惟一標識符,包括了伸縮組所在的 Region 信息,所屬的用戶 ID 信息,以及伸縮組 ID 信息。
  • content 生命週期掛鉤觸發的伸縮活動詳細信息

    • defaultResult 生命週期掛鉤默認執行策略

      • CONTINUE 繼續
      • ABANDON 拒絕
    • instanceIds 生命週期掛鉤掛起的 ECS 實例ID
    • lifecycleActionToken 生命週期掛鉤惟一標識符,經過獲取該參數與 lifecycleHookId 參數,可經過調用 CompleteLifecycleAction 主動結束生命週期活動
    • lifecycleHookId 生命週期掛鉤 ID
    • lifecycleHookName 生命週期掛鉤名稱
    • lifecycleTransition 生命週期掛鉤適用的伸縮活動類型,取值範圍:

      • SCALE_OUT:伸縮組彈性擴張活動
      • SCALE_IN:伸縮組彈性收縮活動
    • notificationMetadata 生命週期掛鉤通知標識
    • scalingActivityId 伸縮活動 ID
    • scalingGroupId 伸縮組ID
    • scalingGroupName 伸縮組名稱
    • scalingRuleId 觸發伸縮活動的伸縮規則名稱(此參數不是必帶)
    • scheduledTaskId 定時任務ID(只有伸縮活動是由定時任務觸發的時候纔會有此參數)

MNS 隊列或主題內容的消費方式,推薦參考 MNS 官方給出的 長輪訓最佳實踐 文檔,使用長輪詢的方式來消費隊列或主題收到的消息內容。

最佳實踐

建立 LifecycleHook 通知對象

在建立 LifecycleHook 時,能夠配置通知對象,也能夠不配置通知對象,若是須要配置通知對象,須要先建立好通知對象,再建立 LifecycleHook。關於通知對象(MNS 主題、隊列)的建立方式,能夠參考 ESS 事件通知#建立 MNS 隊列 章節 和 ESS 事件通知#建立 MNS 主題 章節。

建立 LifecycleHook

LifecycleHook 的建立,能夠經過 ESS控制檯 完成,也能夠經過調用 CreateLifecycleHook 接口完成。經過接口建立 LifecycleHook,可基於 CreateLifecycleHook 文檔,參考 ESS 事件通知#建立事件通知(OpenAPI) 章節實現。經過 ESS控制檯 建立 LifecycleHook 過程以下:

登陸 ESS控制檯,進入生命週期掛鉤列表頁,點擊建立生命週期掛鉤按鈕,彈出建立界面以下圖所示:

按提示名稱,通知標識,選擇伸縮活動類型、執行策略和通知方式,點擊肯定,以下圖所示:

上圖中,建立了兩個 LifecycleHook,一個伸縮活動擴張類型的 LifecycleHook,一個伸縮活動收縮類型的 LifecycleHook。

觸發 LifecycleHook

本章以觸發彈性收縮活動爲例,展現 LifecycleHook 工做過程。觸發伸縮活動的方式,可參考 ESS 事件通知#建立事件通知(OpenAPI) 章節完成。

首先觸發減小1臺實例的伸縮活動,以下圖所示:

查看伸縮組 ECS 實例列表頁,以下圖所示:

從上圖看出,此時有一臺 ECS 實例處於掛起狀態,因爲彈性收縮類型的 LifecycleHook 設置了通知對象,能夠登陸 MNS控制檯 查看通知結果,消息查看方式可參考 ESS 事件通知#MNS 隊列消息接收) 章節。

接收到 LifecycleHook 發送的通知內容之後,提取 lifecycleActionToken 、lifecycleHookId 參數,而後經過調用 CompleteLifecycleAction 接口提早結束 LifecycleHook 掛起狀態,調用方式以下:

使用上述代碼中,需補充我的 AK 信息,以及 LifecycleActionToken 和 LifecycleHookId 參數。

LifecycleHook 掛起狀態結束之後,ECS 實例被中止(伸縮組建立的實例),而後釋放(伸縮組建立的實例)並移出伸縮組。

須要注意,若是 LifecycleHook 配置的通知對象被刪除,那麼當前的 LifecycleHook 將再也不生效。若是伸縮活動觸發 LifecycleHook 被掛起,想要延長伸縮活動被掛起的時間,能夠經過調用 RecordLifecycleActionHeartbeat 延長掛起時間。

寫在最後

AutoScaling 生命週期掛鉤功能提供了更加靈活地管理伸縮組內 ECS 實例生命週期的能力,經過該功能能夠在伸縮組發生彈性擴張和彈性收縮活動時,經過將伸縮活動掛起的方式執行自定義操做。

彈性伸縮服務正在快速地發展,後續會有更多的新功能新特性推出,感謝您的一路陪伴。

原文連接

相關文章
相關標籤/搜索