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