AIOps(智能运维)这几年很火,很多公司都在尝试用AI来提升运维效率。我们团队从两年前开始引入AI运维,经过不断的摸索和实践,现在已经把AI深度融入了运维的各个环节。

这篇文章我想分享一下我们在AI运维实践中总结的最佳实践。从监控告警、故障诊断、根因分析到自动化运维,聊聊每个环节怎么用好AI,以及我们踩过的坑。

如果你正在做AIOps,或者准备引入AI运维,希望这些经验能帮到你。

AI运维的定位

先说一个重要的观点:AI运维不是要取代运维工程师,而是要赋能运维工程师。

很多人对AIOps有误解,以为有了AI之后,运维工程师就不需要了,AI能自动处理所有的运维问题。但实际经验告诉我们,AI目前还做不到完全自主运维。AI擅长的是处理重复性的、有规律的、数据量大的任务,而复杂的故障排查、架构决策、跨团队协调,还是需要人来做。

所以我们对AI运维的定位是"运维助手"。AI负责处理那些重复性的、耗时的、数据密集型的工作,比如告警分析、日志检索、性能分析、常规故障处理等。运维工程师则专注于更有价值的工作,比如架构优化、容量规划、故障复盘、流程改进等。

有了这个定位之后,我们在引入AI的时候就不会盲目追求"全自动",而是聚焦在那些AI真正能发挥价值的场景。这样既能提升效率,又不会因为AI的误判导致更大的问题。

监控告警的智能化

监控告警是运维的基础,也是AI最能发挥价值的地方之一。

传统的监控告警有几个痛点:第一,告警太多,每天收到几百条告警,大部分是噪音,真正重要的告警反而被淹没了。第二,告警阈值不好设,设高了漏报,设低了误报。第三,告警之间没有关联,一个故障会触发几十条告警,很难快速定位问题。

我们用AI对监控告警做了几个方面的智能化改进。

第一个是告警降噪。我们用AI模型对告警进行分类和聚合,把相关的告警合并成一个事件。比如一台服务器宕机,会触发CPU告警、内存告警、网络告警、服务不可用告警等几十条告警。AI会把这些告警聚合成一个"服务器宕机"事件,只发一条通知给运维工程师。这样告警量减少了80%以上,工程师不用再被海量告警轰炸。

第二个是异常检测。传统的监控是基于固定阈值的,但很多指标的正常范围是随时间变化的。比如白天的流量高,晚上的流量低,用同一个阈值就会误报。我们用AI做动态基线,根据历史数据学习每个指标的正常范围,自动检测异常。这样既减少了误报,也提高了异常发现的及时性。

第三个是告警优先级排序。AI会根据告警的影响范围、严重程度、历史处理情况,给告警打一个优先级分数。高优先级的告警立刻通知,低优先级的告警汇总之后再通知。这样工程师可以先处理最重要的问题,不会被不重要的告警分散注意力。

第四个是告警根因关联。当多个告警同时出现时,AI会分析它们之间的关联关系,找出最可能的根因告警。比如数据库慢查询导致了应用响应慢,应用响应慢又导致了网关超时。AI会判断数据库慢查询是根因,把它标记为根因告警,其他的标记为衍生告警。这样工程师可以直接从根因入手,不用一个个排查。

故障诊断的智能化

故障诊断是运维中最考验经验和能力的环节,也是AI能发挥很大作用的地方。

传统的故障诊断依赖工程师的经验。遇到故障的时候,工程师需要登录服务器、查看日志、检查指标、分析链路,一步步排查。这个过程耗时耗力,而且不同工程师的能力差异很大,新手可能要排查几个小时,老手几分钟就能定位。

我们用AI来辅助故障诊断,主要做了几件事情。

第一个是智能日志分析。遇到故障的时候,AI可以自动检索相关的日志,提取关键的错误信息和异常模式。AI还能理解日志的语义,把不同格式、不同来源的日志关联起来分析。比如应用日志里报了一个数据库连接错误,AI会自动去查数据库的日志,看看数据库那边有没有对应的异常。这样大大加快了日志分析的速度。

第二个是指标异常分析。AI可以自动分析故障发生前后的各项指标,找出哪些指标出现了异常,异常的时间点是什么,异常之间有什么关联。比如故障发生前五分钟,数据库的连接数开始上升,三分钟前CPU使用率开始飙升,一分钟前响应时间开始变长。AI会把这些指标的变化时间线整理出来,帮助工程师快速理解故障的发展过程。

第三个是故障知识库匹配。我们把历史上的故障案例整理成了知识库,包括故障现象、原因、处理方法、预防措施。遇到新的故障时,AI会根据故障的现象和特征,在知识库中匹配相似的历史故障,给出可能的原因和处理建议。很多常见的故障,AI匹配的结果非常准确,工程师直接参考历史案例就能快速解决。

第四个是诊断建议生成。综合日志分析、指标分析、知识库匹配的结果,AI会生成一个诊断报告,包括可能的原因、影响范围、建议的处理步骤。工程师可以参考这个报告来做决策,而不是从零开始排查。对于新手工程师来说,这个功能特别有价值,相当于有一个资深专家在旁边指导。

需要强调的是,AI的诊断建议只是参考,最终的判断和决策还是要由人来做。AI可能会误判,特别是遇到之前没有见过的新型故障时。所以我们的流程是,AI给出建议,工程师审核确认之后再执行。

根因分析的智能化

根因分析是故障处理的关键环节,也是最难的环节。

很多时候,故障的表面现象和根本原因之间隔着好几层。比如用户反馈网站打不开,表面现象是网站不可用,直接原因可能是应用服务挂了,应用服务挂了可能是因为内存溢出,内存溢出可能是因为某个接口有内存泄漏,内存泄漏可能是因为某次代码变更引入了bug。要找到最根本的原因,需要一层一层往下挖。

传统的根因分析靠工程师的经验和直觉,效率不高,而且容易遗漏。我们用AI来辅助根因分析,主要做了几个方面的工作。

第一个是调用链分析。我们的系统有完整的分布式追踪,AI可以分析故障发生时的调用链,找出哪个环节出了问题,问题是怎么传播的。比如一个请求从网关到应用到数据库,AI可以分析每个环节的耗时和错误,定位到是哪个服务导致的问题。

第二个是变更关联分析。很多故障都是由变更引起的,比如代码发布、配置变更、扩容缩容等。AI会自动关联故障发生前后的所有变更,找出最可能导致故障的变更。比如故障发生前十分钟有一次代码发布,AI会把这次发布标记为可疑变更,建议工程师回滚或者检查发布内容。

第三个是因果推理。AI会基于系统的拓扑结构和历史数据,构建一个因果关系模型。当故障发生时,AI会用这个模型来推理,从故障现象反推可能的原因,给出每个原因的概率。比如网站不可用,AI会给出几个可能的原因:应用服务故障(概率60%)、数据库故障(概率25%)、网络故障(概率10%)、其他(概率5%)。工程师可以按照概率从高到低排查。

第四个是根因验证。AI给出可能的根因之后,还可以自动做一些验证。比如怀疑是数据库的问题,AI可以自动检查数据库的状态、慢查询、连接数等,验证猜测是否正确。这样可以减少工程师的手动操作,加快根因确认的速度。

根因分析是AI运维中最有价值但也最有挑战的部分。我们目前的准确率大概在70%左右,常见的故障能准确找到根因,但复杂的故障还是需要人来分析。我们还在持续优化模型,希望未来能达到更高的准确率。

自动化运维

自动化运维是AI运维的终极目标之一。

我们把自动化运维分成了几个层次。第一层是告警自动处理,对于一些常见的、确定性的故障,AI可以自动处理,不需要人工干预。比如磁盘满了自动清理日志,服务挂了自动重启,流量高了自动扩容。这些操作风险低、频率高,交给AI自动处理能节省大量人力。

第二层是变更自动化。比如日常的代码发布、配置变更、扩容缩容,AI可以自动执行,并且在执行过程中监控系统状态,如果出现异常自动回滚。这样既提高了变更的效率,也降低了人为操作失误的风险。

第三层是故障自动恢复。对于一些常见的故障模式,AI可以自动执行恢复操作。比如应用响应慢,AI会先检查是不是资源不够,如果是就自动扩容;如果扩容之后还是慢,再检查是不是有慢查询,如果是就自动kill掉慢查询。整个过程不需要人工干预,几分钟就能恢复。

第四层是预测性运维。AI可以根据历史数据预测未来可能发生的问题,提前采取措施。比如预测磁盘什么时候会满,提前扩容;预测流量高峰什么时候来,提前扩容;预测某个组件什么时候可能出故障,提前更换或者修复。从被动响应变成主动预防,这是运维的最高境界。

但自动化运维一定要有安全边界。我们的原则是,所有自动化操作都要有审批机制和回滚机制。高风险的操作必须经过人工确认,不能让AI自动执行。而且所有的自动化操作都要有完整的日志和审计,出了问题能追溯。

数据是AI运维的基础

做AI运维,数据是基础。没有好的数据,再先进的AI模型也没用。

我们在数据方面做了很多工作。第一是数据采集,我们采集了全面的运维数据,包括指标、日志、链路、事件、变更、工单等。数据的粒度要细,时间要准,覆盖要全。

第二是数据治理。采集来的原始数据质量参差不齐,需要做清洗、标准化、归一化。比如不同系统的时间格式要统一,不同服务的日志格式要标准化,指标的命名要规范。数据治理是一个枯燥但极其重要的工作,我们花了很多时间在这上面。

第三是数据存储。运维数据量很大,特别是日志和链路数据。我们用了分层存储的方案,热数据存在高性能的存储里,冷数据归档到低成本的存储里。同时做好数据的生命周期管理,该保留的保留,该删除的删除,控制存储成本。

第四是数据标注。AI模型需要标注数据来训练,特别是故障诊断和根因分析的模型。我们建立了一套数据标注的流程,运维工程师在处理完故障之后,需要标注故障的类型、根因、处理方法。这些标注数据用来训练和优化AI模型。标注数据的质量直接决定了AI模型的效果,所以我们很重视标注的质量。

很多团队做AIOps失败,就是因为数据基础没打好。数据不全、质量差、没有标注,模型训练出来效果不好,然后就觉得AIOps没用。其实问题不在AI,而在数据。

人机协作的流程

AI运维不是AI自己在运行,而是人和AI协作的过程。建立好的人机协作流程非常重要。

我们的流程是这样的:告警发生后,AI先做初步分析,包括告警聚合、优先级排序、根因猜测、诊断建议。然后把分析结果推送给运维工程师。工程师收到通知后,参考AI的分析结果,判断故障的严重程度和处理方案。如果是常见的、低风险的故障,工程师可以授权AI自动处理;如果是复杂的、高风险的故障,工程师手动处理,AI在旁边提供辅助。

故障处理完之后,工程师需要做复盘,记录故障的原因、处理过程、改进措施。这些复盘数据会进入知识库,用来优化AI模型。同时,工程师会对AI的分析结果做反馈,哪些是对的,哪些是错的,帮助AI持续学习。

这个流程的核心是,AI做初筛和辅助,人做决策和负责。AI的价值是提高人的效率,而不是取代人。人和AI各有优势,人有判断力、创造力、经验,AI有处理速度、数据量、不会疲劳。把两者结合起来,才能达到最好的效果。

踩坑记录

做AI运维的过程中,我们踩了不少坑,这里记录几个典型的。

第一个坑是盲目追求大模型。刚开始的时候,我们以为用最大的模型就能得到最好的效果,结果发现大模型虽然能力强,但推理速度慢、成本高,而且对于运维这种专业领域,通用大模型的效果并不比专门微调过的小模型好。后来我们改成了小模型加领域微调,效果更好,成本也更低。

第二个坑是忽视误报的影响。AI告警刚开始上线的时候,误报率比较高。我们觉得误报总比漏报好,就没太在意。但时间长了,工程师对AI告警产生了"狼来了"的心理,看到AI告警就忽略,结果有一次真的故障也被忽略了。后来我们花了很大力气降低误报率,才重新建立起工程师对AI的信任。

第三个坑是没有灰度上线。有一次我们上线了一个新的AI根因分析模型,没有灰度,直接全量上线。结果模型有bug,给出了错误的根因建议,导致工程师排查方向错了,故障处理时间延长了。从那以后,所有AI模型的上线都必须经过灰度,先在小范围验证,没问题再全量。

第四个坑是数据质量问题。有一段时间AI模型的效果突然下降,排查之后发现是某个系统的日志格式变了,导致数据解析出错。我们没有做数据质量的监控,所以没有及时发现。后来我们加了数据质量的监控,一旦数据格式或者内容出现异常,立刻告警。

经验总结

最后总结几个AI运维的核心经验。

第一,从简单场景开始。不要一开始就想做全自动运维,先从告警降噪、日志分析这些简单的场景开始,做出效果,建立团队的信心,然后再逐步深入到故障诊断、根因分析、自动化运维。

第二,数据先行。做AIOps之前,先把数据基础打好。数据采集、治理、存储、标注,每一步都要做好。没有好的数据,再好的模型也没用。

第三,人机协作。不要想着用AI取代人,要想着用AI赋能人。建立好的人机协作流程,让AI和人各自发挥优势。

第四,持续迭代。AI模型不是上线就完事了,需要持续地优化和迭代。收集用户反馈,不断用新的数据训练模型,才能让AI越来越好用。

第五,安全第一。AI的自动化操作一定要有安全边界,高风险操作必须人工审批,所有操作都要有审计和回滚机制。不能为了追求自动化而牺牲安全性。

第六,管理期望。AIOps不是银弹,不能解决所有运维问题。要让团队和管理层对AI运维有合理的期望,不要过度承诺,也不要因为暂时的效果不好就放弃。

写在最后

AI运维是一个很有前景的方向,但也是一个需要长期投入的方向。它不是买一个AI产品就能解决的,需要在数据、模型、流程、组织等各个方面持续建设。

我们做了两年,也只是刚入门而已。还有很多问题没有解决,很多场景没有覆盖,很多模型需要优化。但我们已经切实感受到了AI运维带来的价值:告警少了,故障处理快了,工程师的负担轻了,系统的稳定性也提升了。

如果你正在做AIOps,希望这些经验能给你一些参考。如果你还没开始,也建议你从简单的场景开始尝试,慢慢积累经验。

最后用一句话来结束这篇文章:"AI运维的本质不是用AI取代运维,而是用AI让运维更智能、更高效、更有价值。"

愿每一个运维工程师,都能在AI的帮助下,从繁琐的重复劳动中解放出来,做更有价值的事情。