CAT ----分布式实时监控系统 - miaomiaodmiaomiao的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/miaomiaodmiaomiao/article/details/51240065
2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一。
在当今互联网时代,业务需求旺盛,开发团队往往采用scrum等敏捷开发流程,加班加点快速迭代以满足业务需求,是常态。采用分布式系统设计和服务化,由多台机器协作来共同完成用户请求,是典型的解决方案。网站故障频发,内部关系错综复杂,故障定位缓慢,甚至找不到问题根源,也是常有的事。虽然已经有很多日志监控工具,或许单个工具功能还不错,但整体服务化水平参差不齐,工具间不能互通互联;另一方面,由于日志数据量大,且分散,使得查找问题根源基本靠人品。
这些也是我们要开发CAT的初衷。
在互联网环境中,最突出的问题场景,我的理解是,跨越边界的行为。包括但不限于,HTTP/REST、RPC/SOA、MQ、Job、Cache、DAL; 搜索/查询引擎、业务应用、外包系统、遗留系统; 母/子公司, 第三方网关/银行, 合作伙伴/供应商之间;还有各类业务指标,如PV、用户登录、订单数、支付状态、销售额。
对于内存增量计算,它可以分为:计数、计时和关系处理三种。计数又可以分为两类:算术计数和集合计数。典型的算术计数如:总个数(count),总和(sum),均值(avg),最大/最小(max/min),吞吐(tps)和标准差(std)等,其他都比较直观,标准差稍微复杂一点,大家自己可以推演一下怎么做增量计算。那集合运算,比如95线(表示95%请求的完成时间),999线(表示99.9%请求的完成时间),DAU(日活用户数)等,则稍微复杂一些,系统开销也更大一点。关系处理则涉及图的运算,这里不细述。
CAT在分布式实时方面,主要归结于以下几点因素:
去中心化,数据分区处理;
基于日志只读特性,以一个小时为时间窗口,实时报表基于内存建模和分析,历史报表通过聚合完成;
基于内存队列,全面异步化,单线程化,无锁设计;
全局消息ID,数据本地化生产,集中式存储;
组件化、服务化理念,致力于工具间互通互联。
业界有很多开源监控系统,但大多是基于日志行的(如ELK),CAT是基于日志树的。其中最主要的差异是监控源数据的质量。
只要使用CAT API埋点,消息树是自然而然形成的,无需特别处理。CAT中有示例代码,可以参考一下。
CAT是主张全量日志分析的,全量数据落到每一台消费机上只是一个分片,CAT中所有报表都有内置将分片合并的能力,所有的报表在展示时会合并,做数据汇总。