(一) CAT简介与部署
介绍
背景介绍
Cat系统的特性
消息树
CAT部署
(二) CAT服务端初始化
Cat模块
Cat-servlet初始化
plexus - IOC容器
模块的加载 - 模型模式
cat-home的setup
TcpSocketReceiver--- netty reactor 模式的应用
消息的解码
(三) CAT客户端原理
cat客户端部分核心类
消息的组织 - 消息树
客户端的初始化
消息生产 -- 入栈
Context 线程本地变量
Transaction事务的开启
其他类型消息组合
消息的完成-出栈
消息的发送-队列化
消息的序列化
MessageId的设计
(四) 服务端消息分发
分发架构
分析管理器的初始化
消费者与周期管理器的初始化
什么是周期?
周期任务-任务队列
消息分发
周期策略
(五) 配置与数据库操作
CAT配置
代码自动生成
数据库操作
数据库连接管理
(六) 消息分析器与报表(一)
消息分析器的构建
TopAnalyzer
EventAnalyzer - 事件发生次数分析
MetricAnalyzer - 业务分析
ProblemAnalyzer -异常分析
TransactionAnalyzer - 事务分析
(七)消息分析器与报表(二)
CrossAnalyzer-调用链分析
StorageAnalyzer --数据库/缓存分析
StateAnalyzer
HeartbeatAnalyzer
DumpAnalyzer -- 原始消息LogView存储
自定义分析器与报表
(八) 报表持久化
周期结束
分析器的结束 -- 报表持久化
报表预处理
报表的文件存储 -- 重入锁
报表的数据库存储
定时任务
(九) 管理平台MVC框架
Servlet容器与请求生命周期
页面路由初始化
请求处理流程
(十)与JAVA框架的集成
与Spring MVC集成
与Spring Boot 集成
与Spring Cloud 集成
与dubbo集成
与MyBatis集成
与Log4j集成
(十一) 其他语言支持
PHP语言
C++语言
LUA语言
Go语言
Node.js语言
Android埋点
Object C -- IOS 埋点
(十二) 报警与监控提醒
邮件通知
(十三) CAT与实时计算hadoop模块
spark实时计算模块
介绍:
大众点评CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解。CAT不仅增强了CAL系统核心模型,还添加了更丰富的报表。自2014年开源以来,CAT在携程、陆金所、猎聘网、找钢网等多家互联网公司生产环境应用。
CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,除了与点评RPC组件融合的很好之外,他将会能与Spring、MyBatis、Dubbo 等框架以及Log4j 等结合,不久将会支持PHP、C++、Go等多语言应用,基本接入了美团点评上海侧所有核心应用。目前在中间件(MVC、RPC、数据库、缓存等)框架中得到广泛应用,为美团点评各业务线提供系统的性能指标、健康状况、监控告警等,在微服务监控领域也是非常有用的一套组件。
本文会对CAT整体设计、客户端、服务端等的一些设计思路做详细深入的介绍。
在详细了解CAT的整体设计细节之后,我们可以在CAT基础之上轻松扩展我们自己的监控和数据收集模块。
CAT项目的开源地址: https://github.com/dianping/cat
背景介绍
CAT整个产品研发是从2011年底开始的,当时正是大众点评App Net迁移Java的核心起步阶段。当初大众点评App已经有核心的基础中间件、RPC组件Pigeon、统一配置组件lion。整体Java迁移已经在服务化的路上。随着服务化的深入,整体Java在线上部署规模逐渐变多,同时,暴露的问题也越来越多。典型的问题有:
大量报错,特别是核心服务,需要花很久时间才能定位。
异常日志都需要线上权限登陆线上机器排查,排错时间长。
有些简单的错误定位都非常困难(一次将线上的库配置到了Beta,花了整个通宵排错)。
很多不了了之的问题怀疑是网络问题(从现在看,内网真的很少出问题)。
虽然那时候也有一些简单的监控工具(比如Zabbix,自己研发的Hawk系统等),可能单个工具在某方面的功能还不错,但整体服务化水平参差不齐、扩展能力相对较弱,监控工具间不能互通互联,使得查找问题根源基本都需要在多个系统之间切换,有时候真的是靠“人品”才能找出根源。适逢吴其敏从eBay加入大众点评成为首席架构师,eBay的CAL系统在内部非常成功,就在这样天时地利与人和的情况下,我们开始研发了大众点评App第一代监控系统——CAT。
Cat系统的特性
- 实时处理:信息的价值会随时间锐减,尤其是事故处理过程中。
- 全量数据:最开始的设计目标就是全量采集,全量的好处有很多。
- 高可用:所有应用都倒下了,需要监控还站着,并告诉工程师发生了什么,做到故障还原和问题定位。
- 故障容忍:CAT本身故障不应该影响业务正常运转,CAT挂了,应用不该受影响,只是监控能力暂时减弱。
- 高吞吐:要想还原真相,需要全方位地监控和度量,必须要有超强的处理吞吐能力。
- 可扩展:支持分布式、跨IDC部署,横向扩展的监控系统。
- 不保证可靠:允许消息丢失,这是一个很重要的trade-off,目前CAT服务端可以做到4个9的可靠性,可靠系统和不可靠性系统的设计差别非常大。
目前现状:
15台CAT物理监控集群
单台机器15w qps
2000+ 业务应用(包括部分.net以及Job)
7000+ 应用服务器
50TB 消息,~450亿消息(每天)
CAT支持的监控消息类型包括:
- Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。
- Event 用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。
- Heartbeat 表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等。
- Metric 用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。
- Trace 用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息
消息树
CAT监控系统将每次URL、Service的请求内部执行情况都封装为一个完整的消息树、消息树可能包括Transaction、Event、Heartbeat、Metric和Trace信息。
完整的消息树
可视化消息树
分布式消息树【一台机器调用另外一台机器】
CAT部署
所需环境
- Linux 2.6以及之上(2.6内核才可以支持epoll),Mac以及Windows环境可以作为开发环境
- Java 6,7,8
- Maven 3.2.3+
- MySQL 5.6
我司的环境配置如下
Distributor ID: CentOS
Description: CentOS release 6.5 (Final)
Release: 6.5
Codename: Final
Server version: Apache Tomcat/8.0.30
Server built: Dec 1 2015 22:30:46 UTC
Server number: 8.0.30.0
OS Name: Linux
OS Version: 2.6.32-431.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_111-b14
JVM Vendor: Oracle Corporation
Maven 3.3.3
Mysql 5.6
tomcat 7.0.70 建议使用此版本,修改中文乱码 tomcat conf 目录下 server.xml
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="utf-8" connectionTimeout="20000"
redirectPort="8443" /> 增加 URIEncoding="utf-8"
1、将分支mvn-repo下的jar包复制到本机maven仓库,cat一些依赖的jar存放于mvn-repo分支
1、git clone https://github.com/dianping/cat.git
2、cd cat
3、git checkout mvn-repo
4、cp -R * ~/.m2/repository
5、git checkout master
6、mvn clean install -DskipTests
如果下载有问题,可以尝试翻墙后下载
2、在CAT目录下,用maven构建项目
mvn clean install -DskipTests
3、配置CAT的运行需要配置信息
mvn cat:install
Note:
- Linux\Mac 需要对/data/appdatas/cat和/data/applogs/cat有读写权限
- Windows 则是对系统运行盘下的/data/appdatas/cat和/data/applogs/cat有读写权限,如果cat服务运行在e盘的tomcat中,则需要对e:/data/appdatas/cat和e:/data/applogs/cat有读写权限
此步骤是自动配置一些cat启动需要的基本数据库配置以及配置文件,如果发现此步骤有问题,可以直接使用第五步,手工方式安装。
4、(Optional)如果安装了hadoop集群,需到/data/appdatas/cat/server.xml中配置对应hadoop信息。将localmode设置为false,默认情况下,CAT在开发模式(localmode=true)下工作。推荐大部分公司使用单机模式,不需要搭建hdfs,部署cat的服务端使用一个大磁盘的机器,比如1TB,这样可以省去很多事情。
================如果上述自动化程序出现问题,可以使用如下部署进行尝试,这步骤其实就是上述自动化程序做的事情==========================
5、启动的cat单机版本基本步骤
- 检查下/data/appdatas/cat/ 下面需要的需要的配置文件,配置文件在源码script,请修改对应的datasources.xml 以及 client.xml 里面对应的IP、PSW部分。注意cat服务端的数据上报端口是2280,cat的http端口默认是tomcat的端口8080。
- 修改server.xml 部分,注意修改server.xml 里面的remote-servers的端口设定,如果是tomcat,一般是8080。
- 建立一个mysql的数据库,数据库的安装文件在script文件下的Cat.sql,可以导入到数据库中。
- 在cat目录下执行 mvn install -DskipTests
- cat-home打包出来的war包,重新命名为cat.war, 并放入tomcat的webapps
- 启动tomcat
- 访问 http://localhost:8080/cat/r
- 具体详细的还可以参考,这里面的步骤更加傻瓜一些, http://unidal.org/cat/r/home?op=view&docName=deploy
6、导入eclipse发现找不到类
- 请先执行mvn eclipse:eclipse 会自动生成相关的类文件
- 作为普通项目导入eclipse,不要用作为maven项目导入eclipse