点评cat系列-服务器开发环境部署

时间:2024-01-13 18:29:38

我们有三种部署方式:
1. docker 部署
2. 采用官方的 war 包部署.
3. 源码部署

很显然 docker 部署是最简单的, 我尝试了多次, 都在 cat docker 容器镜像的编译过程失败了. 原因是: 镜像编译需要先编译 java 源码为 war 包, 这中间要从 maven 官网库下载很多 org.unidal 下的 jar 包, org.unidal 下的 jar 包已经升级到新版本, 而 cat 源码中 pom.xml 指定的仍是老版本, 导致下载失败. 这应该是官方最近在升级 3.0 版, 代码没有完全 align 好.

显然, 源码部署暂时也行不通, 所以我采用了官方 war 包部署.

========================
Docker 部署步骤
========================
参考: https://github.com/dianping/cat/blob/master/cat-doc/posts/ch4-server/README.md
官方并没提供已经编译好的 docker 镜像, 大致步骤如下:
1. 从 github 上下载完整源码
2. 将 docker/docker-compose.yml 文件中的汉字都删除, 否则之后的 docker-compose up 命令会报错.
3. 运行 docker-compose up 命令, 该命令将完成:
    (1)cat docker 容器镜像的编译
    (2)mysql 镜像下载,
    (3) 启动 mysql 容器和 cat 容器.
4. 第一次运行以后,数据库中没有表结构,需要通过下面的命令创建表
docker exec <container_id> bash -c "mysql -uroot -Dcat < /init.sql"
说明:<container_id> 需要替换为 cat 容器的真实 id. 通过 docker ps 可以查看到 mysql 容器 id

========================
windows 下 war 包部署开发环境
========================
准备工作: 配置好 jdk8 和 tomcat, 官方建议 tomcat 使用版本 7.*.或 8.0.

步骤 1: 初始化 Mysql 数据库, 一套 CAT 集群需要部署一个数据库, 先新建一个名为 cat 数据库, 数据库编码使用 utf8mb4, 建表语句为 script/CatApplication.sql .

步骤 2: 在 tomcat 程序运行盘下新建 /data/appdatas/cat 和 /data/applogs/cat 两个目录.

步骤 3: [非必需] 配置 /data/appdatas/cat/client.xml, 其中 http-port 为 tomcat 端口, 我机器上是 8888 端口. 配置 client.xml 之后, 将监控本机的cat服务.

<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<server ip="127.0.0.1" port="2280" http-port="8888"/>
</servers>
</config>

步骤 4: 配置/data/appdatas/cat/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>toor</password> <!-- 请替换为真实数据库密码 -->
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>

步骤 5: 下载编译好的 war 包, 此 war 是用 jdk8, 服务端请使用 jdk8 版本.
http://cat.meituan.com/nexus/service/local/repositories/releases/content/com/dianping/cat/cat-home/3.0.0/cat-home-3.0.0.war

步骤 6: 将下载的 war 文件重命名为 cat.war, 放入 tomcat 容器 webapps 根目录下, 并启动 tomcat.
然后修改客户端的路由策略, 访问链接 http://127.0.0.1:8888/cat/s/config?op=routerConfigUpdate
把下面的 xml 文件的 127.0.0.1 替换为你本机的实际的内网 IP,比如说 192.168.1.1, 然后重启 tomcat .

<?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="default" 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>
</router-config>

步骤 7: 更改服务端配置
访问链接 http://127.0.0.1:8888/cat/s/config?op=serverConfigUpdate
说明:这个只需要更新一次,配置是保存在 mysql 的数据库里面.
本机模式可直接复制以下内容,注意要修改 127.0.0.1 为实际的内网 IP,然后点击提交. 本配置已经将本机服务器 tag 下的  job-machine 和 alarm-machine 都可以配置为 true, 以便于 debug, 然后重启 tomcat. 需要说明的是 local mode, 是用于 cat 项目本身的开发,部署环境时置为false即可.

<?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:8888"/> <!-- 本机模式这个 IP 替换为 cat 拿到的内网 IP-->
</properties>
<storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="7" local-logivew-storage-time="7">
<hdfs id="logview" max-size="128M" server-uri="hdfs://10.1.77.86/user/cat" base-dir="logview"/>
<hdfs id="dump" max-size="128M" server-uri="hdfs://10.1.77.86/user/cat" base-dir="dump"/>
<hdfs id="remote" max-size="128M" server-uri="hdfs://10.1.77.86/user/cat" base-dir="remote"/>
</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"> <!-- 本机模式这个 IP 替换为 cat 拿到的内网 IP,此 IP 是看 transaction 报表下 cat 的自己上报的 IP,用 127.0.0.1 是没用的. -->
<properties>
<property name="job-machine" value="true"/>
<property name="alarm-machine" value="true"/>
<property name="send-machine" value="true"/>
</properties>
</server>
</server-config>

验证:
http://127.0.0.1:8888/cat/
3.0 版本默认密码: admin/admin
2.0 版本密码: catadmin/catadmin

======================
ClientConfig, RouterConfig 和 ServerConfig
======================
Cat有三个重要配置, 分别是: ClientConfig, RouterConfig 和 ServerConfig, 分别代表客户端信息, 服务路由信息以及服务端配置信息.

ClientConfig 配置(即client.xml 配置文件):
每个客户端对应一组对服务器以及一个domain信息, 客户端默认从这组服务中的一个节点上拉取路由配置信息. 客户端的查询参数里带有domain信息, 服务端的路由配置里如果有相应的domain则返回相应domain下的一组server信息, 如果没有则返回default servers.
返回的路由信息包含一组日志服务节点以及采样比例(sample), 日志服务节点包含权重, socket端口号以及id(ip). 采样比例是指客户端的cat日志多少次里抽样发送1次, 例如0.2则代表记录5次日志会忘服务端发送1次.

RouterConfig 配置(通过 url 配置):
客户端拉取到router信息后, 和router的日志server列表中第一个可用server之间建立netty channel, 并启动一个线程对channel进行维护. 对channel的维护主要包括:
1. 比较服务端路由信息和客户端上次抓取的是否一致, 不一致则更新客户端router信息, 并重新建立新channel.
2. 判断当前channel状态, 如果状态不正常, 则从router的server列表里重新找出一个能用的server建立channel.
客户端拉取不到router信息时, 默认使用客户端下的server列表作为远程日志服务器组.

ServerConfig 配置(通过 url 配置):
ServerConfig主要用于服务端节点的职能描述, 主要有以下几类功能:
1. 定义服务节点职能, 可以运行哪类任务, 以及是否可以发送告警信息和是否是hdfs存储节点.
2. 通过consoleConfig定义相应报表数据的获取节点, 一般用于告警节点远程拉取所有节点的报表数据进行筛选.
3. ConsumerConfig定义各种类型的事务时间阈值, 从名字可以看出来分别定义url, sql以及cache类型的事务时间的阈值, 超过这个时间会被认为是一个problem.

========================
参考:
========================

深入详解美团点评CAT跨语言服务监控(一) CAT简介与部署
https://blog.csdn.net/caohao0591/article/details/80693289

官方部署文档
https://github.com/dianping/cat/blob/master/cat-doc/posts/ch4-server/README.md