讲师简介
自我介绍
我是来自于腾讯社交网络事业群的梁定安,今天我给大家带来的分享是关于我们做了几年的智能监控实践的分享。 我们事业群是负责社交网络的,就是传统的QQ、QQ空间、QQ音乐业务,跟游戏场景有些不同。 所以,我们在做社交应用监控的过程中,遇到了一些什么样的问题,我们做出了什么样的思考,最终落地的实践是什么样的,我今天希望重点跟大家探讨这些实践经验,以及在这个过程中的思考。 监控的意义我们今天的主题运维自动化是效率提升的一个话题,今天早上也有嘉宾分享过,效率对产品、开发、业务价值来说其实没有特别地显性,运维自动化更多受惠的是运维自己,真正给运维带来价值的是我们对质量的保障。 通过我们做的一系列的监控、自愈等等运维功能,其实都是为了体现我们运维岗位能给业务带来的一个价值。所以,我认为质量是运维最重要最优先去关注的。 运维在关注质量方面主要是三个方面:可靠性、可用性、用户体验。 你的程序是不是可靠的,通过对可靠性的管理、监控来实现对可用性的评估,提出优化建议。通过不同功能、微服务的可靠性可以计算出业务可用性。 最终,所有对可靠性和可用性的度量,都是为了提升用户使用我们的产品的体验,让用户体验变得更快、要爽、更好,这是我们做监控的意义。 监控的手段怎么样能够保证我们产品的服务质量和用户体验呢? 通过三种手段可以做到,也是我们谈监控经常谈到的手段, 主要分为三种:
主动,所有的业务开发出来的应用程序,在上线之前能够按照运维的要求,或者自身对代码质量的监控,提前做好了很多埋点。 这是最好的开发和运维的合作模式,但却是可遇不可求的。 因为很多业务在专业运维团队接管之前就已经存在,运维面临的最大困难就是历史包袱,一个业务可以没有产品,可以没有开发,但是一定不能没有运维。 在腾讯社交网络的业务发展的十几年时间里,很多长尾业务真的是连研发团队、产品团队都已经没有了,但是服务仍然在对外提供正常的服务。 面对种种历史包袱或者规划不周全的问题,监控除了主动手段外,还需要第二种方案,就是被动监控,一种从外部探测而非自主上报的被动行为。
被动有一个先天性的好处,不是强依赖研发团队配合,我们无痛式的去监控,但是这种能监控的粒度往往却是有限的。 旁路监控,主动和被动监控做好了,不代表用户对我们的产品体验是满意的。
监控的本质掌握了监控的主要手段后,我们该怎样衡量各类不同的监控点呢?请求量、成功率、延时。 所有监控点的度量,都能收拢到这3类指标中。如CPU百分之百了,反馈在我们的服务上就是成功率的下降或者延时的上升。 这三个指标点怎么样产生数据的价值和反馈出问题呢? 通过趋势对比,同比、环比、波动分析、聚类等数据加工分析的策略,来更直观的突出数据中需要技术人员关注的焦点。
并且,我们所有的监控数据最终都是会以图、表、告警的形式,通知关注这些监控点的人。 监控系统的目标——全、快、准我们做任何一个监控系统都希望做到全、快、准,就是无盲点,360度无死角,并且又快又准,没有误告警。 但是实现起来很困难,从某种意义上来讲,监控速度要快又要准是有点相矛盾的。
我们怎么样能够权衡,能够做到又快、又准、覆盖全呢?一旦全了,数据量就很多,数据多产生的告警点就很多,怎么做到呢?我们带着这个疑点,看看我们在实践中是怎么做到的。 全链路监控
随着移动互联网的兴起,用户在访问到我们社交服务的时候,全景的链路大概是这样的(图),首先用户在自己终端设备上发起的访问,会经过很多不同的网络到达我们的后台服务中。 移动互联网让这个网络变得更复杂化,我们有不同的接入方式,有不同的运营商。 同时,移动互联网又把我们暴露在用户侧的客户端的版本碎片化,有很多版本,有很多不同厂家不同型号的智能手机,有安卓,有IOS等等不同的系统。 因此,我们要做到全面的监测,就必须在整个全景链路中设置很多功能不同的监控点。 腾讯在我们的社交业务场景下设置了很多的监控点,这是一张全景图,图上有很多小字母,每个小字母代表了不同的监控类型,我们分为网络类、服务端类、基础类。 又专门针对移动互联网的特殊性做了很多,比如卡慢分析、多维度分析、舆情监测,这些都是具体的监控点。 监控的速度有了这么多监控点,怎么样保证所有监控点的监控数据能够快速地被加工、处理,最终传递到最需要关注的人手中呢? 我把监控数据从采集到最终终端用户收到产生的异常信息及单个监控点的数据从采集到最终产生告警的耗时做成瀑布流。 大家可以很直观的看到一个监控点的数据怎么样加工计算才能保证最优最快或者最性价比最高,怎么样让我们的告警又快又准? 可以优化的点需要我们深入探讨和挖掘,由于时间关系,只能简单列举一二。 统一上报协议为了降低计算的复杂度。我们把所有的数据归为三维数据和多维数据。 三维的数据就是一个ID,你上报的监控是什么类型的,你的ID、你的时间、你的值,我们就可以做针对性的告警或者图形展示的一些优化,让我们的处理速度会变得更快。 多维,因为社交网络提供的业务类型、对用户的服务也是多种多样的,有QQ,有音乐,有图片、文件、微云,针对这些不同的服务场景,它其实都是多维的场景,我们就把它们按场景区分,分别统一几类通用的多维协议,然后我们的后台流处理集群可以针对每类多维监控的场景,定制流计算逻辑,按照用户使用数据的形式将多维数据做加工处理。 如果我们后台用了一个关系型数据库存储,过多的数据维度,会让在做监控可视化时,无法获得高效的查询性能。 我们怎么样解决其中的矛盾呢?如果数据的纬度特别大,随便列举一个维度大于30的案例,腾讯亿万级量所产生的监控数据绝对是“亿亿”级的。 为了解决这个问题,我们把每一块都设计成微服务化,我们用了开源的svr、kafka、Storm,再落地存储。
为了优化这个问题,我们微服务化的分工也是基于这种理念,运营开发更专注于对Storm逻辑的一些封装,专注于原始数据的高效加工处理,然后,告诉数据消费者(运维)有什么样的数据,在数据银行中提供了哪些数据的类型,提供了哪些丰富的接口,所有产品化的工作都是由运维来实现的。 整个架构图其实都是运营部来做的,但运营部内部又可以按照不同的功能模块孵化出各自负责工作的职责范围,基于这些职责范围我们就可以更好地相互协作,相互地分享各自的工作成果,这是为了达到快的目标,统一协议,优化我们的分工的一个架构。 准:智能监控准,以告警举例,通常告警的产生基于阀值或算法的策略,把异常的监控数据点找出,然后系统把过去运维人员处理的异常问题的经验变成一个个自动化的工具,像自愈、收敛、根源分析这样的延伸功能特性,来达到我们对准的诉求。
我们今天主要探讨一下怎么样找到根源的问题,让我们的告警变得更加智能,而不是“点”的告警。过去我们做了很多监控点,我们怎么样通过点的监控去做好“面”的告警呢? 其实做所有事情都是有一些机缘的,因为在业务上面临很大的挑战,过去我们一步一步去构建监控体系的时候,我们埋了很多监控点,当我们的业务体量一上来的时候,这些监控点就变成运维人员的负担,我们对业务逻辑监控、主机也监控、网络也监控,用户投诉过来的时候,我去查,很多点都在告警,究竟哪个点的告警最应该关注呢? 运维和研发人员的人数配比是相差巨大的,一个运维可能对应了上百号开发,我不可能要求一个运维关注到方方面面。在我们这么高可用架构的前提下是不是还应该关注一些“点”的问题呢?带着这个疑问,我们继续。 海量监控的困扰这是一张腾讯广告其中的一个拓扑图,这张图想表达一个问题——像网一样,很乱。 当一个节点发生异常的时候,会把告警扩散到各个点,因此我们需要一个智能的监控分析的引擎,去帮我们解决这里的一些问题。 ROOT智能监控系统腾讯的体量在中国互联网是用户最多的,QQ同时在线用户数,在2014年就已经突破2亿,创造了世界的吉尼斯记录。 2015年红包的时候甚至达到2.15亿同时在线,整个社交网络有大于十万台的服务器在支撑着这么大体量的业务,每天我们会产生4万条以上的告警,人均的告警量大于500条,有些比较极端的一天收3000条告警短信。 当告警量大于500条,你的所有问题都发现不了,上班只有看告警就什么事情别做了。 因为业务量的庞大复杂,而产生大量的告警,我们过去所有的收敛办法都是基于一个垂直监控点的收敛,但是监控点一旦多起来,点和点之间怎么收敛呢? 因此端到端的智能监控应运而生,基于业务架构,结合数据流的关系,通过时间相关性、面积权重等算法,将监控告警进行分类筛选,发掘有业务价值的告警,并直接分析出告警根源。 假设我们在这个架构图上发现了一个问题,我们的DB挂了,会层层往前推,我们的逻辑层、接入层、负载均衡,甚至到我们的用户端报上的成功率都会受到影响。 但是运维并不希望收到这N个现象告警,我们希望把DB宕机的根源告警发出来,其他告警都收敛掉。 首先,我们基于我们的业务拓扑图,根据时间的相关性,把告警都叠加在链路上,把一些不需要关注的点都过滤掉,最后得到一个经过经验分析的模型。 很简单的一个例子,变更容易引起告警,DB更容易是根源告警,越靠后的告警越容易是根源的告警,通过这个模型算出根源的问题。 降维策略我们采用自动生成拓扑图的方法,利用社交网络事业群的通用路由组件L5、模块间服务调用监控的基础数据作为我们绘制业务拓扑图的基础数据源。 还有一个靠tcpdump抓包的方式,TCP的请求是有序的,UCP的连接也是可以加工的,虽然它发起的端口是随机的,但我们通过对数据的积累一段时间,就可以清楚地知道这个UDP服务的主调和被调的关系是什么样的。 随后,把网状的拓扑变成一条一条的访问关系链,得到这条线之后,我们开始做相对应的关联分析的逻辑。 我们把相关时间的告警叠加上来,我举一个例子,10:20到10:30分钟之间产生了这样一些业务告警,在这些模块都有发生,B这个模块产生了业务告警,E产生了发布变更告警,D这个模块产生了基础告警。 通过权重算法对这些链路进行排序,再套上模型分析,找到我们最需要关注的一条链路。 如果这里按照过去监控点的玩法,我们会产生大于10条的告警,但是我们是希望把这十条告警收敛成这个链路的告警。 其实我们现在在举例试图让大家更好地理解我们设计这个面监控的思路。 时间相关性分析这张图是我们的系统截图,把我们的链路从横向换成纵向,有一些模块在很长一段时间内都会有一些监控的异常。
在一个大的集群下每天都会有一些东西挂掉,但是又不影响,它的处理优先级很低,但它一直产生告警,因为它有监控点。 这些监控点怎么不跳出来影响系统的分析呢? 通过时间相关性的分析,长期存在的红点都是监控到异常,究竟有没有发出来被收敛掉了是监控系统自身的问题,但是全盘分析中这些监控点会被过滤掉,它的权重是很低的,这个告警是可以忽略掉的,因为它一直都存在。 通过时间相关性的分析,系统会把持续性的,跟延时等等相关的问题,都会过滤掉。 权重面积分析过滤完没有用的告警,还是有很多告警,怎么样能够在众多的链路中找到我们最应该关注的链路呢? 面积权重的算法有一个口诀,越靠后的模块越有可能是根源的问题,相连产生的告警越可能是根源的问题。 基于这样的一个原则,我们把它变成了每条链路都可以算出一个面积值。 这样把各个功能模块介绍完之后,我们的架构基本上就可以出来了。 首先,要做这个事情,我们必须要有一些基础数据,就是我们的业务拓扑、我们的访问关系连,通过日积月累的数据整理可以得到。
当我们各个告警渠道有异常产生的时候,就开始过滤的动作,最终把我们筛选出的链路做排序,再套用我们以前遇到的一些模型、经验去分析它,最终给出根源问题。
质量体系:生态构建回到我们做监控的本身,是不是光有监控能力就能解决一切的问题呢? 大家可以想一下,运维能做的是最大程度地帮助你降低影响,但是不能保证这个问题如果是程序代码的问题也能被根治。 通过报警能力的建设,把质量生态建设起来,光靠运维团队自己是没有办法做好这个事情的,我们为了更好地做好监控,为了能够让产品给到用户最好的体验,需要有更多的角色与运维配合着一起去做很多事情。 天网体系我们把不同的监控点,按照一个业务架构层级的不同做了一个分类。这个分类就代表了每一类最应该由谁负责跟进,相当于是给每个人负责一大堆的监控点的现状做了减法。
为了优化这样的问题,我们专门对所有的监控点按照不同的角色要关注的内容不同做了一个分类,就像用户端舆情的监控,舆情的监控拿手机应用举例,更多的是产品体验的一些问题,说不定用户喷的是按钮摆在右面不习惯,我要摆在左面,或者说他喷的功能性的问题。 我们希望把系统的告警是分级的,根据不同的告警优先级走不同的告警渠道,有QQ、短信、微信、电话,不同的人不同的告警,不同优先级的告警渠道来分发。 运维是主要构建一个监控的能力,并不是运维会收所有的告警,运维只收最关键的告警。 这里还有一个DLP(生死点),是下面三层所有监控点,这么多监控点如果放在一个模块里,这个模块所有的点可能都告,但是我们希望这个模块只告一个,这就是它的DLP。 你的一个agent告警不是决定服务生死的关键,那就是agent的负责人去跟进,选定一个能够决定这个模块生死的监控点作为模块的唯一运维负责的监控点,质量由运维来负责。 其他的如网络问题,负责基础网络的运维去看。 应用运维,负责业务的质量,应该投入100%的精力处理好DLP监控点的所有异常。通过DLP监控点再去与智能监控分析做整合,再对链路中各个模块的DLP进行一次收敛,每条链路只看一个点,每条链路根据相关性进行收敛之后,得出一条链路。 通过这个,我们把监控点做一个减法,很好地把告警收敛掉。 天网:质量体系我们的监控体系是闭环的:监控能力、业务可用性、用户体验、技术解决、统计分析、持续改进。 我们希望构建这样一个质量体系,把开发、运维、客服、QA、老板、产品都卷进来,运维在这里搭这样一个舞台,让大家共同参与演出,贡献力量。 监控其实就是一座很高的雪山,这里的坑很深,很难挖。我们正在探索不同的方法去攀登征服这座雪山,今天分享的这个系统未必能够解决所有的问题。 但在我们实战一年多的时间里,确实能够真正帮助运维解决一些问题,我们的告警没有以前那么多了,重新梳理了我们整个体系的生态,让更多的人进入我们的生态贡献自己的一份力量。 我今天的分享结束了,谢谢大家! Q&AQ1:主动、被动、旁路,这三种在整个告警量的范围内,比例分别是怎样的?这三路产生的效果分别怎样?
Q2:请教一下,报警之后就可以做自愈吗?
Q3:有没有一个类似的指标来说?我刚才听说92%,已知告警92%以后,自愈的报警比例是多少?
Q4:怎么保证告警收敛不会收掉有用的告警?你们制订的规则中怎么让它制订得全?
想和大梁老师亲密接触?那么,请来将于9月23-24日举行的GOPS上海站 这一次他将作为运维自动化的出品人 并另外贡献海量运营规划相关的主题演讲 8 折优惠截止7月29日,欲购从速! |
|