CAT入门
什么是调用链监控
架构的演进历史
单体应用
架构说明:
全部功能集中在一个项目内(All in one)。
在单体应用的年代,分析线上问题主要靠日志以及系统级别的指标。
微服务架构
架构说明:
将系统服务层完全独立出来,抽取为一个一个的微服务。
当我们开始微服务架构之后,服务变成分布式的了,并且对服务进行了拆分。当用户的一个请求进来,会依次经过不同的服务节点进行处理,处理完成后再返回结果给用户。那么在整个处理的链条中,如果有任何一个节点出现了延迟或者问题,都有可能导致最终的结果出现异常,有的时候不同的服务节点甚至是由不同的团队开发的、部署在不同的服务器上,那么在这么错综复杂的环境下,我们想要排查出是链条中的具体哪个服务节点出了问题,其实并不容易。如下图片很形象的解释了在微服务架构下的复杂调用关系:
调用链监控的需求
调用链监控是在微服务架构中非常重要的一环。除了能帮助定位问题以外,还能帮助项目成员清晰的去了解项目部署结构,毕竟一个几十上百的微服务,相信在运行时间久了之后,项目的结构会出现上述非常复杂的调用链,在这种情况下,团队开发者甚至是架构师都不一定能对项目的网络结构有很清晰的了解,那就更别谈系统优化了。
这里我们会使用到调用链监控工具,那么首先我们先对调用链监控工具提出我们的需求:
1.线上的服务是否运行正常。是不是有一些服务已经宕机了,但是我们没有发现呢?如何快速发现已经宕机的服务?
2.来自用户的一笔调用失败了,到底是哪个服务导致的错误,我们需要能够快速定位到才能做到修复。
3.用户反映,我们的系统很“慢”。如何知道究竟慢在何处?
从上述问题可以看出,微服务架构下,如果没有一款强大的调用链监控工具,势必会产生如下问题:
- 问题处理不及时,影响用户的体验
- 不同应用的负责人不承认是自己的问题导致失败,容易出现“扯皮”
- 服务之间的调用关系难以梳理,可能会存在很多错误的调用关系
- 由于没有具体的数据,团队成员对自己的应用性能不在意
调用链监控的原理
在2010年,google发表了一篇名为“Dapper, a Large-Scale Distributed Systems Tracing Infrastructure”的论文,在文中介绍了google生产环境中大规模分布式系统下的跟踪系统Dapper的设计和使用经验。而如今很多的调用链系统如zipkin/pinpoint等系统都是基于这篇文章而实现的。
Dapper中调用链监控的原理:
什么是CAT
CAT是由大众点评开源的一款调用链监控系统,基于JAVA开发的。有很多互联网企业在使用,热度非常高。它有一个非常强大和丰富的可视化报表界面,这一点其实对于一款调用链监控系统而来非常的重要。在CAT提供的报表界面中有非常多的功能,几乎能看到你想要的任何维度的报表数据。
特点:聚合报表丰富,中文支持好,国内案例多
国内案例:携程、点评、陆金所等
PinPoint
Pinpoint是由一个韩国团队实现并开源,针对Java编写的大规模分布式系统设计,通过JavaAgent的机制做字节代码植入,实现加入traceid和获取性能数据的目的,对应用代码零侵入。
特点:支持多种插件,UI功能强大,接入端无代码侵入
官方网站:
https://github.com/naver/pinpoint
SkyWalking
SkyWalking是apache基金会下面的一个开源APM项目,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。Skywalking支持链路追踪和监控应用组件基本涵盖主流框架和容器,如国产RPC Dubbo和motan等,国际化的spring boot,spring cloud。
特点:支持多种插件,UI功能较强,接入端无代码侵入
官方网站:
http://skywalking.apache.org/
Zipkin
Zipkin是由Twitter开源,是分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。Zipkin基于Google的Dapper论文实现,主要完成数据的收集、存储、搜索与界面展示。
特点:轻量,使用部署简单
官方网站:
https://zipkin.io/
CAT报表介绍
CAT支持如下报表:
报表名称 | 报表内容 |
---|---|
Transaction报表 | 一段代码的运行时间、次数、比如URL/cache/sql执行次数相应时间 |
Event报表 | 一段代码运行次数,比如出现一次异常 |
Problem报表 | 根据Transaction/Event数据分析出系统可能出现的一次,慢程序 |
Heartbeat报表 | JVM状态信息 |
Business报表 | 业务指标等,用户可以自己定制 |
Transaction报表:
Event报表
Problem报表
Heartbeat报表
Business报表
CAT基础
下载与安装
github源码下载
要安装CAT,首先需要从github上下载最新版本的源码。
官方给出的建议如下:
- 注意cat的3.0代码分支更新都发布在master上,包括最新文档也都是这个分支
- 注意文档请用最新master里面的代码文档作为标准,一些开源网站上面一些老版本的一些配置包括数据库等可能遇到不兼容情况,请以master代码为准,这份文档都是美团点评内部同学为这个版本统一整理汇总。内部同学已经核对,包括也验证过,如果遇到一些看不懂,或者模糊的地方,欢迎提交PR。
所以本次使用master分支的3.0版本。CAT的官方github地址:
https://github.com/dianping/cat/tree/master
打开页面之后,进行如下操作:
也可以在git bash控制台使用命令进行下载:
git clone https://github.com/dianping/cat.git
模块介绍
-
cat-client: 客户端,上报监控数据
-
cat-consumer: 服务端,收集监控数据进行统计分析,构建丰富的统计报表
-
cat-alarm: 实时告警,提供报表指标的监控告警
-
cat-hadoop: 数据存储,logview 存储至 Hdfs
-
cat-home: 管理端,报表展示、配置管理等
服务端安装
CAT服务端的环境要求如下:
- Linux 2.6以及之上(2.6内核才可以支持epoll),线上服务端部署请使用Linux环境,Mac以及Windows环境可以作为开发环境,美团点评内部CentOS 6.5
- Java 6,7,8,服务端推荐使用jdk7的版本,客户端jdk6、7、8都支持
- Maven 3及以上
- MySQL 5.6,5.7,更高版本MySQL都不建议使用,不清楚兼容性
- J2EE容器建议使用tomcat,建议使用推荐版本7.*.或8.0.
- Hadoop环境可选,一般建议规模较小的公司直接使用磁盘模式,可以申请CAT服务端,500GB磁盘或者更大磁盘,这个磁盘挂载在/data/目录上
数据库安装
-
数据库的脚本文件 script/CatApplication.sql
mysql -uroot -Dcat < CatApplication.sql
-
说明:
数据库编码使用utf8mb4,否则可能造成中文乱码等问题
应用打包
-
源码构建
- 在cat的源码目录,执行
mvn clean install -DskipTests
- 如果发现cat的war打包不通过,CAT所需要依赖jar都部署在 http://unidal.org/nexus/
- 可以配置这个公有云的仓库地址到本地Maven配置(一般为~/.m2/settings.xml),理论上不需要配置即可,可以参考cat的pom.xml配置:
- 在cat的源码目录,执行
<repositories>
<repository>
<id>central</id>
<name>Maven2 Central Repository</name>
<layout>default</layout>
<url>http://repo1.maven.org/maven2</url>
</repository>
<repository>
<id>unidal.releases</id>
<url>http://unidal.org/nexus/content/repositories/releases/</url>
</repository>
</repositories>
-
官方下载
-
如果自行打包仍然问题,请使用下面链接进行下载:
http://unidal.org/nexus/service/local/repositories/releases/content/com/dianping/cat/cat-home/3.0.0/cat-home-3.0.0.war
-
官方的cat的master版本,
重命名为cat.war进行部署,注意此war是用jdk8,服务端请使用jdk8版本
-
linux源码安装
请参考:
https://blog.csdn.net/tiny_du/article/details/119148287?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172190891416800213071083%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=172190891416800213071083&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-119148287-null-null.142^v100^pc_search_result_base1&utm_term=cat%20%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187
https://blog.csdn.net/world6968/article/details/115051622?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172190891416800226548806%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172190891416800226548806&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-115051622-null-null.142^v100^pc_search_result_base1&utm_term=cat%20%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187
查看IP地址
使用命令查看当前虚拟机的IP地址:
ip addr
#或
ifconfig
程序对于/data/目录具体读写权限
-
要求/data/目录能进行读写操作,如果/data/目录不能写,建议使用linux的软链接链接到一个固定可写的目录。所有的客户端集成程序的机器以及CAT服务端机器都需要进行这个权限初始化。(可以通过公司运维工具统一处理)
-
此目录会存一些CAT必要的配置文件以及运行时候的数据存储目录。
-
CAT支持CAT_HOME环境变量,可以通过JVM参数修改默认的路径。
mkdir /data chmod -R 777 /data/
配置/data/appdatas/cat/client.xml ($CAT_HOME/client.xml)
mkdir -p /data/appdatas/cat
cd /data/appdatas/cat
vi client.xml
编写程序运行盘下的/data/appdatas/cat/client.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<!--下面的IP地址替换为主机的IP地址-->
<server ip="192.168.1.101" port="2280" http-port="8080"/>
</servers>
</config>
配置/data/appdatas/cat/datasources.xml($CAT_HOME/datasources.xml)
vi datasources.xml
<?xml version="1.0" encoding="utf-8"?>
<data-sources>
<data-source id="cat">
<maximum-pool-size>3</maximum-pool-size>
<connection-timeout>1s</connection-timeout>
<idle-timeout>10m</idle-timeout>
<statement-cache-size>1000</statement-cache-size>
<properties>
<driver>com.mysql.jdbc.Driver</driver>
<url><![CDATA[jdbc:mysql://127.0.0.1:3306/cat]]></url> <!-- 请替换为真实数据库URL及Port -->
<user>root</user> <!-- 请替换为真实数据库用户名 -->
<password>root</password> <!-- 请替换为真实数据库密码 -->
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>
安装mysql
虚拟机上已经使用docker安装了mysql,直接启动即可。
docker start mysql
使用sqlyog等工具测试连接,账号密码root/root,端口号为3306。
创建数据库,导入sql脚本
导入cat\script\CatApplication.sql初始化脚本。
安装tomcat
虚拟机中已经安装了对应tomcat并且上传了cat的war包,目录位置:
/root/deploy/apache-tomcat-8.5.50/bin
以下操作已完成:
修改中文乱码 tomcat conf 目录下 server.xml
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="utf-8" connectionTimeout="20000"
redirectPort="8443" /> <!-- 增加 URIEncoding="utf-8" -->
启动tomcat:
cd /root/deploy/apache-tomcat-8.5.50/bin
./startup.sh
服务端配置
配置链接:http://{ip:port}/cat/s/config?op=serverConfigUpdate
输入账号密码admin/admin进行登录
以下所有IP地址为127.0.0.1内容,均修改为实际的IP地址!
输入以下内容:
<?xml version="1.0" encoding="utf-8"?>
<server-config>
<server id="default">
<properties>
<property name="local-mode" value="false"/>
<property name="job-machine" value="false"/>
<property name="send-machine" value="false"/>
<property name="alarm-machine" value="false"/>
<property name="hdfs-enabled" value="false"/>
<property name="remote-servers" value="127.0.0.1:8080"/>
</properties>
<storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="2" local-logivew-storage-time="1" har-mode="true" upload-thread="5">
<hdfs id="dump" max-size="128M" server-uri="hdfs://127.0.0.1/" base-dir="/user/cat/dump"/>
<harfs id="dump" max-size="128M" server-uri="har://127.0.0.1/" base-dir="/user/cat/dump"/>
<properties>
<property name="hadoop.security.authentication" value="false"/>
<property name="dfs.namenode.kerberos.principal" value="hadoop/dev80.hadoop@testserver.com"/>
<property name="dfs.cat.kerberos.principal" value="cat@testserver.com"/>
<property name="dfs.cat.keytab.file" value="/data/appdatas/cat/cat.keytab"/>
<property name="java.security.krb5.realm" value="value1"/>
<property name="java.security.krb5.kdc" value="value2"/>
</properties>
</storage>
<consumer>
<long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
<domain name="cat" url-threshold="500" sql-threshold="500"/>
<domain name="OpenPlatformWeb" url-threshold="100" sql-threshold="500"/>
</long-config>
</consumer>
</server>
<server id="127.0.0.1">
<properties>
<property name="job-machine" value="true"/>
<property name="send-machine" value="true"/>
<property name="alarm-machine" value="true"/>
</properties>
</server>
</server-config>
配置链接:http://{ip:port}/cat/s/config?op=routerConfigUpdate
<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="127.0.0.1" backup-server-port="2280">
<default-server id="127.0.0.1" weight="1.0" port="2280" enable="true"/>
<network-policy id="default" title="默认" block="false" server-group="default_group">
</network-policy>
<server-group id="default_group" title="default-group">
<group-server id="127.0.0.1"/>
</server-group>
<domain id="cat">
<group id="default">
<server id="127.0.0.1" port="2280" weight="1.0"/>
</group>
</domain>
</router-config>