IT 運維告警現狀
目前 IT 運維領域保證服務運行正常的主要方法是對相關運維指標進行實時監控,並根據經驗設定一些規則,通過將實時監控的數據與規則進行對比,當某個指標監控值不符合設定的規則時,則判定為異常的狀況,這樣的話就會發送對應的告警到告警平台。告警平台收到通知后,會分配給對應的運維人員進行處理,運維人員去根據告警信息來排查,最終定位故障的根本原因,並對故障進行修復。從這個流程可以看出,整個過程是以告警為中心,所以告警的質量是至關重要的。
但在實際運維過程中,我們可以發現這個過程中其實存在很多問題。首先,監控系統的規則難以設定。因為規則是基於專家經驗設定的,隨着系統規模變大,復雜度提高,監控覆蓋的完善,監控指標數量指數性增加,指標形態千變萬化,基於專家經驗的規則設定力不從心,誤報率、漏報率居高不下。運維人員可能會遭遇告警風暴,每天被數千個告警轟炸,難以應付。故障發生后,對若干個告警逐一排查找故障根因,效率極低,大大增加故障的恢復時間。故障有可能無法預知,有些本來可以避免的故障還是發生了。
智能化告警的理念和相關技術
為了解決上述問題,在智能運維領域,智能化告警的概念出現了。智能化告警主要解決 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% 以內。在故障定位環節,如何根據已有的數據分析出更加全面的關聯關系是重點,結合多維下鑽分析,給出更精確的故障根因。解決故障環節可以引入故障自愈,實現定位到問題后,自動修復,進一步提高運維自動化。