随着互联网产品规模的爆发式增长,大型分布式系统的监控复杂性也日益显现。工程师们发现:监控遗漏导致宕机的黑天鹅现象频繁发生;出现故障时很难从海量监控指标中迅速找到故障根因;报警风暴极大地干扰了工程师定位问题的速度;故障恢复速度基本依赖于工程师的操作速度。由此,我们尝试建立一个智能运维监控系统,希望用智能化的手段去帮助工程师解决这些问题。
一、百 度 数 据 情 况
随着百度各产品的蓬勃发展,百度的服务器数量也呈现出爆发式增长,最近5年增长了大概20倍的规模。与产品规模不断增长相对应地,运维人员每天会收到越来越多的监控报警,面对海量的运维指标,如何快速定位问题所发生的业务层面,达到精准化报警、快速解决问题的目标就成为运维监控常态化的需求。
百度监控系统数据规模,单以时间序列数据为例,不包含日志类数据。
服务器指标数量:>1亿
业务指标数量:>8千万
数据增长速度:50TB/日
二、运维中面临的监控问题
当前,面对复杂的业务监控和问题诊断,运维人员想找到指标和事件之间的关联关系,进行因果关系推导,并最终定位故障,基本依靠人的经验来进行。但随着业务和监控规模的膨胀,运维也希望能够更加自动化、智能化地达成保证服务高可用性的目标,即快速的问题发现、分析定位或止损。
下面,我们可以从发现问题—分析问题—解决问题的思路出发,逐步给出递进的解决方案。
三、发现问题篇:异常自动检测
日常运维的业务指标数据会出现一些环比昨日的明显异常、持续偏离的明显问题和随着时间周期漂移的指标数据等问题,以前这些监控的配置基本靠工程师经验或持续的迭代修正,甚至纯人工排查。随着监控系统的发展,可以通过制定监控标准和自动化监控部署实现运维的标准化和自动化,最终的目标,是希望用智能化的方法彻底解决这个问题。
一般,在系统出现指标数据波动时,需要先判定是否确实为异常情况,确定异常后再实现精准报警。那么,怎么自动检测业务的异常指标,帮助运维工程师和开发工程师处理问题呢?
这里主要有两个策略,自动恒定阈值设定与动态阈值设定:
1.恒定阈值设定法
对于普通数据,运维人员在服务器端设定服务器应用指标超过某合理数值自动报警,并对服务器异常的波动状态进行报警。这个可使用一些标准的统计学方法去自动计算这个阈值,取代人工配置成本。
参考方式:
基于历史数据统计
假设正态分布
3-sigma策略
2.动态阈值设定法
百度大多数业务数据的流量呈现很强的天周期特性,在某时刻出现数据波峰的骤降或波谷数据的骤增等变动情况时,恒定阈值法很难解决这类问题的精准异常判断。那么我们可以把上述方法衍变升级一下,采用动态时间窗口的阈值设定法来解决周期性数据的异常判断。
参考方式:
多分布形式:将数据分段
按天同期计算统计阈值
分段3-sigma策略
3.恒定阈值和动态阈值的使用
针对以上两种阈值划分方式,异常检测系统如何知道应该对每组数据进行什么样的异常检测策略呢?这就需要一种方法提前对数据进行分类,可以采用一种可判断数据是否具有周期性趋势的分类器方式来解决。如果数据具有很强的周期性特征,建议使用动态阈值设定法;如果数据分析后没有周期性特征,那么使用恒定阈值就可以了。
另外,我们还会遇到这种特殊的情况,数据会随时间出现漂移。比如某产品流量,会按照工作日、周末、传统长假等时间呈现出不同的数据特征,产生阶段性变化。这个时候要进行异常检测,就不仅要考虑数据的普通周期性,还要考虑季节性和趋势性的变化。监控系统可通过对日常数据进行分析,采用三次指数平滑等方法,对数据本身的趋势性进行学习。
当然,上述方法都是基于从历史数据进行学习分析从而进行异常检测的,如果缺少历史数据,那么对于这些指标,基于历史数据进行同环比分析的意义就不大,核心就转化为检测数据有没有突升和突降异常。可采用类似于局部平滑的方法查看真实数据与局部平滑后数据有没有大的出入,如果差距较大,可判断为有大的突升和突降,可以标识数据异常。
参考方式:
局部平滑法
速度法
经过经验的积累,对于核心产品的流量变动,即使波动不大,监控系统也可以做到灵敏且精准的指标监控,能够快速发现异常情况。当然,全自动的异常检测系统难免会出现误报、漏报等情况,这就要求异常检测系统需要支持工程师的标注与反馈,百度监控系统的自学习能力可以根据工程师的需求进行动态调整,可同时支持人为调整和系统自动参数学习调整,系统可自动根据工程师的标注或报警量的多少,进行参数训练,把异常检测参数调整到合理的范围。
工程师标注
修改参数
标记未检测到的异常
标记错误的报警
机器学习
标注报警 => 参数训练
综合上述方法,百度智能监控系统中的自动异常检测最终形成两种状态的结合:离线状态和在线状态,离线部分可根据历史数据进行分类学习、参数训练,而在线部分能够进行最终的异常检测和报警。
具体的组成如图所示:
四、发现问题篇:精准报警
监控系统仅仅发现了问题还不够,由于指标数量太过繁杂,为了起到辅助工程师快速解决问题的效果,还需要做到精准化报警。百度的精准报警主要分成两个层面,一个是单个指标的报警是否足够精准;这里需要考虑两个问题,一是是否每次异常都应该报警?需要容忍系统毛刺的存在;二是异常过滤,把离散的异常点转化为异常事件或状态,找到指标和事件的关联关系。
在单一指标的报警足够精准的基础上,另一个是把不同指标的报警结合起来做到足够精准。如何把多个指标的报警综合起来呢?简单策略是固定时间窗口来报警,时间相近的报警可进行一定的合并,只要将首先出现的指标报警送达给到运维人员即可。从整个监控策略来看,把报警综合起来,同类的报警进行合并来报给运维人员。复杂一些的策略是关联挖掘,把历史上产生的运维报警和事件关联起来报警,同时,某些报警经常频繁地一起出现,可以认为这是同一个报警,不再单独分别进行报警。
采用的具体策略有:
1. 报警合并简单策略
固定时间窗口
相同监控策略
相同监控对象
2. 报警合并复杂策略
关联挖掘
合并置信度较高的频繁项集
3. 报警依赖
策略依赖
异常依赖
五、分析问题篇:关联分析
监控系统不仅需要帮助工程师发现问题,同时还需要通过建立关联分析,进行辅助问题定位,甚至迅速找到相关的指标或影响。那么,如何为复杂多样的运维数据建立关联呢?
产品服务层级的关联关系图:
运维工程师可以把一些基础的关联关系配置到监控系统中,可以让监控系统明白一些常态化的运维指标与其它指标是否存在关联,比如多个模块的异常是否存在关联、服务器升级或者部署产生问题是否与数据中心或交换机异常有关等。
具体的实现策略有:
1.关联挖掘
(1)事件和事件间的关联
频繁项集挖掘
所有运维事件
(2)事件和时序间的关联
指标异常经常与部署升级事件相伴发生
问题诊断&故障定位
(3)多时序间的关联
2.关联可视化
通过关联变动,帮助运维人员分析重点数据的变动情况。
(1)事件&事件关联
(2)事件&时序关联
3.服务透视定位问题
运维事件多是与时间持续紧密关联,我们可以把运维事件按照时间轴演进顺序进行展示。同时,运维工程师常常接触的服务拓扑,本身也是一种运维模块的关联关系。把这些离散的运维数据通过模块关联、时间关联、数据流关联等紧密地联系起来,构成一个完整的服务透视图,如果异常发生在关系透视图中的某个部分,就可以按照周边关系的通路来快速定位问题。
(1)模块调用关系
(2)事件和模块关联
六、分析问题篇:故障定位
仅仅找到关联还不够,真正分析业务问题解决问题才是关键。这里介绍两个常用的辅助定位问题策略。
1.多维数据分析
监控系统采集到的很多指标具备包含关系,很多情况下,一个总体指标是由许多子指标加和构成的,或者也可以说成是总体维度是由许多子维度组成的。监控系统可以计算出每个子指标或子维度占总指标总维度的百分比,并按照影响权重去进行分析,当某个子指标的变化幅度对总体指标影响权重最大,我们就倾向于认为这个指标可能是问题的原因。
举个例子,百度的总体流量指标对应每个地域的流量之和,总体流量有问题有可能是某个地域流量出现问题,找到目前对总体流量变化影响最大的地域进行问题处理就可以解决问题。同样的道理也可以推广到其它情况。
2.故障诊断树
运维人员可以通过数据可视化(热力图、多维报表)的形式,结合以前发现问题的经验沉淀模式,发现指标间的强相关,做出问题诊断。那我们是不是可以将运维人员的经验固化到监控系统中,通过不同指标的分析方向和下探方法可以形成树状结构,通过树上的某个节点进行逐级探查。最终形成故障诊断树,通过推导路径不仅可以帮助运维人员快速完成问题出现时的排查过程,节省这部分的定位时间,也很有可能达到直接定位问题或加速解决故障的目的。
故障检测:
(1)领域专家知识
(2)逻辑推导引擎
(3)迅速找到问题根因
七、解 决 问 题 篇
监控系统产生决策
部署调度系统执行
1.单边故障自动止损
单边故障指单个IDC故障、单个链路故障等。比如一个IDC或者某些IDC出现问题,解决办法是切走这部分流量,利用监控系统来做动态的部署调度。通过某个数据中心或链路的部署调整,帮助系统快速恢复,进而实现自动化决策和执行来实现单边故障止损。
具体策略有:
(1)实现自动冗余与调度
(2)智能监控系统负责动态决策
(3)部署调度系统负责调度执行
2.灰度发布自动止损
研发工程师做灰度发布时,可以先做小流量的发布,部署系统可以跟监控系统配合,如果出现问题,直接进行状态终止或回滚,把问题控制在灰度发布范围内。
八、智能运维监控总结
通过上述说明,百度的智能运维监控系统最终形成了一个监控闭环,包含问题发现、分析决策和问题的解决。具体的组成包括异常检测、报警收敛、关联分析、故障定位和自动处理五部分内容。
九、未来运维变被动为主动
1.全方位覆盖
在用户端(APP、浏览器等)、云端(机房、服务器、自身服务、第三方服务等)、管道(链路、运营商)等任何维度进行数据采集并进行异常自动检测。
2. 让监控更聪明
分析运用已有数据,并把服务状态、问题影响分析等可视化
自动学习并理解故障的趋势和模式
自动发现服务或依赖环境的变更
当然,更进一步地,监控系统是不是可以先于故障发生而预测到故障,在故障发生之前就可以处理并解决故障,从而达成产品的超高可用性目标。未来的智能监控应该是这样的,运维工程师经过完善的监控部署,实现全方位的异常自动检测覆盖,同时,在系统刚出现故障征兆,有损之前就进行处理并解决,实现完整的智能化监控系统解决方案。