百度智能監控系統的過載保護實踐

640?wx_fmt=gif

作者簡介

姜澤    百度高級運維工程師

640?wx_fmt=png

負責百度智能運維產品(Noah)的運維工作,在可用性建設,容量管理方面有着豐富的實踐經驗。


乾貨概覽

對於容量管理,在之前的文章《聊聊時序數據存儲系統的容量管理》中,我們已經對容量建模和容量規劃做了探討。本文將繼續跟大家介紹容量管理中最爲重要的一環——過載保護部分的內容。

在高併發、海量數據存儲場景下,系統過載的案例並不少見。一旦系統過載,通常無法使用常用的雙集羣主備切換預案立即止損,同時,集羣過載很有可能產生流量雪崩現象,造成實例、機器批量假死或宕機,恢復成本巨大。所以我們需要通過一定的過載保護手段,保證系統在容量承載能力下最大限度的爲用戶提供服務。下面將給出系統過載保護的通用方案,以及在Noah平臺智能監控系統的流式計算-時序數據存儲(下文以Astream-TSDB指代)中的應用實踐。

過載保護的通用解決方案

1識別過載流量來源

過載流量來源通常意義上可以分爲自然流量上漲人爲觸發的流量上漲。自然流量上漲指的是由於業務量增長帶來的可預期的系統流量。這類流量過載可以通過系統的彈性擴縮容解決,並且可以通過更科學的、更合理的容量規劃得以規避。人爲觸發的流量來源可以細分爲攻擊性流量(比如DDOS攻擊)和用戶行爲導致的非預期流量。無論哪一種流量來源,在後臺都應該可以通過運維數據找到來源IP。在實際生產場景下,不同的業務都應該有自己定義好的業務數據模型,比如在Noah監控中,每個請求都必須帶有自己的產品線(Product)、集羣(Cluster)、服務單元(Namespace)等信息。這些數據爲識別流量來源提供重要依據,同時也是做多租戶配額管理的基礎。

2設置流量閾值

根據上一篇文章中的容量建模方法,可以合理的根據容量數據給出實例/系統的流量閾值。容量閾值的管理可以放在配置中心以方便隨時調整。

3採取合理的過載保護措施

過載保護的手段通常有限流和降級兩種。限流指系統只允許閾值之下的流量通過,而對於超出閾值的流量不額外消耗資源處理,直接丟棄。降級指系統通過“業務剪枝”的手段,丟棄非重要功能或非重要流量來源的處理,保證核心功能不受影響、核心流量穩定處理。

從過載保護策略生效層級上來說,又可分爲單實例級別和全局級別。單實例級別的過載保護策略只在單機單實例上做過載保護,其流量數據統計通常受負載均衡和流量局部波動的影響較大,不利於微小異常的過濾;相比之下,全局策略對此類情況處理起來更有優勢,但全局策略勢必會帶來額外的開銷和系統設計難度,具體使用哪一種,需要結合業務的實際情況具體問題具體分析。

Astream-TSDB場景下過載保護實踐

1過載場景描述

640?wx_fmt=png

在Noah平臺的智能監控系統中,用戶可以以自定義監控配置的方式驅動客戶端做監控採集。自定義監控配置的方式比較靈活,甚至支持以正則匹配的方式採集多維度數據,這時如果用戶對正則匹配不夠熟悉,或者濫用例如*這樣的通配符,很容易匹配遠超預期的維度數值,從而導致客戶端發送下游的數據量翻倍,直接造成後端Astream-TSDB壓力突增,影響後端服務的可用性。在這種場景下,由於無法提前預知用戶提交的配置會產生多少數據點,直接在採集端做流量控制也具有一定難度。

2過載保護機制實現

  客戶端限流  

客戶端的主要功能是根據用戶配置的監控配置做本地採集,再將數據發送到下游計算存儲。在客戶端我們實現了遠程限流配置控制開關。採集客戶端會根據遠程配置中的週期和閾值,在本地週期性的統計數據維度信息,統計的粒度從大到小,可以是集羣級別(Cluster)、服務單元級別(Namespace),甚至可以精確到單個監控指標(Metric)。若統計到的維度組合數目超過了配置中的閾值數目,則這些“超額”的數據拒絕發往下游模塊,並在採集監控項中吐出超限的監控提示用戶。客戶端限流可以從源頭最大程度切斷下游模塊過載的流量來源。由於在分佈式系統中,各個採集任務落在不同的客戶端上,每一個客戶端都只能統計本機上的數據,各個客戶端不過載並不能保證全局的不過載,所以單純的用單機單實例限流的方式無法解決所有過載問題。

  服務端限流  

客戶端的數據按服務單元名做一致性哈希計算發往服務端,在服務端表現爲相同服務單元的數據落在某幾個實例上。我們在存儲服務端的單機層級也針對服務單元維度做了限流策略。雖然存儲端能將入口流量限制住,但對於計算集羣來說這部分流量還在重試範圍內,在計算端還是有打垮計算集羣模塊的風險。所以,存儲端在發現維度超限的情況後,會返回給計算集羣一個特殊的返回碼,上游計算集羣收到返回碼後將這部分流量不再重試,直接丟棄。這樣就防止了上游計算集羣的重試機制造成自身發送隊列堵塞,同時避免流量翻倍打垮下游存儲。同客戶端一樣,這也無法解決全局的流量過載問題。

  雲堤全侷限流  

640?wx_fmt=png

爲了避免單機限流的方案的不足帶來的過載風險,我們針對Astream-TSDB的過載保護開發了雲堤全侷限流系統,整個監控的計算存儲後端整體作爲一個APP 接入雲堤,實現全局計數和配額限流。它的主要思想是在計算存儲後端模塊的入口進行流量全局統計,在模塊級別根據統計結果進行限流,達到模塊級過載保護的效果。同時,將統計結果定期反饋到採集客戶端,使得流量可以從最前端的入口進行限制,達到入口限流的效果。

雲堤的運行流程如下:

  1. 在計算端入口 Astream-adaptor以及存儲端入口 Saver上集成雲堤SDK,入口模塊每次收到數據時,調用雲堤SDK上報該數據在Namespace和User維度的原始數據點數增量

  2. 雲堤 SDK 返回上一個輪詢週期統計到的Namespace和User維度的全局配額餘量

  3. 入口模塊根據雲堤 SDK 返回的餘量判斷該Namespace和User的原始數據點是否超限,並決策是否拒絕當前流量

  4. 在客戶端上,雲堤提供當前統計結果中超限對象和超限指標的列表查詢接口。由Checker模塊負責輪詢超限列表,並根據列表生成採集端限流配置,並同步到配置分發模塊。    


總  結

以上是我在容量過載保護方面的一些粗淺經驗和落地實踐,如有不足之處,還請大家多提意見。

閱讀推薦

  運維實踐


智能運維架構 | 架構集成 | 網絡判障 | 監控數據採集 | 監控報警 | 網絡異常 | 分佈式監控系統 | 數據可視化 | 單機房故障自愈 | TSDB數據存儲 | 異常檢測 | 流量異常檢測 | 複雜異常檢測 | 報警風暴 | 實時計算 | 故障診斷 | 日誌監控 | 網絡監控可視化 | HBase實踐 | 多維度數據 | 容量管理

  運維產品

百度雲BCM | 企業級運維平臺 | 基礎設施管理引擎 | 運維知識庫 | 通告平臺 | 百度名字服務 | 業務部署 | 數據配送 | 集羣控制系統 | 外網監控 | 內網監控 | 部署變更 | 配置管理 | 站點監控

  精品推薦

AIOps全解析 | AIOps中的四大金剛 | 智能運維 | AIOps時代 | 運維演進

640?wx_fmt=jpeg

640?wx_fmt=gif

↓↓ 點擊"閱讀原文" 【瞭解更多精彩內容】 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章