目前 IT 運維領域保證服務運行正常的主要方法是對相關運維指標進行實時監控,並根據經驗設定一些規則,經過將實時監控的數據與規則進行對比,當某個指標監控值不符合設定的規則時,則斷定爲異常的情況,這樣的話就會發送對應的告警到告警平臺。告警平臺收到通知後,會分配給對應的運維人員進行處理,運維人員去根據告警信息來排查,最終定位故障的根本緣由,並對故障進行修復。從這個流程能夠看出,整個過程是以告警爲中心,因此告警的質量是相當重要的。算法
但在實際運維過程當中,咱們能夠發現這個過程當中其實存在不少問題。首先,監控系統的規則難以設定。由於規則是基於專家經驗設定的,隨着系統規模變大,複雜度提升,監控覆蓋的完善,監控指標數量指數性增長,指標形態變幻無窮,基於專家經驗的規則設定力不從心,誤報率、漏報率居高不下。運維人員可能會遭遇告警風暴,天天被數千個告警轟炸,難以應付。故障發生後,對若干個告警逐一排查找故障根因,效率極低,大大增長故障的恢復時間。故障有可能沒法預知,有些原本能夠避免的故障仍是發生了。網絡
爲了解決上述問題,在智能運維領域,智能化告警的概念出現了。智能化告警主要解決 4 個問題:1、精準告警,拒絕告警風暴;2、快速故障定位;3、進行故障預測,避免故障發生;4、規則設置自動化,再也不經過人工經驗來設置規則。框架
智能異常檢測的核心理念是利用機器學習算法,對歷史數據的規律自動學習,從而實現規則設置自動化。這樣的話,就再也不須要人工設置大量的規則,絕大部分狀況下自動學習的規則會更加準確合理,大大提升告警產生的質量。運維
智能異常檢測的技術有指標異常檢測、日誌異常檢測、根因分析和故障預測。指標異常檢測通常分爲單指標異常檢測和多指標異常檢測。單指標異常檢測即時間序列異常檢測,算法分爲基於統計的算法、無監督學習算法和有監督分類算法三類。基於統計的算法很是簡單和容易實現,但只能處理簡單場景。經常使用的無監督學習算法有 IForest 孤立森林、LOF 局部異常因子、One-Class-SVM、Autoencoder 自編碼器等,這類算法無需打標數據,準確度比較高,但特徵選取難。有監督分類的經常使用算法有 XGBoost、GBDT、決策樹、支持向量機,這類算法很是準確,可是打標數據難以獲得。多指標異常檢測即綜合多個指標判斷異常,須要先將數據降維,再使用有監督分類和無監督學習這兩類檢測算法。機器學習
日誌是系統中信息頗爲豐富的半結構化數據,採用日誌異常檢測,能夠識別系統實時日誌中的異常,有利於問題發現和定位。日誌檢測使用的方法有天然語言處理和日誌模式識別。天然語言處理時文本向量化+深度學習,理解日誌中的文本信息,可識別潛在異常,結合人工反饋、標註,不斷進行模型完善和優化。日誌模式識別是對正常日誌的模式進行提取,對有別於正常模式的日誌進行發現,結合特徵工程,對模式匹配結果不斷進行自學習和調整。性能
根因分析的核心理念是利用數據挖掘算法挖掘出指標之間的相互影響關係,當有關聯的指標同時產生告警,則認爲影響告警側的告警爲根因告警,被影響的告警爲衍生告警,運維人員收到的告警只是根因告警,這樣只需排查根因告警就能夠肯定故障的根因,極大提升故障根因定位的效率。根因分析能夠極大縮短故障根因定位時間和故障恢復時間,減小故障帶來的損失。學習
根因分析能夠分析指標間的影響關係。利用 Pearson correlation,Spearman correlation,Kendall correlation,J-measure,Two-sample test 算法,能夠進行聯動分析,判斷多個指標是否常常一塊兒波動或增加。利用 FP-Growth,Apriori 算法,關聯歷史上常常一塊兒發生的事件,進行頻繁項分析。下鑽分析,利用關聯關係匹配,尋找根因。測試
故障預測的核心理念是利用算法學習指標歷史的變化規律,並根據規律預測指標未來的變化趨勢,對有可能發生故障的狀況提早發出告警。對將來的故障進行預測,運維人員能夠提早介入,避免故障的發生,減小沒必要要的損失。優化
故障預測的方法有不少種,但主要分爲三類:傳通通計方法、機器學習算法和深度學習算法。傳通通計方法有 ARIMA、Holt-Winters、Prophet 等,適用於預測穩態或差分穩態指標。機器學習算法有 XGBoost、GBDT 等,採用特徵工程根據場景構造輸入特徵,適用於預測多變量指標。深度學習算法有 RNN 循環神經網絡、LSTM 長短時間記憶網絡等,採用歷史數據滑窗方式,將預測問題轉化爲監督學習問題,使用神經網絡提取特徵,這類算法在絕大多數指標上都表現的很是好,準確率很高,但由於計算量大,對資源要求相對比較高,性能較差。編碼
基於以上智能告警的理念和相關方法,結合過往的實踐,咱們將介紹一下在單指標異常檢測、根因分析和故障預測方面的實戰方案。
這張圖片展現的是單指標異常檢測的總體框架圖,主要包括離線模塊和在線模塊兩個方面。離線模塊主要是對歷史數據的學習和分析。咱們在大量的實驗過程當中發現,難以找到一種就是萬能的異常檢測算法對全部指標都表現的比較好,某種算法一般只對特定形態的指標表現較好,因此咱們首先對指標進行分類操做。分類以後,咱們能夠肯定每一個指標分別對應使用的算法。接下來就能夠進行算法模型參數的訓練,將樣本庫的數據做爲測試數據,對模型進行評估。離線模塊是一個定時任務,能夠定時對某個指標從新進行分類和模型訓練,保證模型的時效性和準確性。
在線模塊主要是利用離線模塊訓練好的模型,對實時產生的監控數據進行檢測。判斷指標的健康情況期,主要步驟就是以實時監控數據爲模型輸入,判斷指標是否異常,若是異常的話就進行相應的告警。此外,對模型輸出的異常提供了一我的工審覈的過程,這樣的話審覈的結果就保存到樣本庫中。
咱們對大量的指標進行具體分析後,發現全部的指標均可以近似分爲三大類。第一類是週期份量,這類指標有明顯的波動週期。第二類是趨勢份量,變化比較平緩,通常緩緩升高或下降,好比磁盤使用量這種指標。第三類是穩定份量,每每只在一個區間波動,好比服務詳細時間這種指標。數據分解也是將數據分解成這三個份量。
受此啓發,咱們首先對時序數據進行了分解,以後能夠把一個指標分解成趨勢份量、週期份量以及穩定份量。而後分別計算這三個份量與原始曲線的一個皮爾遜相關係數,係數最大的哪一個份量就是指標的類別。
完成分類指標後,就能夠肯定用什麼算法進行檢測。爲了保證可靠性,咱們給每種類型的指標都提供了兩種算法,並進行投票決策。對於週期性指標咱們提供同比算法和基於預測的異常檢測算法;對於趨勢性指標咱們使用環比算法和孤立森林算法;對於穩定性指標咱們使用 3-sigma 算法和四分位數算法。算法參數訓練使用指標過去 7 天的歷史數據,模型參數的選取採用網絡搜索方式肯定。
這張圖展現的是根因分析的主要流程。在關聯關係分析方面,咱們提供了三種方式:強關聯分析、頻繁項挖掘和相關性分析。經過這三種方法獲得指標的關聯關係,有的指標關聯關鍵後,就能夠對告警進行根因分析。首先將各個監控系統的告警統一接入到咱們系統中,並作格式統一處理。利用高級壓縮的一些方法,將一些無效的告警過濾掉,有效的告警進入根因分析環節,得出根因分析報告,運維人員根據這個報告定位問題。
離線部分的數據來源是指標的歷史數據,輸出爲模型;在線部分根據模型進行計算後獲得預測數據,做爲故障預測的數據基礎。因爲 LSTM(長短時間記憶網絡)能很好抓住實踐序列上下文可能存在的聯繫的特性,在絕大部分狀況下效果都很好,所以算法選擇方面,咱們選擇 LSTM 算法做爲預測模型。
這是一個故障預測的效果圖,指標是一個 Web 系統的訪問量,藍線表明實際值,黃線表明預測者。紅點是咱們預測 Web 訪問量在這個時間點可能會達到系統所能承載的最大的訪問量。所以,咱們能夠提早發出通知,這樣運維人員能夠提早進行資源增長或擴容等操做,來防止訪問量太大致使的服務質量降低。
發現故障是整個告警質量的決定性環節,因此智能異常檢測要引入更多更優的算法,將誤報率和漏報率控制在 1% 之內。在故障定位環節,如何根據已有的數據分析出更加全面的關聯關係是重點,結合多維下鑽分析,給出更精確的故障根因。解決故障環節能夠引入故障自愈,實現定位到問題後,自動修復,進一步提升運維自動化。