分布式链路跟踪系统

大众点评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安装环境
Linux 2.6以及之上( 2.6内核才可以支持 内核才可以支持 epoll),线上服务端部署请使用 Linux环境, Mac以及 Windows环境可 以作为开发环境,美团点评内部 CentOS 6.5
Java 6,7,8,服务端推荐是用 jdk7的版本,客户端 jdk6、7、8都支持
Maven 3.3.3
MySQL 5.6,5.7,更高版本 MySQL都不建议使用,不清楚兼容性
J2EE容器建议使用 tomcat,建议版本 ,建议版本 7.0.70
Hadoop环境可选,一般建议规模较小的公司直接使用磁盘式 可以申请 CAT服务端 , 服务端, 500GB磁 盘或者更大盘,这个磁挂载在 盘,这个磁挂载在 /data/目录上(共享磁盘)
安装 CAT集群大致步骤
初始化 Mysql数据库,一套 CAT集群部署一个数据库,初始化脚本在 集群部署一个数据库,初始化脚本在 script下的 Cat.sql
准备三台 CAT服务器, IP比如为 10.1.1.1,10.1.1.2,10.1.1.3,下面的例子会以这个 ,下面的例子会以这个 IP为例子
初始化 /data/目录,配置几个文件 目录,配置几个文件 /data/appdatas/cat/*.xml 几个配置文件
打包 cat.war 放入 tomcat容
CAT组件
CAT主要由以下组件组成:

cat-home: 服务端组件,负责收集监控信息,分析处理生成报告、执行告警

cat-client: 客户端组件,负责与服务端进行连接通信,

cat-core: 核心处理组件,负责具体的与客户端通信服务,解析数据、输出报告

cat-consumer : 消费处理组件,负责实际的监控数据分析,处理工作

cat-hadoop : HDFS存储组件

示例
步骤1: tomcat启动参数调整,修改 catalina.sh文件【服务端】
需要每台CAT集群10.1.1.1,10.1.1.2,10.1.1.3都进行部署

建议使用cms gc策略

建议cat的使用堆大小至少10G以上,开发环境启动2G堆启动即可

CATALINA_OPTS="$CATALINA_OPTS -server -Djava.awt.headless=true -Xms25G -Xmx25G -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=10144m -XX:MaxNewSize=10144m -XX:SurvivorRatio=10 -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=13 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_HOME%\conf\logging.properties" -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -Xloggc:/data/applogs/heap_trace.txt -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError -Djava.util.Arrays.useLegacyMergeSort=true"
修改中文乱码 tomcat conf 目录下 server.xml

增加 URIEncoding=“utf-8”
步骤2: 程序对于/data/目录具体读写权限
要求/data/目录能进行读写操作,如果/data/目录不能写,建议使用linux的软链接链接到一个固定可写的目录,软链接的基本命令请自行搜索google

此目录会存一些CAT必要的配置文件,运行时候的缓存文件,建议不要修改,如果想改,请自行研究好源码里面的东西,在酌情修改,此目录不支持进行配置化

mkdir /data

chmod 777 /data/ -R

如果是Windows开发环境则是对程序运行盘下的/data/appdatas/cat和/data/applogs/cat有读写权限,如果cat服务运行在e盘的tomcat中,则需要对e:/data/appdatas/cat和e:/data/applogs/cat有读写权限

步骤3: 配置/data/appdatas/cat/client.xml
此配置文件的作用是所有的客户端都需要一个地址指向CAT的服务端,比如CAT服务端有三个IP,10.1.1.1,10.1.1.2,10.1.1.3,2280是默认的CAT服务端接受数据的端口,不允许修改,http-port是Tomcat启动的端口,默认是8080,建议使用默认端口

此文件可以通过运维统一进行部署和维护,比如使用puppet等运维工具

不同环境这份文件不一样,比如区分prod环境以及test环境,在美团点评内部一共是2套环境的CAT,一份是生产环境,一份是测试环境

步骤4: 安装CAT的数据库 数据库的脚本文件 script/CatApplication.sql

MySQL的一个系统参数:max_allowed_packet,其默认值为1048576(1M),修改为1000M,修改完需要重启mysql

注意1:一套独立的CAT集群只需要一个数据库(之前碰到过个别同学在每台cat的服务端节点都安装了一个数据库)

注意2:数据库编码使用utf8mb4,否则可能造成中文乱码等问题

步骤5: 配置/data/appdatas/cat/datasources.xml【服务端配置】
需要每台CAT集群10.1.1.1,10.1.1.2,10.1.1.3都进行部署

注意:此xml仅仅为模板,请根据自己实际的情况替换jdbc.url,jdbc.user,jdbc.password的实际值。 app数据库和cat数据配置为一样,app库不起作用,为了运行时候代码不报错。

3 1s 10m 1000 com.mysql.jdbc.Driver root root 步骤6: war打包 在cat的源码目录,执行mvn clean install -DskipTests

如果发现cat的war打包不通过,CAT所需要依赖jar都部署在 http://unidal.org/nexus/

可以配置这个公有云的仓库地址到本地Maven配置(一般为~/.m2/settings.xml),理论上不需要配置即可,可以参考cat的pom.xml配置

如果自行打包仍然问题,请使用下面链接进行下载 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版本

如下是个人本机电脑的测试,下载的jar来自于repo1.maven.org 以及 unidal.org

[INFO] parent … SUCCESS [ 40.478 s]
[INFO] cat-client … SUCCESS [03:47 min]
[INFO] cat-core … SUCCESS [ 31.740 s]
[INFO] cat-hadoop … SUCCESS [02:50 min]
[INFO] cat-consumer … SUCCESS [ 3.197 s]
[INFO] cat-home … SUCCESS [ 58.964 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
步骤7: war部署
将cat.war部署到10.1.1.1的tomcat的webapps下,启动tomcat,注意webapps下只允许放一个war,仅仅为cat.war

打开控制台的URL,http://10.1.1.1:8080/cat/s/config?op=routerConfigUpdate

注意10.1.1.1这个IP需要替换为自己实际的IP链接,修改路由配置只能修改一次即可

修改路由配置为如下,当为如下配置时,10.1.1.1 正常不起消费数据的作用,仅当10.1.1.2以及10.1.1.3都挂掉才会进行实时流量消费

重启10.1.1.1的机器的tomcat

将cat.war部署到10.1.1.2,10.1.1.3这两台机器中,启动tomcat

步骤8: 启动服务端,通过配置界面,对服务器进行配置
配置链接:http://{ip:port}/cat/s/config?op=serverConfigUpdate

这个只需要更新一次,配置是保存在mysql的数据库里面

CAT节点一共有四个职责

控制台 - 提供给业务人员进行数据查看【默认所有的cat节点都可以作为控制台,不可配置】

消费机 - 实时接收业务数据,实时处理,提供实时分析报表【默认所有的cat节点都可以作为消费机,不可配置】

告警端 - 启动告警线程,进行规则匹配,发送告警(目前仅支持单点部署)【可以配置】

任务机 - 做一些离线的任务,合并天、周、月等报表 【可以配置】

线上做多集群部署,比如说10.1.1.1,10.1.1.2,10.1.1.3这三台机器

建议选取一台10.1.1.1 负责角色有控制台、告警端、任务机,建议配置域名访问CAT,就配置一台机器10.1.1.1一台机器挂在域名下面

10.1.1.2,10.1.1.3 负责消费机处理,这样能做到有效隔离,任务机、告警等问题不影响实时数据处理

配置的sample如下: id="default"是默认的配置信息,server id=“10.1.1.1” 如下的配置是表示10.1.1.1这台服务器的节点配置覆盖default的配置信息,比如下面的job-machine,alarm-machine,send-machine为true。 [注意这个IP为cat拿到的内网IP,如果你cat部署本地,此IP是看transaction报表下cat的自己上报的IP,用127.0.0.1是没用的。]

配置说明:

server模型:代表一台机器的配置。如果id为default,代表默认配置;如果id为ip,代表该台服务器的配置

property local-mode : 定义服务是否为本地模式(开发模式),在生产环境时,设置为false,启动远程监听模式。默认为 false;

property hdfs-machine : 定义是否启用HDFS存储方式,默认为 false;

property job-machine : 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false;

property alarm-machine : 定义当前服务是否为报警机(开启各类报警监听,只需要一台服务机开启此功能),默认为 false;

property send-machine : 定义当前服务告警是否发送(当时为了解决测试环境开启告警线程,但是最后告警不通知,此配置后续会逐步去除,建议alarm-machine开启为true的时候,这个同步为true)

storage模型: 定义数据存储配置信息

property local-report-storage-time : 定义本地报告存放时长,单位为(天)

property local-logivew-storage-time : 定义本地日志存放时长,单位为(天)

property local-base-dir : 定义本地数据存储目录

property hdfs : 定义HDFS配置信息,便于直接登录系统

property server-uri : 定义HDFS服务地址

property console : 定义服务控制台信息

property remote-servers : 定义HTTP服务列表,(远程监听端同步更新服务端信息即取此值)

ldap : 定义LDAP配置信息(这个可以忽略)

ldapUrl : 定义LDAP服务地址(这个可以忽略)

步骤9: 重启不影响数据可用性
请在tomcat重启之前调用当前tomcat的存储数据的链接 http://${ip}:8080/cat/r/home?op=checkpoint,重启之后数据会恢复。【注意重启时间在每小时的整点10-55分钟之间】

线上部署时候,建议把此链接调用存放于tomcat的stop脚本中,这样不需要每次手工调用

步骤10: 本地开发环境 CAT运行
请参照上述步骤,进行如下配置:

配置/data/appdatas/cat/client.xml文件

配置/data/appdatas/cat/datasources.xml文件

服务器配置 http://{ip:port}/cat/s/config?op=serverConfigUpdate (注意本地节点的角色,job-machine&alarm-machine都可以配置为true,以便于debug)

根据ide的类型,在cat目录中执行 mvn eclipse:eclipse 或者 mvn idea:idea,此步骤会生成一些代码文件,直接导入到工程会发现找不到类

如果ide是eclipse,将源码以普通项目到入eclipse中,注意不要以maven项目导入工程

启动方式:

Tomcat启动:打成war包,将war包部署在Tomcat后,启动Tomcat

test case启动:运行com.dianping.cat.TestServer 这个类,即可启动cat服务器;注意:执行的是startWebApp()这个test case

这里和集群版本唯一区别就是服务端部署单节点,client.xml, server.xml以及路由地址配置为单台即可

注意:服务端配置完成后,一定要在全局配置中把客户端路由选项配置好,不然客户端连接不上服务
Cat客户端部署
通过 Maven 添加依赖

com.dianping.cat
cat-client
${cat.version}

如果没有使用maven管理依赖,可以直接复制 jar/cat-client-3.0.0.jar 到项目 WEB_INF/lib 路径下。

初始化
一些准备工作需要在初始化 cat client 之前完成。

然后你需要在你的项目中创建 src/main/resources/META-INF/app.properties 文件, 并添加如下内容:

app.name={appkey}
appkey 只能包含英文字母 (a-z, A-Z)、数字 (0-9)、下划线 (_) 和中划线 (-)

SPI方式初始化
cat client提供了SPI的方式扩展初始化方法,只要实现ClientConfigProvider接口

public class DemoClientConfigProvider implements ClientConfigProvider {

@Override
public ClientConfig getClientConfig() {
	List servers = new ArrayList();
	servers.add(new Server("192.168.199.100"));
	servers.add(new Server("192.168.199.101"));
	
	String domain = "demo-app";

	ClientConfig config = new ClientConfig();
	config.setServers(servers);
	config.setDomain(domain);

	return config;
}

}
新增SPI实现的配置文件META-INF/services/com.dianping.cat.configuration.ClientConfigProvider,内容如下:

com.demo.tracker.cat.DemoClientConfigProvider
Quickstart
Transaction t = Cat.newTransaction(“URL”, “pageName”);

try {
Cat.logEvent(“URL.Server”, “serverIp”, Event.SUCCESS, “ip=${serverIp}”);
Cat.logMetricForCount(“metric.key”);
Cat.logMetricForDuration(“metric.key”, 5);

yourBusiness();

t.setStatus(Transaction.SUCCESS);

} catch (Exception e) {
t.setStatus(e);
Cat.logError(e);
} finally {
t.complete();
}
模型设计
监控模型
CAT主要支持以下四种监控模型:

Transaction
适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数

Event
用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小

Heartbeat
表示程序内定期产生的统计信息, 如CPU利用率, 内存利用率, 连接池状态, 系统负载等

Metric
用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟

消息树
CAT监控系统将每次URL、Service的请求内部执行情况都封装为一个完整的消息树、消息树可能包括Transaction、Event、Heartbeat、Metric等信息。
完整的消息树
分布式链路跟踪系统_第1张图片
可视化消息树
分布式链路跟踪系统_第2张图片
分布式消息树【一台机器调用另外一台机器】
分布式链路跟踪系统_第3张图片

你可能感兴趣的:(项目研究)