白话知识图谱及其在CMDB中的应用

  CMDB一直是运维建设的重点和难点。前段时间和北大同学一起探讨有无可能利用知识图谱相关的技术和方法重构CMDB?没想到经过短短半年时间,北大同学就在这方面取得了重大进展,现已完成算法验证,并发表国际学术论文《Mining Configuration Items From System Logs through Distant Supervision》。

  由于学术论文比较晦涩难懂,所以我尽可能用朴实的文字将我们的工作成果和思考总结给大家做一个简要汇报,欢迎批评指正。

  本文主要包含两块内容:1、对知识图谱的基本概念和思想起源做一个简单的介绍;2、知识图谱对CMDB的启发以及我们的实践成果。阅读时间约20分钟。

1. 什么是知识图谱

  你可以没听过知识图谱,但一定听过人工智能。人工智能可以简单的分为两大类:感知智能和认知智能。感知智能即视觉、听觉、触觉的感知能力。比如,自动驾驶汽车,就是通过激光雷达等感知设备和人工智能算法来实现感知智能的。比感知智能更厉害的是认知智能。认知智能通俗讲是让机器能理解会思考,能够知识推理、因果分析等等。而知识图谱,就是实现认知智能的基础技术。

  那么,知识图谱究竟是什么呢?

  别急,我们先看两个典型的知识图谱的应用场景。

  第一个场景是智能搜索。Google于2012年在搜索引擎中引入知识图谱技术,尝试让机器理解了人们输入的搜索关键字是什么意思,有什么意图,以便给出更加准确、丰富的搜索结果。

 

  另一个场景是智能问答。比如,互联网或知识库中可能记录了大量碎片化的信息和知识:

 

 

  Bob想去看《蒙娜丽莎》,他很想知道自己有没有朋友可能去看过?传统的知识库很难直接告诉你答案。但是如果将上面片段信息转化成知识图谱,就能让电脑理解这些信息的关系,进而能直接给出答案:Bob的朋友Alice很可能去Louvre看了《蒙娜丽莎》。

 

 

  上面两个场景让我们对知识图谱有了感性认识,可知识图谱是从哪儿来的呢?

2. 知识图谱的思想起源

  如果要探究知识图谱的思想起源,则应将时间上溯到1922年英国哲学家维特根斯坦和他的《逻辑哲学论》。

 

  在这本著作中,维特根斯坦主张世界的本质就是语言。因为语言是人类思想的表达,是整个文明的基础,所以语言和世界是一体的。他从报纸上车祸的示意图中领悟到,任何有意义的语句都应该能表达成由“实体和关系”组成的图谱,而语句不断积累叠加形成的巨大图谱就是整个世界。

 

 

  这一思想对哲学乃至数理逻辑都产生了划时代的影响,为知识图谱技术奠定了深刻而牢固的思想基因,揭示了知识图谱的本质,即:用对象及其关系的语言符号来描述的现实世界的图谱。

3. IT运维领域的知识图谱

  既然语言在现实世界如此重要。那么在IT的世界,机器之间又是用什么语言来交流呢?是日志。

  日志是IT系统和设备在运行过程中自产生的数据,所以也称为机器数据(Machine Data)。日志的信息量非常丰富,我们可以从日志中得知系统正在进行什么处理操作(系统日志),正在受理和发起哪些访问请求(访问日志),是否出现了异常状况(错误日志)等等。但由于日志都是半结构性数据,中英文混合、结构复杂、内容多样,在理解上较为困难,所以并没有被有效利用,人们一般在排查故障时才会查看日志。

  能否将这些机器语言转换成IT运维的知识图谱,从而实现类似智能根因分析和影响分析呢?比如,当要对某台服务器做重启时,知识图谱就能告诉我们这台服务器上现在正在运行哪些定时作业、这些作业又会影响哪些下游作业,这些下游作业属于什么应用系统,这些应用系统是给哪些业务提供服务的。

  咦,这不是CMDB在干的事儿嘛?没错,其实CMDB的本质就是IT运维领域的知识图谱。而知识图谱相关技术,也的确能够帮助CMDB提升数据质量和使用体验。当然本文主要探讨第一个问题,因为CMDB最头痛的还是数据质量。至于第二个问题以后会专门撰文阐述。

  在探讨第一个问题前,我们先简单回顾一下传统CMDB是如何构建的。

  传统构建CMDB的方式经历了三个阶段:

 

  最早期是人工录入,但工作量太大,且容易不准,因此很早就被废弃。后来采用自动发现手段,通过命令从机器上采集配置数据,这种方法有一定成效,但也存在安全隐患、性能影响及可用性方面的风险,所以真正实践起来困难重重。后来随着自动化、云计算技术的发展,人们发现大部分配置数据根本不需要采集,直接从自动化、网管、云管等平台中获取即可。这种做法规避了自动发现带来的安全隐患和性能风险,但也有局限性,就是CMDB的数据完全依赖这些第三方数据源,如果这些数据源不靠谱(比如覆盖率或完整性不行,或压根没有接口供数)CMDB就歇菜了。而且大量数据接口的开发和维护也是头痛的问题。

  有没有一种新的方法:让维护配置数据的工作量更小、风险更低、覆盖面更广、泛化能力更强呢?

  这就要靠知识图谱了。我们认为,随着日志数据的不断细化、大数据存储和处理能力的提升以及机器学习技术的日益发展,让机器从海量日志中自动甄别和提取配置数据的条件正在逐渐成熟。因此,优锘科技正在与北大师生密切合作,将最新的算法和研究成果应用到CMDB中。

  下面我将以网络告警日志为例阐述我们的实现方法,首先来看一下整体流程:

 

 

  流程总体上分为五个步骤,下面会逐一说明:

  第一步:接入原始日志数据

  本次实验共接入9万条网络设备syslog数据。

  第二步:日志聚类

  所谓“物以类聚、人以群分”,人们会按照其品行、爱好而形成团体,这就是聚类。日志也一样,想要分析海量日志数据,就要先对其聚类,从而搞清楚各种五花八门的日志背后是否有统一的模板。

  最常用的聚类算法叫“频繁项集”。项集指数据的集合,而频繁项集就是从概率统计维度,从一堆貌似无规则的数据中找到最频繁符合某项特征规则的数据集合。我们经常听说的用户消费行为分析、啤酒和尿布的故事等等就是频繁项集算法的应用场景。只不过在日志场景下,聚类的特征规则不是日志的发生时间和地点,而是日志内容的相似度。

  起初我们也采用频繁项集算法对日志聚类,但效果不好。因为该算法要先对日志做“对齐匹配”(可简单理解为结构化),然后才能进行聚类分析。可是原始日志是多语言混合结构的,其内容格式非常混乱且包含很多噪音,对全量日志做对齐匹配就会生成大量无效的日志模板。因此我们放弃了这个算法。

  后来经过大量实验,我们发现LDA算法的效果比较好。LDA是一种基于主题模型的算法,它有三大优势:

  不需要对齐匹配;

  是基于语义挖掘的主题模型;

  是一种无监督机器学习技术。

  第1项优势避免了在全局开展无意义的对齐匹配所造成的大量无效日志模板。

  第2项优势是针对传统的文档匹配算法而言的。传统方法(如TF-IDF等)在匹配文档相似度时不考虑文字背后的语义关联,仅通过查看两个文档共同出现的单词的数量来判断相似度,共同单词越多就越相似。这就有问题了,比如,“他们的CMDB很成功”和“他们的配置管理超牛”,这两句话虽然共同的单词很少,但它们的语义非常相似。如果按传统的方法判断这两个句子肯定相似度低,而LDA就会考虑文字背后的语义,进而给出高相似度结论。

  第3项优势提到LDA是一种无监督机器学习技术。什么是无监督?简单的说就是不需要做大量标注它就能自己学。其实CMDB数据量就这么点儿,也没法提供大量标注。用图像识别这类监督型机器学习技术完全不靠谱。

  下面是我们用LDA算法的实验结果,将9万条日志聚合成了23个分类(也可以理解为日志模板),正确率达到90%。比如下面四条日志都表达了control plane状态异常这个主题,因此可归为同一个日志模板。

 

  第三步:识别变量

  完成日志聚类后,我们就能以日志模板为单元分析其中的日志是否包含CI数据。从经验上看,CI数据一般来自日志中的变量,因为日志中的常量一般都在描述当前正在干什么事儿,而变量一般描述谁在干或在干谁,这里的“谁”就是CI。所以,要识别潜在CI,就要先弄清楚哪些是变量。

  但怎么从一大堆文本中识别变量呢?如果是人来做,肯定会逐条对比日志,如果发现它们在某个局部不一样,那么这个局部就很可能是变量。类似的方法让机器做就是史密斯-沃特曼算法(Smith-Waterman algorithm)。它是一种对局部序列比对(注意不是全局比对)的算法,最早用于基因序列比对,用来找出两个序列中具有高相似度的基因片段。嗯?为什么找相似片段?不是要找不一致的片段吗?没错,我们的做法是先把相似片段找到,然后将其剔除,剩下的就是不相似的片段了。这种方法也不是我们先创,它常常用来分析基因差异。举个生活例子,钟宏这几年越来越秃,这是为什么呢?这肯定不是工作辛苦的原因,因为我就没秃啊。如果用史密斯-沃特曼算法比对一下我俩的基因,剔除掉相似片段,找到不一致的片段,也许就能发现他早年谢顶的基因。

  回到正题,由于原生的Smith-Waterman算法是针对基因序列比对的(原始核函数是G-T与A-C匹配则得分),而运用到运维日志比对上就需要额外定制核函数,增加汉语字符的匹配权重。

  经过不断的实验和调参,我们获得了比较满意的结果,识别出了每个日志模板中的变量,后来又剔除掉日期、序号等日志片段后,剩下的大概率都是变量了。

 

  现在我们知道哪些日志片段是变量,也知道其中必有CI,如果是你会怎么做?

  你肯定会观察这些变量值,然后去CMDB中核对,看它们与哪些CI属性类似,进而判断这些变量就是对应这些CI属性。这项工作如果让机器来做,就要用到远程标注技术了。

  第四步:远程标注

  远程标注的目的,是让机器能够模拟人的行为,以CMDB数据做样本,辅以机器学习算法,让机器理解日志的语义,进而从中提取出CI数据。

  最简单的标注方法是严格匹配,即,将CMDB中的CI属性值与日志进行严格匹配,能匹配的就给这段日志片段标注相应的CI属性。但这种做法的效果并不好,因为CMDB的数据并不完整,而且数据质量不好,严格匹配根本匹配不出啥玩意来。为了提升泛化能力,我们采用了基于编辑距离的模糊匹配算法,即levenshtein算法。

  所谓编辑距离是指由一个字串转化成另一个字串最少的操作次数,这里说的操作包括包括插入、删除、替换。次数越少,则编辑距离越短,字符串的相似度就越大。例如将eeba转变成abac,需要经过下面三次操作:

  eba(删除第一个e)

  aba(将剩下的e替换成a)

  abac(在末尾插入c)

  所以eeba和abac的编辑距离就是3。

  当然,为了提升匹配效果,我们引入了伸缩控制机制,对于CMDB中的一个CI属性中正教的CI属性值x,按照其长度m将日志(长度为n)切分为n-m个子串yi;然后计算莱文斯坦比,即,levenshtein_ratio(x,yi),取最大x,设置阈值判定x是否与yi具有强相似性。实验中阈值设置为0.8(1表示完全相似,0表示完全不相似),也就是说只要大于0.8,就证明CMDB中的某个CI属性与该日志片段匹配上了。

 

  完成远程标注后,我们的工作就基本完成了,剩下的就是给机器喂大量的日志,然后坐等CMDB诞生就行了。不过有时候可能拉的不对,所以还需要一定的人工调整和过滤。不过人工介入的操作也会反馈给机器持续优化算法,所以理想情况下这种介入操作会越来越少。这种做法被称为hybrid intelligence - 混合智能。

  下一篇,我们将阐述一个使用知识图谱技术自动构建CMDB的案例。