智能運維在百度日常業務監控中的探索
原創隨著互聯網產品規模的爆發式增長,大型分布式系統的監控復雜性也日益顯現。工程師們發現:監控遺漏導致宕機的黑天鵝現象頻繁發生;出現故障時很難從海量監控指標中迅速找到故障根因;報警風暴極大地干擾了工程師定位問題的速度;故障恢復速度基本依賴于工程師的操作速度。由此,我們嘗試建立一個智能運維監控系統,希望用智能化的手段去幫助工程師解決這些問題。
一、嘉賓介紹
曲顯平 百度運維部資深研發工程師
百度智能運維監控負責人,在運維監控、大數據處理與分析方向有著豐富的經驗。
二、百度數據情況
隨著百度各產品的蓬勃發展,百度的服務器數量也呈現出爆發式增長,最近5年增長了大概20倍的規模。與產品規模不斷增長相對應地,運維人員每天會收到越來越多的監控報警,面對海量的運維指標,如何快速定位問題所發生的業務層面,達到精準化報警、快速解決問題的目標就成為運維監控常態化的需求。
百度監控系統數據規模,單以時間序列數據為例,不包含日志類數據。
- 服務器指標數量:>1億
- 業務指標數量:>8千萬
- 數據增長速度:50TB/日
三、運維中面臨的監控問題
當前,面對復雜的業務監控和問題診斷,運維人員想找到指標和事件之間的關聯關系,進行因果關系推導,并最終定位故障,基本依靠人的經驗來進行。但隨著業務和監控規模的膨脹,運維也希望能夠更加自動化、智能化地達成保證服務高可用性的目標,即快速的問題發現、分析定位或止損。
下面,我們可以從發現問題—分析問題—解決問題的思路出發,逐步給出遞進的解決方案。
四、發現問題篇:異常自動檢測
日常運維的業務指標數據會出現一些環比昨日的明顯異常、持續偏離的明顯問題和隨著時間周期漂移的指標數據等問題,以前這些監控的配置基本靠工程師經驗或持續的迭代修正,甚至純人工排查。隨著監控系統的發展,可以通過制定監控標準和自動化監控部署實現運維的標準化和自動化,最終的目標,是希望用智能化的方法徹底解決這個問題。
一般,在系統出現指標數據波動時,需要先判定是否確實為異常情況,確定異常后再實現精準報警。那么,怎么自動檢測業務的異常指標,幫助運維工程師和開發工程師處理問題呢?
這里主要有兩個策略,自動恒定閾值設定與動態閾值設定:
1.恒定閾值設定法
對于普通數據,運維人員在服務器端設定服務器應用指標超過某合理數值自動報警,并對服務器異常的波動狀態進行報警。這個可使用一些標準的統計學方法去自動計算這個閾值,取代人工配置成本。
參考方式:
- 基于歷史數據統計
- 假設正態分布
- 3-sigma策略
2.動態閾值設定法
百度大多數業務數據的流量呈現很強的天周期特性,在某時刻出現數據波峰的驟降或波谷數據的驟增等變動情況時,恒定閾值法很難解決這類問題的精準異常判斷。那么我們可以把上述方法衍變升級一下,采用動態時間窗口的閾值設定法來解決周期性數據的異常判斷。
參考方式:
- 多分布形式:將數據分段
- 按天同期計算統計閾值
- 分段3-sigma策略
#p#
3.恒定閾值和動態閾值的使用
針對以上兩種閾值劃分方式,異常檢測系統如何知道應該對每組數據進行什么樣的異常檢測策略呢?這就需要一種方法提前對數據進行分類,可以采用一種可判斷數據是否具有周期性趨勢的分類器方式來解決。如果數據具有很強的周期性特征,建議使用動態閾值設定法;如果數據分析后沒有周期性特征,那么使用恒定閾值就可以了。
另外,我們還會遇到這種特殊的情況,數據會隨時間出現漂移。比如某產品流量,會按照工作日、周末、傳統長假等時間呈現出不同的數據特征,產生階段性變化。這個時候要進行異常檢測,就不僅要考慮數據的普通周期性,還要考慮季節性和趨勢性的變化。監控系統可通過對日常數據進行分析,采用三次指數平滑等方法,對數據本身的趨勢性進行學習。
當然,上述方法都是基于從歷史數據進行學習分析從而進行異常檢測的,如果缺少歷史數據,那么對于這些指標,基于歷史數據進行同環比分析的意義就不大,核心就轉化為檢測數據有沒有突升和突降異常。可采用類似于局部平滑的方法查看真實數據與局部平滑后數據有沒有大的出入,如果差距較大,可判斷為有大的突升和突降,可以標識數據異常。
參考方式:
- 局部平滑法
- 速度法
經過經驗的積累,對于核心產品的流量變動,即使波動不大,監控系統也可以做到靈敏且精準的指標監控,能夠快速發現異常情況。當然,全自動的異常檢測系統難免會出現誤報、漏報等情況,這就要求異常檢測系統需要支持工程師的標注與反饋,百度監控系統的自學習能力可以根據工程師的需求進行動態調整,可同時支持人為調整和系統自動參數學習調整,系統可自動根據工程師的標注或報警量的多少,進行參數訓練,把異常檢測參數調整到合理的范圍。
工程師標注
- 修改參數
- 標記未檢測到的異常
- 標記錯誤的報警
機器學習
- 標注報警 => 參數訓練
綜合上述方法,百度智能監控系統中的自動異常檢測最終形成兩種狀態的結合:離線狀態和在線狀態,離線部分可根據歷史數據進行分類學習、參數訓練,而在線部分能夠進行最終的異常檢測和報警。
具體的組成如圖所示:
五、發現問題篇:精準報警
監控系統僅僅發現了問題還不夠,由于指標數量太過繁雜,為了起到輔助工程師快速解決問題的效果,還需要做到精準化報警。百度的精準報警主要分成兩個層面,一個是單個指標的報警是否足夠精準;這里需要考慮兩個問題,一是是否每次異常都應該報警?需要容忍系統毛刺的存在;二是異常過濾,把離散的異常點轉化為異常事件或狀態,找到指標和事件的關聯關系。
在單一指標的報警足夠精準的基礎上,另一個是把不同指標的報警結合起來做到足夠精準。如何把多個指標的報警綜合起來呢?簡單策略是固定時間窗口來報警,時間相近的報警可進行一定的合并,只要將首先出現的指標報警送達給到運維人員即可。從整個監控策略來看,把報警綜合起來,同類的報警進行合并來報給運維人員。復雜一些的策略是關聯挖掘,把歷史上產生的運維報警和事件關聯起來報警,同時,某些報警經常頻繁地一起出現,可以認為這是同一個報警,不再單獨分別進行報警。
采用的具體策略有:
1. 報警合并簡單策略
- 固定時間窗口
- 相同監控策略
- 相同監控對象
2. 報警合并復雜策略
- 關聯挖掘
- 合并置信度較高的頻繁項集
3. 報警依賴
- 策略依賴
- 異常依賴
六、分析問題篇:關聯分析
監控系統不僅需要幫助工程師發現問題,同時還需要通過建立關聯分析,進行輔助問題定位,甚至迅速找到相關的指標或影響。那么,如何為復雜多樣的運維數據建立關聯呢?
產品服務層級的關聯關系圖:
運維工程師可以把一些基礎的關聯關系配置到監控系統中,可以讓監控系統明白一些常態化的運維指標與其它指標是否存在關聯,比如多個模塊的異常是否存在關聯、服務器升級或者部署產生問題是否與數據中心或交換機異常有關等。
具體的實現策略有:
1.關聯挖掘
(1)事件和事件間的關聯
- 頻繁項集挖掘
- 所有運維事件
(2)事件和時序間的關聯
- 指標異常經常與部署升級事件相伴發生
- 問題診斷&故障定位
(3)多時序間的關聯
#p#
2.關聯可視化
通過關聯變動,幫助運維人員分析重點數據的變動情況。
(1)事件&事件關聯
(2)事件&時序關聯
3.服務透視定位問題
運維事件多是與時間持續緊密關聯,我們可以把運維事件按照時間軸演進順序進行展示。同時,運維工程師常常接觸的服務拓撲,本身也是一種運維模塊的關聯關系。把這些離散的運維數據通過模塊關聯、時間關聯、數據流關聯等緊密地聯系起來,構成一個完整的服務透視圖,如果異常發生在關系透視圖中的某個部分,就可以按照周邊關系的通路來快速定位問題。
(1)模塊調用關系
(2)事件和模塊關聯
六、分析問題篇:故障定位
僅僅找到關聯還不夠,真正分析業務問題解決問題才是關鍵。這里介紹兩個常用的輔助定位問題策略。
1.多維數據分析
監控系統采集到的很多指標具備包含關系,很多情況下,一個總體指標是由許多子指標加和構成的,或者也可以說成是總體維度是由許多子維度組成的。監控系統可以計算出每個子指標或子維度占總指標總維度的百分比,并按照影響權重去進行分析,當某個子指標的變化幅度對總體指標影響權重***,我們就傾向于認為這個指標可能是問題的原因。
舉個例子,百度的總體流量指標對應每個地域的流量之和,總體流量有問題有可能是某個地域流量出現問題,找到目前對總體流量變化影響***的地域進行問題處理就可以解決問題。同樣的道理也可以推廣到其它情況。
2.故障診斷樹
運維人員可以通過數據可視化(熱力圖、多維報表)的形式,結合以前發現問題的經驗沉淀模式,發現指標間的強相關,做出問題診斷。那我們是不是可以將運維人員的經驗固化到監控系統中,通過不同指標的分析方向和下探方法可以形成樹狀結構,通過樹上的某個節點進行逐級探查。最終形成故障診斷樹,通過推導路徑不僅可以幫助運維人員快速完成問題出現時的排查過程,節省這部分的定位時間,也很有可能達到直接定位問題或加速解決故障的目的。
故障檢測:
(1)領域專家知識
(2)邏輯推導引擎
(3)迅速找到問題根因
七、解決問題篇
- 監控系統產生決策
- 部署調度系統執行
1.單邊故障自動止損
單邊故障指單個IDC故障、單個鏈路故障等。比如一個IDC或者某些IDC出現問題,解決辦法是切走這部分流量,利用監控系統來做動態的部署調度。通過某個數據中心或鏈路的部署調整,幫助系統快速恢復,進而實現自動化決策和執行來實現單邊故障止損。
具體策略有:
(1)實現自動冗余與調度
(2)智能監控系統負責動態決策
(3)部署調度系統負責調度執行
2.灰度發布自動止損
研發工程師做灰度發布時,可以先做小流量的發布,部署系統可以跟監控系統配合,如果出現問題,直接進行狀態終止或回滾,把問題控制在灰度發布范圍內。
八、智能運維監控總結
通過上述說明,百度的智能運維監控系統最終形成了一個監控閉環,包含問題發現、分析決策和問題的解決。具體的組成包括異常檢測、報警收斂、關聯分析、故障定位和自動處理五部分內容。
九、未來運維變被動為主動
1.全方位覆蓋
在用戶端(APP、瀏覽器等)、云端(機房、服務器、自身服務、第三方服務等)、管道(鏈路、運營商)等任何維度進行數據采集并進行異常自動檢測。
2. 讓監控更聰明
- 分析運用已有數據,并把服務狀態、問題影響分析等可視化
- 自動學習并理解故障的趨勢和模式
- 自動發現服務或依賴環境的變更
當然,更進一步地,監控系統是不是可以先于故障發生而預測到故障,在故障發生之前就可以處理并解決故障,從而達成產品的超高可用性目標。未來的智能監控應該是這樣的,運維工程師經過完善的監控部署,實現全方位的異常自動檢測覆蓋,同時,在系統剛出現故障征兆,有損之前就進行處理并解決,實現完整的智能化監控系統解決方案。
歡迎所有對智能化運維技術感興趣的同學加入百度運維部,一起推動智能化運維的發展。
歡迎訪問百度運維部博客:http://op.baidu.com