本文作者是 吴城 联系方式: autohomeops@autohome.com.cn ,主要负责汽车之家云平台的开发和技术管理工作。 个人Blog http://jackywu.github.io/
我们是汽车之家运维团队,是汽车之家技术部里最为核心的团队,由op和dev共同组成。我们的目标是为汽车之家集团打造一个高性能,高可扩展,低成本,并且稳定可靠的网站基础设施平台。 团队技术博客地址为 http://autohomeops.corpautohome.com
可以通过邮件或者在官方技术博客留言跟我们交流。
在《汽车之家监控系统的第一次里程碑》](http://autohomeops.corpautohome.com/articles/汽车之家监控系统的第一次里程碑/)之后,我们实现了如下几个小Feature
而后,我们又希望能够实现所谓的“自动故障定位”,来提升问题诊断的效率。
我们认为,一个异常问题的发生,必定是有一个或者多个原因导致的,我们用“事件(Event)”来描述这个异常。网站的QPS增大超预期是一个事件,后端接口响应时间变大超预期是一个事件,服务器的CPU-Load增大超预期是一个事件,有人对MySQL服务器进行了配置变更是一个事件,有人进行了一次业务代码发布也是一个事件,找出这些事件之间的关系是实现故障定位的关键。
我们理解有两种故障定位的方法
我们目前在实践第一种方法。
为了方便进行分析定位,我们对所有采集的监控指标进行了分类
解释
通过分层,我们将问题分类在我们熟知的范围内。
重点是:“服务” 和 “模块”
这两个概念的定义,为下面的模块调用关系奠定了基础。
大写字母代表”服务“,如A服务;小写字母代表”模块“,如a模块;箭头代表调用或者结果返回关系
我们认为有如下几种确定事件之间关系的方法
那么,首先我们得需要一个统一的“事件库”来收集所有事件。
我们认为形成事件的来源有这么几个
我们认为一个对象产生异常的影响因素来自于这几个方面
对于第一点,我们只要将自身的4层指标监控完整,就能够做到可控的程度。 对于第二点,需要我们完整确定每个模块的调用关系。 对于第三点,是我们尤其担心的一点,因为我们很难收集全所有的外部事件,我们使用了如下的方法来尽量实现这个目标。
对于事件总线这块,我们这几个系统的是这样工作的
我们目前使用的策略
根据“模块调用关系”和“指标分层”的概念,采用递归的方法去遍历所有事件,得到一个疑似故障原因诊断报告。
范例如下
“广告服务”的接口响应时间异常(为3s),疑似原因为“索引模块”的服务器xxx.autohome.cc磁盘util异常(为98%)。
业务层指标是直接反应出服务质量的,是最能代表用户体验的,所以在业务层指标异常发生的时候,我们通过SaltStack这个远程执行通道在服务器上执行snapshot脚本保存当前服务器的运行状态快照,该脚本其实是平时运维在发现问题后登陆服务器上执行常规命令的一个标准化封装,所做的事情有:
ip addr show
指令输出 Dig autohome.com.cn
指令输出 Ping -c 3 autohome.com.cn
输出 同时,在监控系统的“最新问题”页面,点击“现场快照”,上面的信息会直接呈现在页面上,并且点击“历史数据”,页面上会显示问题发生时刻前后30分钟的历史数据曲线,包括CPU,内存,硬盘,IO,网络流量,等等,方便运维快速定位问题。
通过ELK构建日志分析系统,在如下两个方面满足故障定位的需求
监控系统的建设真是个任重道远的活,上文只是部分实现了事件关联分析的内容,下一步我们计划在“决策推理”方面进行研发,以提高定位的精准度,为后续的故障自愈打下基础。文中有任何不妥之处,欢迎大家指出。