本文基于日常运维工作中遇到的问题,从人类直觉和数学工具几个方面提供了预测的方法。
需求背景
在日常运维工作中有时会遇到这样一类问题
新准备的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) } } }
总结
借助数学工具,我们能够更容易的整合汇总监控数据,以一种科学的方式方法来对服务器的状态进行预测。本文仅以线性回归的方式来作为案例,分享故障恢复预测的一种简单思路。线性回归的优势在于门槛低,结果直观,但能够分析的维度相对也比较简单,你可以基于使用一些更复杂的回归分析算法来辅助分析复杂问题,希望本文能给你提供一些思路。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31559359/viewspace-2217704/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31559359/viewspace-2217704/