xx0cw 2020-01-17
要说智能日志中心,首先要了解什么是智能运维。目前业界对智能运维的运用,主要分为如下五个等级。
一级是最容易的,只要你有个想法试试就行,到网管监控系统里,拿一个监控指标的曲线下来,就可以尝试异常检测。
一级还没有成熟的单点应用,当有了一个成熟的单点应用,就算是达到二级。二级必须要有一定的基础设施建设作为前提。当单场景模块能够串联起来,形成流程化 AI 运维,也就达到了三级的层次。
目前业界基本上处于从一二级,往二三级努力的阶段,想实现四、五级还比较远。
大家都知道,现在 AI 应用强、技术成熟,能被广泛应用的基本上仅有两个模块——语音识别和人脸识别。语音及人脸识别能够快速得以发展,主要因为国内市场的需求,及国内大人口基数下广泛的数据资源。
运维领域数据较少,且信息比较碎片化,这使得 AIOps 发展缓慢。日志易五年前开始做日志分析的时候,主要也是得益于海量的日志数据,AI算法的应用下,得以实现智能日志分析。目前日志易智能日志中心处于 AIOps 五等级的二级到三级之间。
为了帮助大家实现更高级的 AIOps 能力,日志易打造了一个智能日志中心。如下图,为智能日志中心的全景架构图。
我们都知道, AI 重要的是数据。所以,首先我们要具备尽量多类型的数据采集、处理及分析能力。
日志易支持 Linux、Windows、AIX、HPUX 等各种平台的数据采集,也能采集 ODBC、Syslog、APM 的数据,甚至手机 App 埋点数据,然后配合一些 CMDB 数据,流程工单数据,非常方便地实现业务运维层面的关联分析。
采集之后,我们有数十种 ETL 方法来对日志进行规范化处理。日志本身是非结构化的,而日志分析需要格式化的数据,ETL 做好了,后续的分析才容易展开。
这个环节,会涉及到一些数据脱敏及业务日志串联,对于一些时间戳设计不合理的日志,日志易会自动对其进行补全,以便后续分析工作的展开。
对数据进行搜索时,业界主流开源解决方案是 ES。然而,由于 ES 开源引擎是一个通用的搜索引擎,难以满足日志处理的一些特殊需求,用Java 开发,内存消耗及性能上存在很大优化空间,在面临海量日志数据时,ES 往往显得力不从心。
基于以上原因,日志易自己开发了比通用引擎快 5 倍以上的 Beaver 搜索引擎,保证了海量数据的实时存取。我们还有上百个 SPL 指令进行统计分析,有多种不同场景的算法。搜索引擎可以说是 AIOps 的大脑。
我们有日志易智能日志中心,也有基于日志开发的智能运维应用 Lynxee、大屏 Galaxee、数据工厂。安全审计、业务关联分析等解决方案,也是基于智能日志中心实现的。
智能日志中心可以与大屏展示、告警推送、按需调用脚本执行、公开的数据 API 和第三方平台对接,这一部分可以说是 AIOps 的手。
以上这些合在一起,就是整个智能日志中心,我们也可以把它看作 AIOps 的中控(或者中台)。
日志易有上百种不同类型数据的采集分析方案,可以直接导入安装,如思科、F5、天融信等各种网络设备日志,Oracle、MySQL 等数据库日志,Nginx、Apache 等中间件日志等。这些内置数据采集分析方案,可以节省数据采集处理的时间。
我们在实践中发现,做一个运维数据中心,70% 以上的时间是在做数据采集和处理。真正处理好了以后的分析过程还是很快的。这和 AI 界说人工智能 80% 的工作是数据清洗,是比较吻合的。
说到 AIOps 的场景,我们可以从成本、质量、效率三个方面做出规划,如下图:
以质量保障而言,以往的异常检测,需要运维工程师基于自己的经验做出判断和分析,我们要做的,是借助AI来实现这一目的。
故障的发生都是有先兆的,可能表现为延时逐渐增大,响应逐渐变慢等。我们可以基于这些先兆及历史数据做出模型,对即将发生的异常做出预判。
成本管理和效率提升要面临的情况更加复杂。成本管理面临成本优化、资源优化、容量规划、性能优化等复杂场景。
效率提升涉及复杂度较高的智能变更、智能问答、智能决策、容量预测等,以双十一容量预测为例,要基于历史数据预估流量,同时结合业务(如促销活动带来的增量)等因素综合分析。纵然如此,预估也往往会和现实存在较大出入。
就目前的阶段,质量保障还是最关键、性价比很高的,是可以首先实现智能化的部分。我们的智能日志中心,目前主要关注的也是这个方向。
具体来说,在质量保障上,运维人员希望做到的,就是尽早告警、尽快定位、尽快修复。表现在“日志+算法”的 AIOps 实践上,具体流程为以下三步:
1、快速发现故障:即基于多种算法进行异常预测;
2、问题归因定位:即通过日志模式洞察罕见报错信息;
3、辅助修复决策:即通过多方位展现系统状态加速决策。
快速发现故障即尽快告警。告警的本质,是告诉运维人员两件事情:一,有问题了;二,问题有多严重。
我们从日志直接产生告警,或者经过统计分析变成时序指标,再监控告警。通过整合告警的优先级和重要程度,拟合出来一个服务的健康度,让用户对系统状态一目了然。
一般而言,监控系统会有两种告警:一种是匹配关键字,一种是采样指标的阈值对比。匹配关键字的严重性,就是匹配 warning、critical 等;阈值的严重性,就是定义多个阈值区间,比如 CPU 大于 80% 发中危告警、大于 120% 发高危告警。在智能日志中心,这两种告警都支持。
从日志、时序指标的监控告警,到服务健康度、故障定位,日志易有一整套监控流程,这是智能日志中心的重要组成部分,位于引擎的上层。告警这部分还是以质量保障和 AI 算法为主。
《SRE》是这几年很火的书了,里面有个概念值得推荐,就是所谓“黄金指标”。
不管是主机设备层面,还是应用服务层面,或者集群、端到端等等,都可以从延迟、流量、错误和饱和度四个最关键的角度,来衡量它的健康状态。
在日志易中,我们可以通过 SPL 语句,快速从不同的日志数据,转换成为对应的指标数据。只需要更换红字这段过滤条件,就可以做到全面的指标数据覆盖。
既然有了指标数据,下一步要考虑的就是如何智能地检测指标,以便根据历史情况,智能地发现问题了。
因为指标的千差万别,很难有一种单一的普适算法。所以日志易针对不同场景需求,启用不同的算法。下面稍微介绍部分算法的原理。
我们都知道 VAE是深度学习里的一种,一般你在网上搜这个算法解释,都是讲怎么做图像识别的。
指标就是一个很简单的曲线,所以我们把曲线按照滑动窗口的形式,切割成一段一段的小曲线,合在一起,就成了一个特征矩阵了,然后进入多层的编码解码,反复迭代,得到更好的模型。
为了提高效果,在训练数据上,还可以主动添加一些噪声误差。
然后实际检测的时候,我们就把测试数据经过编解码得出来的一小段模拟曲线的分布,和实际数据作对比,是不是发生了严重偏离。因为模拟曲线是正态分布的,所以这个偏离就是 3Sigma。
这个算法,很适合做强周期性的指标检测。一般来说,由大量人群行为产生的数据,像业务访问,就很适合。
我们在这块还有一个创新:加强了时间特征上的处理。我们知道,人的行为肯定是有大小周期的,今天和昨天、本周一和上周一、每个月一号、每年春节、每年 618、双十一等,都是在算法上会重点加强学习的行为。
第二个是 iForest 算法,这是一个专门用来做异常检测的随机森林算法变种。
它适合一些和时间没有强相关性的指标,比如主机的 CPU、内存等,数据本身离散度较大,没有什么规律,可能主要关心的就是它不要出现太明显的偏离。
这种指标比较多,要求算法检测速度够快。
第三个是 KDE 算法,这个算法针对的是一类特殊的场景。
我们知道,有些服务并不是 7x24 小时运行的。比如股票市场,每天 9 点开盘,15 点收盘。在闭市的时候,证券公司相关系统的业务指标完全是零。闭市和开市两个阶段,泾渭分明,普通算法在这两个跃迁的时刻几乎肯定是要误报的。
同理,还有很多理财之类的金融场景,在周末两天无业务输出也是一个道理。
所以我们按照天的维度,对每天的每个时间点都选取它周围的若干个点,形成一个集合,进行核密度分析,然后一天的所有点合起来,得到最终的 KDE 模型。
这个模型有点类似于在 3D 地图上,无数个正态分布堆在一起形成的山峦。那么检测的时候,对应时间过来的值,如果出现在平原地带,就是明显的异常了。
GRBT 算法,我们会同时提取时序数据的统计学特征,以及它的时间戳特征。它的用途场景与 KDE 和 iForest 相比,有更广泛的普适性,突变的和业务的都能用。
可以看到这个算法原理,和前面 iForest 比较像,因为都是决策树森林。不过 iForest 是每次部分抽样迭代,而 Boosting 是每次根据上一次迭代的结果来重新选取分界点。
但是这是一个监督学习,想用好,需要训练样本里有一定的异常点标注。
有这么多不同的算法针对不同的场景,运维人员根据实际的区别,选用不同的算法,就可以达到比较好的算法覆盖了。
日志易后续也会继续研究指标数据的类型自动判断,尽量减少运维配置选取算法的工作量。
除了指标的异常,还有就是日志的异常。前面提到,最常见的日志告警就是关键字匹配。不过,大多数系统的研发,不会把日志写的那么规范。
2016 年,中科院《软件学报》发过一篇国防科大的《大规模软件系统日志研究综述》,里面引用了不少国内外的调查分析。其中有几条数据蛮有趣的:
日志代码的更新频率比其他代码要快约1倍;
约四分之一的日志修改是把新的程序变量写入日志;
约一半的日志修改是对日志消息静态文本的修改。
这些研究一般都是基于大型分布式项目,比如 Hadoop、OpenStack 等。企业内部的系统开发,情况应该会比这些著名的项目要严重的多。所以,大家输出日志的时候,很难做到特别规范,日志格式经常在变动……
所以,依赖关键字或者固定的某种正则表达式提取,在长期运行的场景下,是不足以做到日志异常检测的,这时就需要 AI 算法来帮忙。
日志易的思路,是采用层次聚类。
先对日志进行最基础的分词和类型判断,然后聚类合并。聚类可以用最长子串,也可以用文本频率等等。聚类里,不同的部分就用通配符替换掉。类似这张示意图,把 8 条日志,先合并成 4 个日志格式,合并成 2 个,再合并成 1 个。
在研究领域,我们一般把这种日志格式的树状结构,叫模式树。
当然我们实践的时候,不用真的算到最顶端,一般来说,模式数量收敛速度差不多了,或者模式里的通配符数量差不多了,就可以停下来了。
得到日志模式,具体怎么用呢?一般来说,有两种用法,故障定位和异常检测。
一种是故障定位的时候。比如我们查错误日志,单纯用关键词,可能出来几百上千条。你要一个一个看过去,翻好几页,耗时就比较长了。如果内容字很多,还可能看漏了。
模式 树的信息,可以直接查看匹配关键字的日志的模式情况,可能就只有那么三五条信息,一眼就可以看完,很快就可以知道问题在哪,就可以进行下一步了。
另一个用途,就是把得到的,加载到日志采集的实时处理流程里,进行异常检测,提前发现问题,这时候,我们除了模式,还可以检测参数,检测占比。
上图是一个最简单的示例,3 条日志,得到的模式是*are<NUM>,然后我们同时可以检测符合这个模式的日志,前边的只能是 we 或 you,第三位只能落在平均值为 93.3、标准差为 9.4 的正态分布区间内。
然后日志采集进来,先检测一下这个模式是不是合法的。如果合法,再检测一下各个参数位置的取值是不是合法的。如果依然合法,再检测一下这段时间这个模式的日志数量,和之前相比是不是正常的。
这么三层检测下来,相当于把模式异常、数值异常、时序指标异常融合到了一起。
这张截图就是日志异常检测的一个历史列表。可以看到,哪怕在 INFO 级别,也是可能出现你从来没见过的古怪日志的,这就需要密切关注了。
当然,因为日志量特别大,所以他的训练样本很容易错过一些正常情况,所以上线初期,我们需要一些迭代以及标注的优化过程。把初始样本不断丰富起来。
前面说了很多 AI 算法:如何来发现异常,定位异常。但是很可惜,定位异常这件事情,目前很难做到能找出非常理想的根因的程度。一般的做法,是依赖于云平台、容器平台的指标采集,做到定位出某台机器有问题,具体还是要登陆机器分析。
我们从日志的角度,可以定位到某台机器的一段日志有问题,但是也不算找到 100% 的根因了,还需要后续查询分析。
所以,做一个智能日志中心,我们也还需要提供更全面的统计分析和快速查询的能力,来完成对全局的、细节的运行状态的观测,以及对变化的即时捕捉。
对应前面说的 VAE 算法,我们说他最适合的就是监控业务交易量这类指标。
我们可以通过仪表盘的可视化效果,对业务交易量的各个不同维度,进行非常细致的统计分析。这样有什么变动的时候,一眼就能看到。
当然,由于交易分析的常见维度比较少和明确,后续也可以通过决策树算法,来自动定位哪些维度的异常更明显地造成了变化,比如某个省某个运营商某个手机型号打开慢之类。
从实践来说,这种基于性能优化目的的根因分析,即使分析出来,后续的优化成本也比较高,很可能从性价比考虑,会放弃掉。
交易量指标还是像这样用来做实时统计和监控比较多。
如果是业务结构比较复杂的场景,可能单看最终用户层面的交易维度不足以定位故障。我们还需要从内部的业务流转关系来调查问题。这时候,就可以用拓扑图来观测系统运行状态。
在运行状态出异常的时候,通过钻取跳转,把每层的情况和调查路径串联起来。哪怕很基础的运维人员,也可以熟练地按照高级工程师定义好的路径排查问题。
业务分析的另一个层面,是针对用户的分析,类似现在很流行的 Tracing 调用链系统。
对于智能日志中心来说,Tracing 数据也是能很好支持的。在这个基础上,可以做到很好的展示。
日志易提供了标准的调用链表格,还提供了循序图分析。这是业界比较少见的方式,但对研发人员很友好,因为系统设计的时候,循序图是研发人员很熟悉的方式。
除了系统内部,还可以从 DNS 和 CDN 厂商获取日志,甚至包括收集自己的手机 App 日志,来了解、监控端到端的情况。
以上截图,展示了 10TB 级别日志量的实时返回码趋势分析、各站点缓存率分析、各站点响应时长分析、流量峰值分析,以及用户行为轨迹分析、高频请求客户分析、热门站点分析、域名与运营商关系分析等。
此外,基于这些日志可以实现性能监控、故障排查等,也可以跟第三方厂商的计费做二次核算。