美團點評CAT部署了各種環境不下10次,遇到的坑整理

2023-02-21 18:01:41

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/[email protected]"/>
            <property name="dfs.cat.kerberos.principal" value="[email protected]"/>
            <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們是遠遠比不了的。