携程的运用数量浩瀚、架构繁芜,规模效应和韶光维度上的积累会导致运维数据(日志、监控数据、运用信息等)体量非常弘大,传统基于履历规则的办法已经不能很好地胜任某些特定的运维场景。
特殊是在大数据时期背景下,这种寻衅尤为严厉。

携程对 AIOps 场景和算法的探索与实践_指标_时序 文字写作

本文将分享携程在 AIOps 方面的一些探索和范例的实践场景,希望通过分享,让大家对 AIOps 以及目前行业发展水平有个宏不雅观的认识,也给对 AIOps 感兴趣的小伙伴一些借鉴和启示。

运维面临的寻衅

运维数据的体量随着运维规模的快速增长呈现出爆发式地增长。
除了对持续交付、持续集成、资源调度、监控能力等提出很高的哀求外,面对海量的运维数据,其查找和获取本钱也变得非常高。

其余,运维数据的代价和数据本钱之间如何平衡、如何取舍,以及如何挖掘有代价的信息,也给运维提出了一定的寻衅。

AIOps 的理解、定位和现状

结合自身实践以及通过对行业整体水平的剖析,先容下对 AIOps 的理解、定位和现状,以及发展 AIOps 面临的一些寻衅。

运维技能的发展趋势:和运维行业中普遍的经历一样,携程的运维办法紧张经历了:人肉运维的脚本运维时期,针对特定运维场景的工具化运维时期,打通端到端运用交付的自动化运维时期,到现在正在进行中的智能化运维时期。
AIOps 属于跨领域结合的技能,正式被提出是在 2016 年,随后有多家互联网公司参与实践。
运维职员构成转变:行业中对职员的构成上也按照职能的侧重点不同,划分为运维工程师、运维开拓工程师和运维 AI 工程师,大家专业领域不同,分工的侧重也不同。
从个人理解看,这种划分大多数情形下只是一种逻辑划分,例如一个人可以身兼多种角色,而这种复合型的人才是目前非常紧缺的。

AIOps 现状及实践内容

从行业分享的最佳实践内容看,AIOps 紧张环绕质量、效率和本钱这三个方面展开,实践包括非常检测到诊断自愈,以及容量到本钱的优化。

从行业整体实践水平来看,目前的 AIOps 还处于低级阶段,实践的内容紧张还是针对单个运用的场景展开。

发展 AIOps 的寻衅

由于是跨领域结合的技能,以是发展的难度也紧张是两个领域的知识都须要有比较深刻的理解和认识。
数据质量和算法积累是一方面寻衅,复合型人才的稀缺是另一方面。

AIOps 在携程的探索与实践场景先容

单场景实践方面罗列了几个相对成熟的办理方案。

首先是运用监控指标的智能非常检测。
传统基于规则办法的告警泛化能力差,常常会导致告警漏告或者误告,智能告警是通过机器学习的办法替代传统基于固定阈值的告警办法。
当检测到运用指标非常之后,我们通过智能运用诊断系统,诊断系统是基于专家履历和干系性检测等算法实现的故障剖析诊断系统,可以快速定位故障根源,从而达到快速止损。
另一实践场景是在线资源和离线作业之间的稠浊支配,基于对在线运用的资源和离线作业的画像,分时动态地将离线作业调度到在线资源上运行,从而达到提升在线资源利用率的目的,同时也提高了离线作业的实行效率。
末了一个要先容的是智能弹性扩缩容,通过对线上资源构建容量模型,定期天生容量报告,根据容量报告自动实行扩容和缩容。

从 AIOps 整体架构设计和方案方面,紧张分为四个逻辑层实现。
自顶向下分别包括:运维 KPI 层、运维场景办理方案层、平台自动化层、以及底层根本架构和数据监控层。

底层做事为上次的实现供应能力和平台支撑,未来重点紧张会放在平台能力的培植和优化、以及更多智能化运维场景的挖掘方面。

详细的实践运维场景以监控时序的非常检测和运用的智能诊断为例展开先容:

监控时序的非常检测

数据体量很小的时候,基于规则的告警办法尚可胜任,当数据体量不断增长之后,规则的泛化能力就会变弱。
做监控时序的智能非常检测紧张是为了提高告警的质量,减少误报和漏告数量、提高告警的及时性、降落阈值管理的繁芜度。

监控时序指标

首先总结下常见的监控时序指标,携程是海内最大的在线旅游互联网公司,和大部分互联网公司一样,监控指标根据功能的不同紧张分为以下几类:

订单指标,也是最核心的监控指标,从监控曲线看有非常强的周期性;

运用指标和业务指标,大部分是开拓基于框架中间件做的一些业务埋点。
这些指标正常情形下都会表现的很平稳,当有突发状况或非常时,指标会剧烈抖动;

根本监控指标,涉及底层各种类型的监控,包括做事器 CPU、内存、磁盘 IO、网络 IO 等指标,以及 DB、Redis、代理、网络等干系监控指标。

非常检测流程

前面提到了常见几种监控时序类型,个中最能够及时反响运用康健程度的便是运用的监控指标(缺点数、要求量以及相应韶光等),也是运用运维最关心的指标。

非常检测实践的紧张内容也是在环绕业务指标跟运用指标展开的,由于携程的运用数量浩瀚,这部分指标的数量也是非常弘大,非常具有寻衅性。
这里我们紧张先容从数据流向的角度来先容下时序指标的非常检测。

数据源配置:对付一个通用的非常检测平台而言,待检测的时序数据源可能存在不同的物理介质上,也可能是不同的系统中,为了避免对业务系统的侵入性,非常检测的逻辑一样平常都是旁路来实现。
首先须要将这些不同系统、不同存储介质中的时序进行采集(数据源可以是 DB、HBase、、API、以及特定的监控系统等),在非常检测平台中保存一段副本数据,留作构建数据仓库利用。
数据集过滤:实践中我们并不会对所有的数据集都配置智能检测算法,是由于在很多真实的场景中,有些指标很难用被非常检测的算法检测,紧张的缘故原由是数据质量不高,有算法经历的道友该当都清楚,数据质量的好坏决定了算法效果的上限。
我们会事先配置了一个数据集过滤模块,过滤掉一些数据质量不高的数据集。
实现的事理紧张是基于数据集的一阶和二阶统计量、偏度、峰度、信息熵等指标,将知足一定统计特性的数据集筛选到后续流程处理。
非常检测算法集:针对预筛选环节过滤得到的数据集,我们准备了常见的非常检测算法集,这些算法大都是通用的机器学习算法根据实际情形和须要做了一定的二次定制,更详细的先容我们会在接下来的内容中展开。
告警状态机:这个模块的功能紧张是将时序非常转变为一个有效的告警。
从事过监控告警的道友该当有类似的共识,非常数据从统计角度看只是离群较远的分布,能不能当做一个业务告警处理呢?大部分时候是须要业务同事来给出规则,将一个无语义的时序非常转变成一个业务告警。
例如将连续三次或五次的时序非常转变成一个业务告警,连续多少次之后规复告警,同时告警状态机会掩护每个告警的生命周期,避免重复的告警关照等。
告警质量评价:告警质量的评估可以说是最具寻衅性的事情了。
一方面,我们检测的指标基本都是无标注的数据集,产生的告警准确与否必须有人来判断;另一方面,由于运用数量浩瀚,每天的告警量也非常的弘大,靠人力逐个去判断险些是不可能实现的。
如果不做告警质量的评价,就无法形成闭环,算法效果也无法得到后续的优化与提升。
目前的评价一方面是靠专家履历抽样判断,一方面是邮件将告警推送给监控卖力人,通过一定的褒奖机制调动用户来反馈告警结果。

非常检测算法先容

习气上,按照待检测的数据集有无标签标注可以分为监督式学习、无监督学习以及半监督学习;按照算法模型有无参数将算法分为有参模型和无参模型。

详细算法基本都是大家耳熟能详的,个中大部分算法在实际利用的时候都做过一些二次开拓和参数优化,例如某些场景下我们须要将有的算法改写成递归办法实现,用来适配流办法的处理。

上面只是罗列了部分算法,详细的实现算法要远多于这几种。
但就这些非常检测算法的思想进行分类的话,无外乎两大类:

一类是监督式的非常检测,这类算法的数据集由于已经打上了标签的,分成了演习数据集和测试数据集,利用演习数据集和对应的标签演习出模型,然后利用学习到的模型再对测试数据集进行检测;

其余一类算法可以归结为基于分布和统计特性的非常检测,这类型的算法针对的是无标注数据集的检测,一个很大略的道理,我们要判断某个指标正常与否,一定须要和某个基准进行比对,这个基准可以是固定阈值,也可以是动态阈值。
基于分布和统计特性的非常检测利用的基本都是动态化的阈值。

在大部分的实践场景中,监控指标都是没有标签标注的,这里我们重点先容下基于分布和统计特性的非常检测事理。

我们提到的绝大部分监控指标,经由统计剖析后都是能够近似知足正态分布或者超高斯分布。
利用统计特性做非常检测紧张是看分布情形,韶光轴上的监控序列投影到纵轴上,就可以得到相应的概率密度分布函数。
从成图直不雅观的看,连续多次小概率事宜发生就可以认为是非常事宜。

我们借助工业上常用的 3Sigma(标准差)准则作为是否是非常点的考验标准,对标准的正态分布而言,3Sigma 准则可以包括全体样本集 99.7% 的分布,也便是说有千分之三的样本会被剖断为非常。

对付超高斯分布,也便是形状上比标准正态分布更尖的分布,可能不用 3Sigma,2Sigma 乃至 1Sigma 就可以知足检测需求。
除了利用标准差外,四分位差也是常常被用作非常检测的动态阈值。

下面是从我们生产系统里截取的一张图,是某个运用的某项监控指标,竖着的虚线标识的韶光点代表该指标有监控告警。
可以看到正常情形下这个指标是比较小,按照以往固定阈值的告警办法很难创造这类故障,由于固定阈值动辄便是成百上千的设置阈值,像这种 Case,很随意马虎漏掉告警,但是通过分布和统计特性来检测就很随意马虎创造非常。

前面先容了基于分布和统计特性的非常检测规则,事理上便是基于 N Sigma 准则办法实现的动态阈值,个中动态阈值是根据预测基线和 N 倍标准差打算得到的。
接下来这个算法紧张是跟大家分享下,我们是如何基于时频变换得到预测基线。

时频变换对很多人来讲可能是个比较陌生的观点,用到的技能叫做傅里叶变换。
大家可能或多或少都有一点印象,高档数学有一章级数,曾经提到过傅里叶级数。
系统讲解傅氏变换的技能是在旗子暗记处理这门课程里边先容的。

理解傅氏变换的物理意义是很有寻衅性,这里大略先容下如何运用和实现,详细实现须要对监控序列加窗,然后做离散傅里叶变换。
下面也给出了详细的打算公式,但由于直接打算相称的繁芜,实现上都是通过做快速傅里叶变换实现下的,简称 FFT。
很多编程措辞都有现成的函数库实现。

通过前面先容的时频转换技能,将监控时序变换到频率域之后再对频谱做相应的过滤,去除掉频率较高的身分,然后在韶光域重构时序,就可以得到一条相对平稳的基线了。

这里的条件假设便是我们的监控指标正常情形下都是平稳的,渐变的。
从我们生产系统里边截取了一段基于频域滤波的监控结果,黄色的曲线是原始的监控指标,绿色的曲线是通过频域滤波之后的基线,可以看到是一条非常平滑和稳定的曲线。
从图中可以看到,利用这个技能可以有效的剔除掉非常监控点,确保基线平稳。

基于时频变换的技能,除了前面讲到的可以过滤掉时序中的高频身分天生比较平稳基线时序外,还可以自动创造时序是有包含周期性特色。

以这幅图为例为例,这是从生产系统里边截取的一段真实的监控指标。
直不雅观的看,确实是存在明显的周期性,现在我们要做的事情是让程序自动的来识别这个指标的周期。

首先对这个时序做一个自干系,如图中第 2 幅所示,然后去掉自干系序列中频率过低和过高的身分,再去掉均值,如图中第 3 幅所示,这时候结果看上去有点靠近正弦波的形状。
末了再对上面的结果做一次时频变换就可以得到对应序列的频率谱,如末了一幅图所示。

频率谱旁边对称,单位一样平常取赫兹,频谱上有明显的谱线就解释对应的韶光序列存在比较强的周期性,通过一定的数学公式转换,就可以打算出相应的周期大小。

非常检测实践的履历总结

针对前面先容的关于非常指标检测实践内容,我们大略总结下实践的成果和积累的一些履历,以及识别到的一些问题。

通过智能化告警的实践,运用告警的准确率、召回率比较之前基于规则和固定阈值办法的告警得到了很大的提升。

现在携程默认的运用告警办法已经全更换成了智能告警。
大部分实践场景中,这些时序数据都是没有标注的,都是须要结合基于分布和统计特性的非常检测办法。

其余并不是所有的时序都是要采取智能化的办法被检测,这里涉及到算力和本钱的投入,如果基于规则的办法可以知足某些场景下的告警检测,那么做智能化检测的意义就不是很大,做成这件事紧张还是为理解决“痛点”。

其余便是不同时序的特色可能有所不同,而不同的算法适用场景也有所差异,以是针对不同特色的数据集就须要配置不同的检测算法。

再提一下检测结果的质量评估问题,对付没有标签标注的数据集来说,一贯是一个难点和寻衅,只有这个环节打通,非常检测才算是真正的闭环了。
也只有不断地网络和利用反馈结果,这件事才能越来越智能。

运用告警的智能诊断

我们先来看一个例子,下面是一张大量运用告警时的运用大盘截图,标红的每个方格表示当前有告警的运用。
实际运用之间的调用错综繁芜,究竟是哪个运用或什么操作导致了这次故障,须要能快速排查出故障缘故原由,这样就可以为网站快速规复和止损。

作为武断的唯物主义因果论者,我们相信万事皆有因果。
借助专家履历,我们把所有可能会影响到某个运用非常的成分罗列出来,每个子项称为一个因子剖析器,个中包括了运用发布、配置变更、调用链非常、代理故障、数据库发布、DNS 故障、负载均衡器故障、网络变更等等。

每当发生运用告警的时候,就会自动触发因子剖析器剖析。
引子剖析器紧张是做运维事宜及告警等和运用告警的关联剖析,剖析结果用百分制打分给出。

紧张的算法有两个:一种是基于皮尔逊干系系数打算得到的干系系数;其余一种是基于贝叶斯公式打算得到的后验概率。
这两种技能打算的结果,其绝对值都是在 0 和 1 之间,相称于对结果做了归因化的处理,然后对这个结果再乘以 100 就可以直接打算出因子剖析器输出的关联分数。

运用的干系性打分、聚合

因子剖析器种类特殊多,这里我们以运用告警指标和发布事宜之间的关联剖析为例,解释下干系性打分的事理。

上面黄色的曲线代表了某个告警运用的监控指标,记做序列 A;下面的赤色的曲线代表了发布事宜在韶光维度上的量化结果,记做序列 B。
此时我们就得到了 A 和 B 两个韶光序列,然后打算下皮尔逊干系系数即可打算得出关联剖析结果。

同样的思路我们还可以利用到多个告警运用之间的关联性剖析。
图中上线两条曲线分别代表了两个告警运用的监控指标序列,对这两个监控时序直接打算皮尔逊干系系数,即可求得两个告警之间的关联程度。

其余,我们还会通过框架中间记录的埋点数据剖析两个运用之间是否存在调用关系,再结合之前打算得到的干系系数,以此来完成将多个运用告警事宜进行聚合和收敛。

后验概率打分

利用后验概率打分,须要积累相称永劫光的历史运维事宜和关联运用告警的数据,记录并网络在运维知识库。
这里我们紧张对贝叶斯公式的利用做下解释,利用贝叶斯公式的目的紧张是希望从似然概率打算得出后验概率。

似然概率是可以通过对知识库的演习和学习得出的某个运维事宜发生的时候,各运用告警发生的概率;后验概率刚好是反过来的,是在运用告警的时候,某个运维事宜发生的概率大小,而这些运维事宜大部分情形下便是对应运用告警的根源。

上面我们先容了多种故障关联的方法和实现。
实际效果如何呢?这幅图是从我们生产系统里边截的一张故障时候快速定位根源的快拍。

某天某时溘然有很多运用告警同时告警,在我们故障诊断系统中一键剖析就得出了图中的结果,定位的结果非常明显地指向了中间某个运用,而这个运用当时关联到正在做发布。

故障诊断总结

和前面运用告警的智能检测实践一样,我们总结下故障智能诊断的实践成果、履历和识别到的一些问题。

目前大部分故障发生时,我们已经可以快速的定位出故障根源,大大缩短了规复故障的韶光。
因子剖析器的设计、专家履历知识库的构建、关联打分、调用链挖掘等都是非常关键的技能点。

要提到的一点是,诊断质量的结果评估和告警质量的结果评估类似,也是一个技能难点。
未来的操持是随着反馈数据的不断积累以及知识库的完善,相信这个问题会逐步得到更好地办理。

AIOps 未来展望

通过携程在 AIOps 方面的实践和探索,末了大略总结下我们在 AIOps 方面的一些思考和展望。

AI 是“他山之石”:AIOps 是一个跨领域结合的技能,AI 只是办理运维问题的一种思路和工具,实践的出发点和落脚点还是 Ops。
其余,较高的自动化程度是 AIOps 实践的条件。

实践一定要结合自身场景:我们一贯是主见场景优先的原则,实践 AIOps,首先一定要明确自身运维过程中的场景和痛点,不能跟风;当心拿来主义,AIOps 目前没有明确和统一的实践规范,实践前最好要搞清楚机制和事理,必要的时候做一些二次开拓。

紧跟行业动态:大型互联网企业有相称的财力和人力做这件事情,而且一样平常也很乐意分享干系的实践履历。
紧随行业的一些最佳实践,结合自身场景剖析谈论落地的可行性,可以避免大方向上走弯路。

学术界跟工业界各贡献一半力量:这是清华裴丹教授在各种 AIOps 会议上分享的时候一贯呼吁的,学术界贡献算法,工业界贡献数据和场景,终极实现 AIOps 的美好愿景。

AIOps 总体来说是一个比较新和初期的技能,预测 5 到 10 年后,运维必将是其余一番景象。
相信通过构建敏锐的“眼”、聪慧的“脑”以及自动化的“手”,“无人值守的运维”的美好愿景终将能实现。

作者简介

徐新龙,携程技能保障中央资深 SRE,复旦大学旗子暗记处理方向硕士研究生。
卖力携程多个 AIOps 项目的设计与研发,对人工智能、机器学习、神经网络及数学有浓厚的兴趣,对人工智能技能结合运维场景的实践有深入研究。