我們有三種部署方式:
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
