美团点评CAT部署了各种环境不下10次,遇到的坑整理

CAT是什么

我的理解是一个收集服务调用等运行情况的监控系统。

 相信你能搜到这篇博客我就不多介绍了,这里有链接 传送门

本博客仅仅只帮助大家解决部署方面的问题

来自一个用户的吐槽

1.部署真他娘的困难,坑点太多了。

2.初期部署经常被难住点:源代码拉下来编译不通过

3.mysql版本要求5.7及以下,现在都普遍8.0了

4.cat-client 服务启动找CAT-HOME ,找不到默认/data/appdatas/cat 固定目录,对mac系统非常不友好

5.配置化的东西太多了,操作难度直线上升

   a.客户端需要到META_INF/app.properties 读取app.name 作为应用名称

   b.客户端需要到指定目录创建/data/appdatas/cat 文件夹,并在里面创建client.xml文件,加上服务端配置

   c.服务端需要生成cat数据库,利用手中的sql脚本 这个在公司内网云平台执行校验时各种索引命名规范问题,大文本不可空问题,搞死了

   d.服务端把war包放到tomcat/webapps目录下后,点啥菜单都出现500,可能导致的问题太多了,还每次都不一样,运行环境是个大问题

   e.服务端部署好后,还得设置服务端配置、客户端配置、单机和集群环境还不太一样

   d.客户端连不上服务端问题,又是一顿排查

 

如何部署(linux环境)

环境准备:

linux centos7(华为云or阿里云等云服务器)

tomcat8.5

jdk1.8 (配置好环境变量)

mysql5.7

cat.war文件,一般3.0版

数据库脚本 CatApplication.sql  先创建数据库cat 到mysql执行建表

datasource.xml 文件,里面的连接字符串改成自己的

client.xml(这个文件服务部署用不到,客户端接入的时候用,亲测)

材料就是这些,不过云服务器需要开通外部访问的端口,切记 保证如果cat服务和数据库不在一台机器上时能连接上

服务端部署/data/appdatas/cat/client.xml和 server.xml配置无用(限3.0+war包),可以去掉

部署

1.把apache-tomcat-8.5.84.tar.gz 上传到服务器/usr/local目录 解压成文件夹 tar -zxvf apache-tomcat-8.5.84.tar.gz 得到文件目录apache-tomcat-8.5.84

2.把jdk-8u333-linux-x64.tar.gz 上传到服务器/usr/local目录 解压成文件夹 tar -zxvf jdk-8u333-linux-x64.tar.gz 得到文件目录 jdk1.8.0_333

3.把文件cat.war (如果叫cat-home.war 重命名为cat.war) 上传到目录/usr/local/apache-tomcat-8.5.84/webapps/

4.配置java_home环境变量 vim ~/etc/profile 在最结尾输入

export JAVA_HOME =/usr/local/jdk1.8.0_333
export CLASSPATH =.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

wq保存后执行source ~/etc/profile 刷新缓存

执行java -version 如果不成功搜教程

5.服务器新建cat运行目录并授权

  mkdir -p /data/appdatas/cat 

  mkdir -p /data/applogs/cat 

  chmod 777 /data/appdatas/cat 

  chmod 777 /data/applogs/cat 

6.把改好的datasource.xml 文件上传到/data/appdatas/cat 目录

7.启动tomcat 

   cd /usr/local/apache-tomcat-8.5.84/bin

   sh ./startup.sh  启动后tomcat会自动解压cat.war 并启动cat服务,cat服务会去加载配置

    观察/usr/local/apache-tomcat-8.5.84/logs里面的日志,看看有没有异常

    观察/data/applogs/cat 里面的cat启动日志,一般看数据库能不能连接上

  cd /data/applogs/cat

      cat cat_xxx.log xx自己换一下日期

8. 访问cat地址 

      在浏览器输入ip:8080/cat/r

9.修改服务端配置

     (2者选其一):

   在浏览器输入 ip:8080/cat/s/config?op=serverConfigUpdate    

         或者页面点Configs->全局系统配置->服务端配置 效果是一样的

 

 

       如果是集群部署,还需要改一下本文件 default里面的,搜一下remote-servers

     <property name="remote-servers" value="ip1:8080,ip2:8080"/>

  此配置用于同步各个机器配置

    点提交

10.客户端路由配置

    在浏览器输入 ip:8080/cat/s/config?op=routerConfigUpdate

         或者页面点Configs->全局系统配置->客户端路由 效果是一样的

 此配置主要是告诉客户端 应该连接哪个服务器,单台部署就配一个,多台部署配多个,也是替换掉ip为自己的就行了

 

 

11.项目信息配置

  在Configs->项目信息配置中,加入自己的项目信息,联系人之类的,方便后续添加监控,告警联系人之类的 

 

如果客户端接入不成功,出现connection error的错误,就要来客户端路由这里看看是不是配错什么了

部署完成!!!

不出意外的话,点击applition ->tranaction 应该不会出现500了。

 

如果还是出现500,那当我没说 - -!

 

出现问题的解决方法

1.出问题CAT的服务端

在浏览器输入 ip:8080/cat/s/config?op=serverConfigUpdate    

<property name="remote-servers" value="xx:8080,xx2:8080"/>

如果是集群,把这里配置好,如果这里配置的是外网地址就会一直出现,不过不影响使用

如果是公司内网,把内网ip写上去就行

 

2.点任何地方都是500

1.检查jdk版本,我部署过多套,1.8基本不会出问题,1.7偶尔会有问题

2.检查tomcat版本,和启动日志

3.检查我上诉安装流程,有没有没有做到的,例如文件夹路径,权限,java_home环境变量

4.启动后tomcat会自动解压cat.war 并启动cat服务,cat服务会去/data/appdatas/cat加载配置文件datasource.xml,

 所以要确定mysql可用,表建立完整,连接字符串配置无问题,无特殊字符 圆角,配置确定无误进行下一项

5.再次执行一遍安装步骤中的9,10 两项,必要情况下可以重启tomcat ,甚至服务器

6.确认war包来源无问题,如果自己用编译的war包有问题,尽量用官网的 3.0的

 

3.客户端连接不上cat

  1.检查网络环境,特别是公司内网,有时候是不能访问外网的

  2.检查客户端client.xml 文件路径,app.properties路径

  3.查看cat_home/cat_xx.log日志 排查问题,不外乎配置文件找不到,配置文件配置错误,配置文件ip无法访问,cat服务器未正常对外提供服务

 

 

云服务器部署注意

 对外通信端口 如3306,8080,2280,2281等端口要放开,可以在控制台设置

 云服务器下载什么的都非常简单,部署几分钟就好了

 

公司内网部署注意

公司内网生产环境一般无法访问外网,无法在线安装和下载,所以一些文件上传解压会麻烦一些,特别是有些端口是置顶的,如tomcat不是8080,要改成8000这张,还要集群部署,配置nginx,配置域名

 

集群部署注意

集群要注意的是多个机器之间的通信,例如我2台机器一个在阿里云一个在华为云,ip用的都是公网ip,会出现 【出问题的cat服务端】,正常在公司内网部署,用的都是内网ip,不会出现这个,当然 出现这个提示不影响使用

在浏览器输入 ip:8080/cat/s/config?op=serverConfigUpdate    

<property name="remote-servers" value="xx:8080,xx2:8080"/>

remote-servers 是在一台机器上配置这个后,多台机器会自动同步服务器配置

 

客户端路由设置

<default-server id="10.xx" weight="1.0" port="2280" enable="true"/>
<default-server id="10.xx2" weight="1.0" port="2280" enable="true"/>

enable="true" 要注意,默认可能是false

单机部署注意

如果客户端和服务端 都部署在一台服务器上,/data/appdatas/cat/client.xml文件是给客户端用的,/data/appdatas/cat/datasource.xml是给服务端用的

 

指定CAT_HOME

客户端应用在自动化部署或者本地测试时,不想使用默认路径时,除了自己编译cat-client修改源代码外,还可以指定系统变量CAT_HOME的路径

 

 

 

我的配置参考

服务端配置

<?xml version="1.0" encoding="utf-8"?>
<server-config>
   <server id="default">
      <properties>
         <property name="local-mode" value="false"/>
         <property name="job-machine" value="true"/> 
         <property name="send-machine" value="true"/>
         <property name="alarm-machine" value="true"/>
         <property name="hdfs-enabled" value="false"/>
         <property name="remote-servers" value="139.196.1.1:8080,123.60.1.2: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="139.196.1.1">
      <properties>
         <property name="job-machine" value="true"/>
         <property name="send-machine" value="true"/>
         <property name="alarm-machine" value="true"/>
      </properties>
   </server>
</server-config>

 

客户端路由配置

<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="139.196.1.1" backup-server-port="2280">
   <default-server id="139.196.1.1" weight="1.0" port="2280" enable="true"/>
   <default-server id="123.60.1.2" 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="139.196.1.1"/>
      <group-server id="123.60.1.2"/>
   </server-group>
   <domain id="cat">
      <group id="default">
         <server id="139.196.1.1" port="2280" weight="1.0"/>
         <server id="123.60.1.2" port="2280" weight="1.0"/>
      </group>
   </domain>
</router-config>

 

datasource.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://xx:3306/cat]]></url>  <!-- 请替换为真实数据库URL及Port  -->
                        <user>root</user>
                        <password>123456</password>
                        <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
                </properties>
        </data-source>
</data-sources>

 

client.xml

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

 

app.name =xxx-app

路径 项目中resource/META-INF/app.properties

 

结尾

各种环境的cat我都部署了好多次,每次遇到的情况也不一样,只能说想要在公司搭一套进行简单的使用,上手难度还是非常高的,不像skywalking 部署超级简单docker环境下 docker compose 直接搞定,不过skywalking擅长的是链路追踪和日志查询,对于metrics+监控告警 方面还不够。结合使用效果更佳。

目前cat已经属于比较老的中间件了,美团方面开源部分没维护了,部署起来又困难,加上代码侵入性,用的人不多了。

但是用过cat的人,基本都会喜欢用cat,那种服务可视化、透明化,超强控制力的感觉,以agent为代表的skywaling们是远远比不了的。

posted @ 2023-02-21 16:41  井传红  阅读(1159)  评论(2编辑  收藏  举报