CAT(Central Application Tracking),是基于纯Java开拓的分布式实时监控系统。开源代码托管在GitHub(搜索CAT即可),作者是吴其敏(qmwu2000,目前在安然任职)和尤勇(youyong205 目前在点评运维部)。
产品干系分享在网上可以找到:
看大众点评如何通过实时监控系统CAT打造724做事-尤勇@QCon高可用架构群 2015
分布式监控系统的设计与实现-尤勇@QCon上海2015
大众点评网监控系统架构阐发-尤勇@2013第二届华东架构师大会
大众点评网监控平台阐发-吴其敏@QCon杭州2012
CAT现状
CAT采取非常开放的Apache License开源,在海内已经有100多家互联网公司在利用和评估,包括大众点评网、携程网、猎聘网、陆金所和找钢网等。截至2016年3月,CAT已经得到了1000多个stars。
设计目标
可扩展:支持分布式、跨IDC支配,横向扩展。
高可用:所有运用都可以倒下了,须要监控还站着,见告它们发生了什么。
实时处理:信息的代价会随韶光锐减,尤其是事件处理过程中。
全量数据:小概率事宜是常态,百万分之一的概率,碰到了便是100%。
高吞吐:要想还底本相,须要全方位的监控和度量,必须要有超强的处理吞吐能力。
故障容忍:CAT本身故障不应该影响业务正常运转,CAT挂了,运用不该受影响,只是监控能力暂时减弱。
不担保可靠:许可丢失,这是一个很主要的trade-off,虽然目前CAT可以做到4个9的可靠性。
CAT架构
架构追求大略、去中央化、分工协作,两层构造,除了依赖外部存储如HDFS和MySQL外,不依赖其他系统,CAT内部全面采取组件化设计和实现。CAT每天量巨大,一台机器是不能处理全部流量,必须分片处理,均衡负载。
业务运用目前利用CAT API进行埋点,后台异步线程采取TCP长连接办法,将源源不断地传输到后台做事器;CAT具有fail-over机制,在后台做事器不可用时会自动切换到另一台可用做事器。CAT目前利用native协议做序列化和反序列化,将来会考虑支持更多协议,比如thrift。
被送到后台,经反序列化后会被放入行列步队,实时消费调度器会将分发到所有消费者内部队列,每个消费者只需处理自己的消费行列步队,各消费者之间彼此相对独立,如果消费速率太慢,导致消费行列步队满,则新来的会被丢弃。范例消费者都采取实时增量打算的办法,流式处理,产生的报表会在当前小时结束后保存到中心数据库中。
日报表采取后台作业的形式,由24个小时报表合并得到。周报表则由7个日报表合并得到,以此类推。
CAT掌握台,即UI层,卖力吸收用户要求,从后台存储中将报表信息取出显示。对付实时报表,直接通过HTTP要求分发到相应消费机,待结果返回后聚合展示;历史报表则直接取数据库并展示。
所有原始会先存储在本地文件系统,然后上传到HDFS中保存;而对付报表,因其远比原始日志小,则以K/V的办法保存在MySQL中。
处理
处理分五个阶段:网络、传输、剖析、存储和展示。
网络阶段:卖力业务运用日志的埋点和采集。CAT目前供应多种措辞的客户端供业务运用程序调用,埋点结果以树的形式存入传输行列步队。如果行列步队满,则会自动丢弃当前。
传输阶段:CAT客户端卖力将客户端传输到后端,CAT消费机卖力吸收。传输前CAT客户端会与CAT消费机建立TCP长连接,不断地从客户端行列步队中取出树,序列化后写入网络;CAT消费机则不断地从网络中取出数据,反序列化后放入消费行列步队。
剖析阶段:卖力报表天生。实时消费调度器会将消费行列步队取出,分发给每个消费者内部队列;报表剖析器只会从自己的报表行列步队中取出树,逐个消费,更新报表模型。CAT以小时为单位形成报表,原始日志转储(raw log dump)是一个分外的剖析器,它不生产报表,而是将存入本地文件系统。
存储阶段:卖力报表和原始日志的存储,目前报表会存在MySQL中,原始日志压缩后存在HDFS中长久保存。保留时长取决于存储容量的大小,一样平常报表会保存3个月以上,原始日志保存一个月。
展示阶段:卖力数据的可视化。作为用户做事入口,卖力报表和原始日志的输出显示。对付实时报表要求,会向各个消费机分发要求,并将结果聚合后输出HTML,在浏览器展示;历史报表会直接取自数据库。XML数据输出是另一种内置的数据展示办法,方便基于CAT开放外围工具。
日志埋点
日志埋点是监控活动的最主要环节之一,日志质量决定着监控质量和效率。当前CAT的埋点目标因此问题为中央,像程序抛出exception便是范例问题。我个人对问题的定义是:不符合预期的就可以算问题。比如要求未完成,相应韶光快了慢了,要求TPS多了少了,韶光分布不屈均等等。
在互联网环境中,最突出的问题场景,我的理解是,超过边界的行为。包括但不限于,HTTP/REST、RPC/SOA、MQ、Job、Cache、DAL; 搜索/查询引擎、业务运用、外包系统、遗留系统; 母/子公司, 第三方网关/银行, 互助伙伴/供应商之间;还有各种业务指标,如PV、用户登录、订单数、支付状态、发卖额。
CAT供应API支持的措辞有:Java,.NET,将来打算支持C/C++、NodeJS、Go、PHP、Python等。
领域建模
此模型可以覆盖大部分业务运用的日常埋点需求。各种类型都有个性化剖析和展示。
树
CAT树如实记录真实用户要求的处理时序,这些要求可能被分布在多台机器上。树可以丰富地表达嵌套关系、先后次序和并行处理,这将有助于开拓者清楚的理解用户要求到底是怎么被一步步实行的,尤其在追踪一些疑难杂症时,这会特殊有用。
只要遵照CAT埋点规范,CAT会自动地将多台机器上的树串起来,可以逐层展示。
当然也有另一种更适宜于人的视图,方便识别突出问题,毕竟人对图形识别更加善于。
CAT API
API力求精简,将来还有进一步优化空间。大部分CAT埋点该当在底层根本架构中完成,一样平常运用层不须要做大多埋点。有些产品利用如java-agent等办法埋点,CAT埋点也可以采取,埋点质量取决于现有运用代码的规范程度和覆盖范围。
实时剖析
CAT的实时性不是用户要看什么,CAT就实时打算出结果,呈现给用户;而是根据日志的特点(比如只读特性)和问题场景,量身定做的。CAT将所有的报表按的创建韶光,一小时为单位分片,那么每小时就产生一个报表。当前小时报表的所有打算都是基于内存的,用户每次要求即时报表得到的都是最新结果,给人一种“实时”的觉得。对付历史报表,由于它是不变的,以是就实时不实时也就无所谓了。
对付内存增量打算,它可以分为:计数、计时和关系处理三种。计数又可以分为两类:算术计数和凑集计数。范例的算术计数如:总个数(count),总和(sum),均值(avg),最大/最小(max/min),吞吐(tps)和标准差(std)等,其他都比较直不雅观,标准差轻微繁芜一点,大家自己可以推演一下怎么做增量打算。那凑集运算,比如95线(表示95%要求的完成韶光),999线(表示99.9%要求的完成韶光),DAU(日活用户数)等,则轻微繁芜一些,系统开销也更大一点。关系处理则涉及图的运算,这里不细述。
报表建模
理解增量打算很主要,但终极须要落实到各个不同的报表上。一个报表每每有多个维度,以transaction报表为例,它有5个维度,分别是运用、机器、大类、小类和分布情形。如果全维度建模,虽然灵巧,但开销将会非常之大。CAT选择固定维度建模,可以理解成将这5个维度组织成深度为5的树,访问时总是从根开始,逐层往下进行。
CAT为每个报表单独分配一个线程,以是不会有锁的问题,所有报表模型都是非线程安全的,其数据是可变的。这样带来的好处是大略且低开销。
报表代码是利用自研的maven plugin自动天生的。所有报表是可合并和裁剪的,可以轻易地将2个或多个报表合并成一个报表。在报表处理代码中,CAT大量利用访问者模式(visitor pattern)。
存储
存储是CAT最有寻衅的部分。关键问题是数量多且大,像大众点评和携程每天数在300-400亿旁边,大小有50TB,也便是说每秒数在50-60万高下,每秒大小在1GB旁边。如果分10台机器处理,则每天每秒须要处理5-6万,100MB大小。如果网站流量来点颠簸的话,寻衅就更大了。由于韶光关系,这部分本日就不细述了(感兴趣的同学,欢迎加群与吴老师一对一互换)。
总结
CAT在分布式实时方面,紧张归结于以下几点成分:
去中央化,数据分区处理;
基于日志只读特性,以一个小时为韶光窗口,实时报表基于内存建模和剖析,历史报表通过聚合完成;
基于内存行列步队,全面异步化,单线程化,无锁设计;
全局ID,数据本地化生产,集中式存储;
组件化、做事化理念,致力于工具间互通互联。
高朋先容
吴其敏,互联网老兵,软件工匠,开源爱好者,一贯深入代码一线,打仗java近20年。现在携程网卖力框架研发,曾任大众点评网首席架构师、任eBay&易趣资深架构师等。关注分布式系统框架、组件化系统开拓,高质量数据建模和代码天生等。
互动问答
问题:业界类似办理方案,以及与CAT的异同?
业界有很多开源监控系统,但大多是基于日志行的(如ELK),CAT是基于日志树的。个中最紧张的差异是监控源数据的质量。
问题:叨教吴老师,CAT与运用间是否做了反馈机制,监控报警后是否会有运用重启,做事降级这种操作?点评内部的pigeon是否有这种做事康健检讨包括自动降级的功能,能否谈谈您的意见?
监控可以理解为监和控。现阶段CAT的侧重点还是在监上,将来会考虑控的一壁。要做到控,光CAT是不足的。
问题:CAT如何做到高实时性,又如何避免对运用本身性能,可用性等产生影响的?
CAT在编码的时候非常的关系性能,每一行代码都经由多次review。发送异步化也是避免对主线程造成性能和可用性滋扰的主要手段。其余,CAT在设计时就哀求做到:不担保可靠,如果后台涌现可用性问题和性能问题,客户端会主动丢弃,确保运用可用。
问题:怎么办理埋点性能问题?特殊是访问量大的运用,千万级的,涌现问题很多?
这是个好问题。CAT不会帮你办理业务埋点的问题。监控埋点是一个领域,跟你要办理的问题非常干系,不同运用,不同场合,不同公司的历史阶段,该当采纳不同的策略。对付访问量非常大的运用,CAT埋点要做到小而精,适当的时候可以在客户端做一下聚合。
问题:叨教这里的树是怎么实现的?是自己规定流程自主研发吗?
只要利用CAT API埋点,树是自然而然形成的,无需特殊处理。CAT中有示例代码,可以参考一下。
问题:请教吴老师cat server端集群支配时,且数据落本地磁盘,报表的统计基于全量数据还是只是开叛逆务的哪台机器上的数据,如果是全量的,数据是怎么汇总的?
CAT是主见全量日志剖析的,全量数据落到每一台消费机上只是一个分片,CAT中所有报表都有内置将分片合并的能力,所有的报表在展示时会合并,做数据汇总。
问题:如果客户端上报大量size很大的日志,CAT有没有自保护?
有。CAT在客户端有保护机制,做事器端一样平常处理能力很强,有一定的保存方法,如丢弃之类的。但如果报表过大,则可能会涌现内请安题。