基於線性迴歸的故障恢復時間預測
需求背景
在日常運維工作中有時會遇到這樣一類問題
-
新準備的SQL/">MySQL從庫同步完全追上主庫需要再等待多久時間
-
MySQL同步延遲監控報警了,前端已經做了限流,預計多久同步延遲能恢復
-
按現在的資料增長速度,我們的磁碟空間還能支撐多久的時間
問題抽象
-
明確的評估標準,如:同步延遲為零秒,硬體使用率超過95%等
-
資料的變化有規律的可循,如:同步延遲恢復曲線保持一定斜率,磁碟使用率線性變化等。
需求解決
人類直覺
大多數情況下僅憑直覺我們也回答這類問題,通常直覺給出的結果也不會太差,如果想準確一點本文作者甚至使用過尺規作圖的方法來擬合一根監控曲線。
數學工具
可以嘗試用線性迴歸(Linear Regression)的方法解決這種預測問題。
來看看線性迴歸的定義:
線性迴歸是利用稱為線性迴歸方程的最小平方函式對一個或多個自變數和因變數之間關係進行建模的一種迴歸分析。這種函式是一個或多個稱為迴歸係數的模型引數的線性組合。
預測過程
-
通過監控系統提供的API獲取歷史監控資料
-
選取合適的點位,如:同步延遲預測一般選擇最近的幾個點位進行尾端預測,磁碟使用率一般選擇一個月以上的監控點位進行長軸預測
-
通過線性迴歸演算法求取二元一次方程(y=ax+b)中a和b的值
-
指定y值計算x值,即:x=(y-b)/a。如:同步延遲預測x=-b/a,磁碟使用率預測x=(95-b)/a
程式碼示例
package main import ( "flag" "github.com/nubbel/go-regressions") func main() { // parse flag, get hostname host := flag.String("host", "", "hostname, default ''") flag.Parse() if *host == "" { flag.Usage() return } // get monitor data data, err := GetFalconData("hostname", "SecondsBehindMaster") var SecondsBehindMaster []regressions.DataPoint for _, v := range data { switch v[1].(type) { case float64: SecondsBehindMaster = append(SecondsBehindMaster, dataPoint{x: v[0].(float64), y: v[1].(float64)}) } } // linear regression r := regressions.NewLinear() r.Fit(SecondsBehindMaster...) r.GetR2() // generate predicts list var predicts []float64 for _, dp := range SecondsBehindMaster { x := dp.GetX() predicted, _ := r.Predict(x) predicts = append(predicts, predicted) } // 預測Seconds_Behind_Master歸零時間 if len(predicts) > 10 { minute, err := PredictZeroTime(predicts[len(predicts)-10 : len(predicts)-1]) if err != nil { pretty.Println(err.Error()) } else { pretty.Printf("%s 同步延遲預計在 %v 分鐘內恢復\n", *host, minute) } } }
總結
藉助數學工具,我們能夠更容易的整合彙總監控資料,以一種科學的方式方法來對伺服器的狀態進行預測。本文僅以線性迴歸的方式來作為案例,分享故障恢復預測的一種簡單思路。線性迴歸的優勢在於門檻低,結果直觀,但能夠分析的維度相對也比較簡單,你可以基於使用一些更復雜的迴歸分析演算法來輔助分析複雜問題,希望本文能給你提供一些思路。
福利時間
DevOps國際峰會門票免費贈送
11月2日-3日 深圳
DevOps 國際峰會是國內唯一覆蓋 DevOps 全領域的技術大會,11月2日-3日將邀請全球80餘名頂級專家暢談 DevOps 體系與方法、過程與實踐、工具與技術,分享內容包括:精益與敏捷、持續交付/自動化測試、技術運營、高可用架構與微服務、DevSecOps等。來吧,讓DevOps頂級專家帶你成長(PS:小米運維的技術大牛也會在峰會上做技術分享哦)!
本次峰會小米運維申請到一張原價 3200元 的門票(含2天技術分享) 免費贈送 給和小米運維一起成長的你!
文末留言,推至精選的留言點贊數第一的童鞋,將獲得本次小米運維唯一贈票(統計截止到10月23日12:00整)。
無法獲得贈票的童鞋,點選“閱讀原文”可獲得小米運維專屬優惠價購買門票。
還在等什麼,趕快留言吧。
本次活動的解釋權歸小米運維所有