在日常运维工作中有时会遇到这样一类问题
-
新准备的MySQL从库同步完全追上主库需要再等待多久时间
-
MySQL同步延迟监控报警了,前端已经做了限流,预计多久同步延迟能恢复
-
按现在的数据增长速度,我们的磁盘空间还能支撑多久的时间
大多数情况下仅凭直觉我们也回答这类问题,通常直觉给出的结果也不会太差,如果想准确一点本文作者甚至使用过尺规作图的方法来拟合一根监控曲线。
可以尝试用线性回归(Linear Regression)的方法解决这种预测问题。
来看看线性回归的定义:
线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。
-
通过监控系统提供的API获取历史监控数据
-
选取合适的点位,如:同步延迟预测一般选择最近的几个点位进行尾端预测,磁盘使用率一般选择一个月以上的监控点位进行长轴预测
-
通过线性回归算法求取二元一次方程(y=ax+b)中a和b的值
-
指定y值计算x值,即:x=(y-b)/a。如:同步延迟预测x=-b/a,磁盘使用率预测x=(95-b)/a
package mainimport ( "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整)。
无法获得赠票的童鞋,点击“阅读原文”可获得小米运维专属优惠价购买门票。
还在等什么,赶快留言吧。
本次活动的解释权归小米运维所有