摘要: AutoScaling 伸縮組實例管理功能全面升級,新上線生命週期掛鉤(LifecycleHook)功能,方便用戶更加靈活地管理伸縮組內實例。使用生命週期掛鉤能夠在伸縮組發生伸縮活動時將伸縮活動掛起,執行自定義操做。後端
使用 LifecycleHook 功能,能夠更加靈活地管理控制伸縮組內 ECS 實例的生命週期,靈活地控制伸縮組內實例的建立和移出過程。當伸縮組發生伸縮活動,觸發生命週期掛鉤時,伸縮活動將被掛起,結束當前被掛起的伸縮活動有兩種方式:服務器
本文將系統地介紹生命週期掛鉤功能的使用方式和使用場景,並給出生命週期掛鉤功能的最佳實踐。併發
LifecycleHook 介紹負載均衡
LifecycleHook 使用場景測試
使用 LifecycleHook,能夠在伸縮組發生伸縮活動時將正在擴張或即將釋放的 ECS 實例掛起,執行用戶自定義操做,能夠更加靈活地管理 ECS 實例在伸縮組內的生命週期。幾個簡單的 LifecycleHook 應用場景:3d
針對上述第二種場景,若是能夠肯定每一個請求的最長處理時間,能夠調用 建立生命週期掛鉤 接口建立生命週期掛鉤,設置 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,對於彈性擴張伸縮活動,執行方向解釋以下:
結束 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,對於彈性收縮伸縮活動,執行方向解釋以下:
結束 LifecycleHook 掛起狀態之後,彈性伸縮服務會將 ECS 實例先從 RDS 白名單移除(若是伸縮組配置了 RDS),再將 ECS 實例中止(若是 ECS 實例是伸縮組彈出來的不是手動添加的),而後釋放實例(若是 ECS 實例是伸縮組彈出來的不是手動添加的),並將實例從伸縮組中移出。
LifecycleHook 通知方式
若是生命週期掛鉤配置了通知對象,那麼當伸縮組發生伸縮活動觸發 LifecycleHook 時,通知對象將接收到當前的伸縮活動詳細信息,若是生命週期掛鉤沒有配置通知對象,那麼當伸縮組發生伸縮活動觸發 LifecycleHook 時不會發出任何通知信息。
生命週期掛鉤目前支持如下兩種通知方式:
關於 MNS 主題和隊列的介紹,您能夠參考 隊列使用幫助、主題使用幫助 來了解主題、隊列的建立,消息的接收方式,以及如何爲主題設置訂閱等。
須要注意的是,MNS 消息服務會收取相應的費用,具體的收費標準可參考 雲產品訂價#消息服務 進行詳細瞭解。
LifecycleHook 通知內容
當伸縮組發生伸縮活動觸發 LifecycleHook 時,若是生命週期掛鉤配置了通知對象(目前只支持通知到 MNS),那麼通知對象將收到關於這次伸縮活動的詳細信息,通知內容以下:
上述內容中:
content 生命週期掛鉤觸發的伸縮活動詳細信息
defaultResult 生命週期掛鉤默認執行策略
lifecycleTransition 生命週期掛鉤適用的伸縮活動類型,取值範圍:
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 實例生命週期的能力,經過該功能能夠在伸縮組發生彈性擴張和彈性收縮活動時,經過將伸縮活動掛起的方式執行自定義操做。
彈性伸縮服務正在快速地發展,後續會有更多的新功能新特性推出,感謝您的一路陪伴。