360:基于 AI 的网络运维,我们是这样做的

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

作者简介

640?wx_fmt=png&wxfrom=5&wx_lazy=1


谭学士,奇虎360网络运维专家,拥有10年的网络运维和开发经验。2012年加入360公司,现负责网络AIOps的算法研发和下一代人工智能运维系统的研发。通过在亿万用户下的数据中心网络运维实战中,积累了丰富的运维经验,并在系统研发和算法研究方面积极探索,勇于创新,运用当下先进的AI技术解决运维中的实际问题。

前言

感谢高效运维社区提供这样的平台,我曾经是一名网络工程师,经历了360的架构变革过程,我个人的技术转型开始更专注网络的监控、自动化运维、网络可视化和AI应用上。我今天的分享主要有下面四个部分:

1 项目背景
2 时序序列算法
3 机器学习
4 当下与未来

一、项目背景

聚焦网络的项目,这个项目是如何在DC中ISP出口发现流量异常,通过流量异常能自动发现,自动定位,最后找出哪些业务,通知业务的过程。

640?wx_fmt=png

我们公司的业务拓展到搜索、智能硬件、手机、行车记录仪、儿童手表、小水滴,也出了扫地机器人,也有360云,虽然公司没有BAT体量那么大,但业务方向麻雀虽小五脏俱全,也积累了很多云方面的经验,公司还有一些在娱乐方面的业务。

640?wx_fmt=png

OUR OPS ,这是我们2017年底的数据:PC端的月活5.15亿用户,移动端月活3.5亿用户,加起来有8.65亿的月活用户体量。运维数据中心在大陆有120个,香港1个,洛杉矶1个,运维ISP带宽达到3.5T的规模。

面对这样大规模的网络情况,我们对业务中断零容忍,要洞察网络中的任何异常。虽然业务会切换,但对于某个用户体验上会有一定的下降,我们希望能实时的知道现在网络中DC的出口,流量上有没有异常?出现了什么样的异常,并第一时间进行响应和修复?

640?wx_fmt=png

这是我们DC流量出口图,整体上看有早晚高峰的趋势,放大看有一些上下的波动,而且波动比较频繁,局部再放大看没有什么太大的规律。DC不是一个单独的业务,它是综合性的,很多业务都在流量出口上跑,带来的问题是一个告警出来,不知道是哪个业务出现的异常。对于我们来讲可能是一个黑盒子,哪些波动算异常?异常是哪些业务造成的?打开这个黑盒子,从异常的定义到发现,再到定位业务给网络运维人员带来了一定的挑战。

这里面提到定位到业务,如果你最后的定位找不到哪个业务,你告诉人家也是没意义的,工程师大半夜起来说我要去看这是谁的业务,给业务打电话,说我今天晚上有一个APP发布,流量高一下是正常的。

通过定位是什么类型的业务,是不是应不应该告知这个业务的运维负责人?如果没有定位是什么业务,很可能前面做的很多工作是没有意义的,网络监控也用了一些传统的,传统的监控都是对于流量固定阈值类的监控,固定阈值内的波动异常根本无法发现,如果阈值设置太低误告警量就比较大了。

640?wx_fmt=png

去年的时候我们为了做异常检测和流量预测,做了大胆的尝试,360所有的网络算下来有几十万个Port,我们把所有的流量数据都做了时序化的存储。每个Port存储的时候,抽取了几十维以上的数据特征,要知道这个Port是哪台服务器,是哪个域名对应哪个业务负责人,属于哪个地市、哪个区域,因此我们打了很多标签,有了这些时序化的数据才有了后面我们进行异常检测与分析的前提。

二、时序序列算法

拿到数据以后,我们可以用时序序列算法和机器学习的手段对数据进行分析,在处理数据前,我们先要做数据平稳性验证,我们有一些平稳性不到位的数据,我们会做一些处理比如差分。

640?wx_fmt=png

原始数据进行一阶拆分,可以看到基本上是0上下进行浮动的区间,再计算自相关系数,在正负0.2的范围,再看一下分布情况是不是符合正态分布,经过分析发现大部分的数据还是平稳的。

2.1 3-sigma

640?wx_fmt=png

通过校验的数据、平稳的数据我们可以应用一些算法,大家一看这是正态分布的图,横轴代表了数据分布的情况,每个格子代表标准差的范围,从图上可以看出,只有百分之零点几的数据在3倍标准差以外,那么得到一个当前的数据以后,用这个数据来判断一下,如果超出了均值的3倍标准差以上的范围视为异常。

2.2 EWMA指数加权移动平均

640?wx_fmt=png

EWMA这个算法中认为历史数据对当前的数据是有一定影响的,历史数据影响大小反映在权重上,该算法引入了参数λ,当λ在0和1之间,λ越大,当前的权重越大,前面时刻就越小。

我们在实际的流量图中发现,确实是时间越近的数据越能表现出数据近期的特征,因为我们采用以天为单位的,每15分钟一个时间窗口进行7天的ewma计算,计算出一个趋势的ewma曲线,以曲线最后一个值,也是最新的值来替代均值,再做上面的3sigma的计算比较,这样超出了则视为异常。这个算法考虑到了历史同期的数据对当前数据的影响。

640?wx_fmt=png

在数据中心流量图这块选两个时间,t时刻和t-1时刻,再取两个时间窗口,分别取均值,用后一个窗口比前一个窗口再比绝对值再乘百分之百,就是波动的比例。方法二采用时间窗口可以有效吸收一定的瞬时波动,也牺牲了敏感性。

2.3 动态阈值

640?wx_fmt=png

如上图有一个正常的区间,两侧异常的区间,把14天的历史数据倒数第二小的乘以60%,倒数第二个大的乘以1.2就认为它是异常,看起来缺点很大,虽然实现了阈值的动态,经过几次波动以后会发现阈值拉高或是降低了。

2.4 小流量监控优化

640?wx_fmt=png

这是我们针对实际业务做的优化算法,应对一些小流量时的处理。X轴是时间,Y轴是大小,大小的单位是1兆到9兆,从1个G到9个G,虽然都是9倍,但是从运维角度看所代表的意义是不一样的。

我们希望通过一条曲线,能动态的有些容忍度,曲线在流量很小的时候很陡,越往后的时候曲线越缓慢,数学比较了解的人知道是用对数函数实现。y=w*1n(x+b),b一开始放在外面,放在外面的效果不如放在里面的好,放在里面的影响大一些,w表现斜率。

四个算法同时应用的时候,对于平稳的数据占DC出口的80%很OK,用算法解决是很好的。还有一种数据,用时间窗口切它,在一个里面很难切出相似的情况,这种情况下比较难优化,也比较头疼。

640?wx_fmt=png

三、机器学习

面对上面说的比较难优化的情况,工程师会想办法解决它,我们看到了当前流行的一种方法-机器学习。

3.1 机器学习架构

640?wx_fmt=png

考虑到用机器学习,首先看一下架构,我们希望通过设计一个自动Update的 Model,为什么呢? 业务流量模型往往是不固定的,上个月和这个月可能就不一样,上个月没有频繁的抖动,这个月可能波动就频繁。可能依赖与业务的调度方式等,往往越近的趋势越能反应业务当前的流量特征。

拿到训练后的 model ,我们把实时的流量进行特征提取,作为样本输入模型以后,模型能告诉这个流量是正常还是异常的,上面的部分因为训练需要一定的时间,也不满足实时处理的要求,我们把它放在 Offline 上进行,而下面的实时预测要放到online实时的进行。

3.2 学习方式对比

640?wx_fmt=png

学习方式的选择也做了一些尝试,先说一下有监督的机器学习,一般要求正负样本的比例是1:1,而且有人工标注,通过标注可以有效的做算法提升,实现整体的提升。无监督是不需要考虑正负样本的比例,不用做标注能自动从信息中学到一些有用的信息,但是也需要一些调参,这个得根据工程师的结论不断的手动调整这些参数。

3.3 特征提取

输入一些特征和原始数据的信息,我们怎么抽取这个特征呢?

640?wx_fmt=png

我们的目标是通过分析,把第一张图中的异常数据分离出来,实际上解决的是分类问题。右边这幅图这是两个正常的簇,蓝色和红色代表正常的数据,打叉的数据离得比较远的是异常数据,异常点也叫离群点。

那么如果抽取这样的数据特征呢?

特征出现的时候一定是有波动的,平稳就不叫异常了,如果这个数据时时刻刻都是这样波动,我们认为就是正常的,异常的时候一定是小概率事件。特征向量,我们也做了一些尝试,最终是数据归一化流量大小,我们是在分位数的概率分布,时间段分开后,一般分布数据的分布概率是固定的,还用了很多同比周期、环比变异系数的数据所为特征进行训练,效果最后测出来总不太理想,目前还是采用直接拿数据归一后的大小和环比振幅作为特征。

3.4 Model选择

既然是分类问题,Model的选择也很多,尝试了经典聚类 K-Means 算法:给定一个数据集,要定义分几种类别,然后进行计算,设置最大的循环次数,输出样本集的中心点,每个分类的中心在什么位置,每个数据进行打标,它是什么样的情况,下面是循环的计算,最后计算出我的中心点的过程。

640?wx_fmt=png

计算出中心点之后怎么知道输出异常呢?往往需要在这里面设置一个阈值,通过最后的训练我拿到的是每一个类别簇的中心点,要判断异常的时候需要设置一个阈值,计算该点到中心点的欧式距离,距离超过阈值我认为它算是异常。这张图是我们在测试的时候阈值设置2.4完全可以分开,绿色的部分都是正常的数据,波动的点就是这个红点。

接下来分享的是独立森林,算法来自周志华在2011年 Isolation-based Anomaly Detection 通过切蛋糕的方式看谁先被切出来,比如随机切100次,几次就把B切出来了,而A则要切了很多次才分出来。在实现上则是采用的森林的算法,随机建立一些二叉树的方式,把小的放左边,大的放右边,在距离根最短的路径经过score的仲裁后来进行预测是否是异常。

640?wx_fmt=png

比较两个方法,目前我们拿到的数据特征还是比较少,之前同比和环比的特征还是比较少。我们做分类的时候,如果特征比较多的情况下 K-Means 比较好。分类的设定 K-Means 要剔除一些异常的样本, Iforest 不需要。在易用性上,我们认为 Iforest 更好一些,最后我们选择的是 Iforest 。

640?wx_fmt=png

由于每个DC的场景不一样, IN/OUT方向的流量特性也不一样,最好是每Port每方向就训练一个model,这样可以更贴合业务。也就是 每个Port 的一个方向就是一条曲线,每个曲线对应一个 Model ,窗口大小选择10分钟,模型更新是每天更新一次。

640?wx_fmt=png

如果说我用前面四种方法进行仲裁,仲裁的概念就是多种算法进行投票,四种算法中符合两个以上出现异常,算法就是异常,这种情况下准确率比较低。多种算法仲裁的情况下,再加上机器学习,最后 Model 的判令,准确率能提高到98%以上。

640?wx_fmt=png

四、当下与未来

异常检测可以检测出来了,但异常出现的时候,如果不能定位是哪儿的业务做这个意义不是很大。

640?wx_fmt=png

基于之前的积累,我们把数据中心在出口上进行分割,流量镜像可以获得完整的数据,写了一些C语言的开发,能够知道这里面哪个IP跑得比较高,哪个跑得比较低,出现异常的时候,告警里面可以调用API拉一下 TopN ,突发的时候看 TopN,陡峭的时候是看不了的。

前两天我们刚改进一版,知道哪个业务的哪个IP还不够,还给出了流量的协议类型,知道是TCP/UDP/ICMP等。找到对应的业务人,直接给业务人和运维负责人发邮件,最为异常的依旧。

还有一种判定方法是 Pearson相关系数相关系数,两条曲线的相似度,如果小于等于0.3是不存在线性相关,0.3到0.5是低度线性相关,0.5到0.8是显著线性相关,大于0.8是高度线性相关。

640?wx_fmt=png

出口流量出现曲线波动的时候,我们要抓取IDC相关 Port 的曲线出来。我们做了千里眼,网络运维平台上鼠标一选,就会帮你后台计算相同时段DC里面还有哪些曲线和你选择的相似度最高,并显示是哪个业务。在这之前都是工程师肉眼去分析流量图,一个图一个图去看,如果交换机特别多端口特别多,可想是比较耗时的。

网络监控这么多年以来,我们把一些监控项做得非常细致,Port百分比,流量丢包、品质监控等都做了。这些监控缺乏合理的关联,希望通过一种方式智能的把它连接在一起,当发生故障的时候能通过关联关系找出相关联的事件,做好相关告警抑制和屏蔽,另外根据逻辑关联,也可以找到该时段告警的Root Case,另外考虑防范于未然,做故障的提前预测。

640?wx_fmt=png

在已经发现故障之后,能不能有一个行动预案,最后我们通过提前设置好预案的命令,通过自动联动预案做到故障的自动修复。

GOPS2018深圳站精彩PPT(持续更新中)

链接: https://pan.baidu.com/s/1zgOGm7CabpO6lIquNVcNkg 

密码: sp76


更多精彩内容请访问高维在线:www.gaowei.vip


END

如何才能与谭学士面对面?机会来了......

活动日程

640?wx_fmt=png


活动嘉宾

640?wx_fmt=png


活动地点

640?wx_fmt=png


报名通道

640?wx_fmt=png

长按二维码 进入活动官网


更多惊喜请点击阅读原文⬇️

猜你喜欢

转载自blog.csdn.net/mes8y62b6ogv207/article/details/80103932