为什么很多人喜欢 Python? |
目前 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% 以内。在故障定位环节,如何根据已有的数据分析出更加全面的关联关系是重点,结合多维下钻分析,给出更精确的故障根因。解决故障环节可以引入故障自愈,实现定位到问题后,自动修复,进一步提高运维自动化。
过早客微信公众号:guozaoke • 过早客新浪微博:@过早客 • 广告投放合作微信:fullygroup50 鄂ICP备2021016276号-2 • 鄂公网安备42018502001446号