CAT 监控 3.1.0 配置参数详解
详解 CAT(Central Application Tracking)3.1.0 全部配置参数:client.xml/datasources.xml/server.xml 逐项实测、config 表 23 行配置中心逐行解析、控制台提交与审计留痕、采样率修改与还原实测、路由端点 NPE 排障实录。
CAT 监控 3.1.0 配置参数详解
目标:把 CAT(Central Application Tracking,大众点评开源 APM)3.1.0 的全部配置项一次讲透——本地三份 XML(client.xml / datasources.xml / server.xml)逐项参数与默认值、MySQL
config表 23 行配置中心逐行解析、控制台提交与审计留痕实测、采样率在线修改与还原实测、路由下发端点 NPE 排障实录,并给出单机/集群两套可直接落地的生产配置模板。已在 Ubuntu 22.04 服务器(JDK 1.8.0_504 + MySQL 5.7.44 + Tomcat 9.0.123)逐项实测通过,全部回显来自真实环境。
一、环境信息
本文所有命令与输出均在以下环境实测采集(与《CAT 监控 3.1.0 安装指南》同环境):
- 操作系统:Ubuntu 22.04 LTS(x86_64)
- CAT 服务端机器:IP
10.89.66.3,主机名cat-server.local,Tomcat 9.0.123 + cat.war(3.1.0),配置目录/data/appdatas/cat/ - 数据库机器:IP
10.89.66.2,MySQL 5.7.44(max_allowed_packet=1G),库名cat(26 张表) - JDK:OpenJDK 1.8.0_504(源码与运行均在
/usr/lib/jvm/java-8-openjdk-amd64) - 源码目录:
/opt/cat-src(tag 3.1.0,用于核对配置模型与默认值) - CAT 版本:dianping/Cat 3.1.0
- 端口:控制台 HTTP
8080、客户端上报 TCP2280
⚠️ 说明:本文 CAT 指 Central Application Tracking 应用监控系统,与 Linux Shell 命令
cat无关。文中出现的cat.xml、cat_20261023.log等均为 CAT 自身的文件名。
二、前置条件
阅读与动手前确认:
- CAT 服务端已按安装指南部署完成并可登录控制台(安装流程见《CAT 监控 3.1.0 安装指南》,本文不重复安装步骤);
- 数据库中
cat库已建表(26 张表),config表可读写; - 源码或源码包在手(核对模型与默认值时要用到
/opt/cat-src,离线环境可只保留需要查阅的几个文件); - 控制台账号可登录:账号
admin、密码q1w2e3r4(由安装指南 4.8 节-DCAT_ADMIN_PWD设定,缺省admin/admin)。
逐项验证(以下均在 CAT 服务器 10.89.66.3 执行):
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/cat/r/
实测输出:
200
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='cat';"
实测输出:
table_count
26
ls /opt/cat-src/pom.xml
实测输出:
/opt/cat-src/pom.xml
三、配置体系总览与查看修改方式
CAT 3.1.0 的配置不是一个文件,而是三层体系:本地 XML 文件(启动时读取)、MySQL config 表(运行期权威配置中心)、JVM 系统属性(进程级开关)。本节先建立全局视图,再给出三种查看方式与两种修改方式。
3.1 三层配置体系
| 层 | 载体 | 读取时机 | 生效方式 | 权威性 |
|---|---|---|---|---|
| 本地配置文件 | /data/appdatas/cat/client.xml、datasources.xml、server.xml | 进程启动时一次性读取 | 改文件 + 重启 Tomcat | client.xml/datasources.xml 永久权威;server.xml 仅首次初始化兜底 |
| 配置中心 | MySQL cat 库 config 表(23 行) | 启动加载 + 运行期按行刷新 | 控制台/接口提交即入库,自动刷新,多数无需重启 | 运行期权威(角色、路由、采样、告警等) |
| JVM 系统属性 | Tomcat bin/setenv.sh 的 CATALINA_OPTS | 进程启动时 | 改文件 + 重启 | 进程级(CAT_HOME、控制台密码、堆大小等) |
💡 技术拓展:APM 服务端「配置下发」不止 CAT 这一种「数据库配置中心」形态。常见对比——
形态 代表 特点 数据库配置表 CAT 3.x config表改一次全集群生效,天然持久化(本文主角) 本地文件 + 热加载 SkyWalking application.yml 部署简单,多节点要逐台改 独立配置服务 Nacos/Apollo 接入 企业统一治理,多一套依赖 环境变量/启动参数 Zipkin 环境变量 十二要素风格,适合云原生部署 CAT 3.x 实际采用「数据库配置中心 + 本地文件兜底」的混合形态,本文因单机验证环境,三层全部落到本机。
3.2 配置查看方式(文件 + SQL + 控制台)
① 本地文件查看:
ls -la /data/appdatas/cat/
实测输出:
total 96
drwxr-xr-x 3 root root 4096 Oct 23 00:06 .
drwxr-xr-x 3 root root 4096 Oct 22 23:38 ..
drwxr-x--- 4 root root 4096 Oct 22 23:49 bucket
-rw-r----- 1 root root 1048576 Oct 23 00:20 cat-cat.mark
-rw-r----- 1 root root 63350 Oct 23 00:20 cat_20261023.log
-rw-r--r-- 1 root root 163 Oct 22 23:38 client.xml
-rw-r--r-- 1 root root 707 Oct 22 23:48 datasources.xml
-rw-r--r-- 1 root root 726 Oct 22 23:38 server.xml
(client.xml/datasources.xml/server.xml 三份为配置文件;bucket/ 是消息与报表本地落盘目录,由 server.xml 的 local-base-dir 指定;cat_20261023.log 是按天滚动的服务端日志;cat-cat.mark 是消息存储的游标标记文件,勿手工编辑。)
② config 表查看(在任意能连库的机器执行):
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT id,name,LENGTH(content) AS bytes,modify_date FROM config ORDER BY id;"
实测输出:
id name bytes modify_date
1 user-config 115 2026-10-22 23:49:01
2 resource-config 173 2026-10-22 23:49:01
3 server-config 873 2026-10-23 00:06:01
4 serverFilter 1087 2026-10-22 23:49:01
5 all-report-config 252 2026-10-22 23:49:01
6 atomic-message-config 270 2026-10-22 23:49:01
7 tp-value-statistic-config 401 2026-10-22 23:49:01
8 report-reload-config 282 2026-10-22 23:49:01
9 domainGroup 316 2026-10-22 23:49:01
10 heartbeat-display-policy 6478 2026-10-22 23:49:01
11 topologyConfig 2416 2026-10-22 23:49:01
12 topoGraphFormat 178 2026-10-22 23:49:01
13 routerConfig 557 2026-10-22 23:49:01
14 senderConfig 807 2026-10-22 23:49:01
15 storageGroup 536 2026-10-22 23:49:01
16 exceptionRuleConfig 851 2026-10-22 23:49:01
17 alertPolicy 1447 2026-10-22 23:49:01
18 alertConfig 947 2026-10-22 23:49:01
19 sampleConfig 157 2026-10-23 00:22:42
20 heartbeatRuleConfig 354 2026-10-22 23:49:01
21 transactionRule 317 2026-10-22 23:49:01
22 eventRule 582 2026-10-22 23:49:01
23 capacityUpdateStatus 36 2026-10-23 00:06:53
💡 说明:首启动时 CAT 会把这 23 行「内置默认值」自动写入
config表(modify_date为初始化时刻),之后运行期以表内值为准。server-config、sampleConfig、capacityUpdateStatus三行的modify_date晚于其余行,正是因为后文实测提交过配置。
③ 控制台页面查看(登录 http://10.89.66.3:8080/cat/r/ 后进入「配置管理」菜单,或直接访问 URL):
curl -s -m 8 -c /tmp/cc.txt --data-urlencode 'account=admin' \
--data-urlencode 'password=q1w2e3r4' \
--data-urlencode 'login=1' --data-urlencode 'op=login' \
-o /dev/null -w 'login=%{http_code}\n' http://127.0.0.1:8080/cat/s/login
实测输出(302 为登录成功后的重定向):
login=302
curl -s -m 8 -b /tmp/cc.txt -o /dev/null -w 'serverConfigPage=%{http_code}\n' \
'http://127.0.0.1:8080/cat/s/config?op=serverConfigUpdate'
实测输出:
serverConfigPage=200
配置控制台 URL 规律:/cat/s/config?op=<动作名>,全部动作名(源码 cat-home/src/main/java/com/dianping/cat/system/page/config/Action.java 实测枚举)如下:
| op 动作名 | 用途 |
|---|---|
serverConfigUpdate | 服务端角色/存储/慢查询阈值(对应 config 表 server-config) |
routerConfigUpdate | 客户端路由(routerConfig) |
sampleConfigUpdate | 消息采样率(sampleConfig) |
alertSenderConfigUpdate | 告警发送通道(senderConfig) |
serverFilterConfigUpdate | 服务端消息过滤(serverFilter) |
allReportConfig | 全量报表聚合项(all-report-config) |
reportReloadConfigUpdate | 报表重载(report-reload-config) |
storageGroupConfigUpdate | 存储分组(storageGroup) |
domainGroupConfigUpdate / domainGroupConfigSubmit / domainGroupConfigDelete | 域分组增删改(domainGroup) |
exceptionThresholdUpdate / exceptionThresholdAdd / exceptionThresholdUpdateSubmit / exceptionThresholdDelete | 异常告警阈值 |
exceptionExcludeAdd / exceptionExcludeUpdateSubmit / exceptionExcludeDelete | 异常排除项 |
transactionRuleUpdate / transactionRuleSubmit / transactionRuleDelete | Transaction 告警规则 |
eventRuleUpdate / eventRuleSubmit / eventRuleDelete | Event 告警规则 |
storageRuleUpdate / storageRuleSubmit / storageRuleDelete | 存储规则 |
displayPolicy | 心跳图展示策略(heartbeat-display-policy) |
topologyConfigUpdate 类 | 拓扑图配置 |
3.3 配置修改方式与生效路径
两类修改路径,各自生效方式不同:
路径一:本地文件修改(client.xml / datasources.xml)→ 重启生效。直接编辑文件后重启 Tomcat:
/opt/tomcat/bin/shutdown.sh
sleep 5
/opt/tomcat/bin/startup.sh
路径二:控制台/接口提交(config 表行)→ 入库自动刷新,多数无需重启。页面在文本框粘贴 XML 提交,或用接口带登录 Cookie 提交(7.4 节有完整实测)。提交后 CAT 把 XML 规范化(自动重排缩进、去掉 XML 声明等)写回 config 表,并按管理器各自的刷新周期加载生效。
⚠️ 例外:
server-config(服务端角色)官方明确「当一个机器角色更改后,请重启该机器」——提交入库后仍需重启本节点,让消费/告警/任务线程按新角色拉起。
3.4 修改审计(config_modification)
每次通过控制台/接口提交配置,CAT 都会在 config_modification 表留痕(操作人、动作、时间),实测查询:
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT id,user_name,account_name,action_name,date FROM config_modification ORDER BY id;"
实测输出(含 7.4 节将要做的两次采样率修改):
id user_name account_name action_name date
1 admin admin serverConfigUpdate 2026-10-23 00:06:01
2 admin admin sampleConfigUpdate 2026-10-23 00:22:32
3 admin admin sampleConfigUpdate 2026-10-23 00:22:42
💡 说明:
user_name/account_name均为登录账号(本文admin);argument字段(longtext)保存提交时的完整 payload JSON,可用于追溯改前改后差异。生产变更管理可直接以该表为审计源。
四、client.xml 逐项详解(客户端路由)
client.xml 是 CAT 客户端的引导配置:业务应用(以及 CAT 服务端自身——服务端也作为客户端上报自监控数据)启动时读它来发现服务端集群地址。安装指南 4.6 节已给出初始化写法,本节逐项拆解。
4.1 元素层级模型
模型定义文件(源码实测)cat-client/src/main/resources/META-INF/dal/model/client-codegen.xml 给出 client.xml 的完整元素树:
| 层级 | 元素 | 属性 | 说明 |
|---|---|---|---|
| 根 | config | mode(固定 client)、enabled、dump-locked | enabled=false 关闭客户端上报;dump-locked 锁定本地消息转储 |
| 子 | servers | (父级包裹元素) | 服务端列表 |
| 孙 | server | ip、port(TCP 上报端口)、http-port(拉配置用 HTTP 端口)、enabled | 一行一个服务端节点,可写多行 |
| 子 | domain | id、ip、enabled、max-message-size | 按应用域覆盖默认行为(限流单条消息上限等) |
| 子 | bind | ip、port | 客户端本地绑定地址/端口(特殊网络场景用) |
| 子 | property | name + 文本值 | 扩展自定义属性 |
4.2 本文实测文件逐项说明
<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<server ip="127.0.0.1" port="2280" http-port="8080"/>
</servers>
</config>
逐项说明:
| 项 | 本文取值 | 含义与取值方法 |
|---|---|---|
config mode="client" | client | 客户端模式,固定值 |
server ip | 127.0.0.1 | 服务端 IP;集群环境写多台节点的真实 IP,每台一行 |
server port | 2280 | TCP 消息上报端口,官方注明 2280 不允许修改 |
server http-port | 8080 | 客户端拉路由/配置的 HTTP 端口,与 Tomcat 监听一致 |
server enabled | (缺省 true) | 显式写 enabled="false" 可临时摘除某节点 |
💡 技术拓展:客户端「发现服务端」的地址来源不止 client.xml 一种,CAT 按优先级取用——
来源 说明 场景 启动参数/系统属性 -Dcat.servers=ip:port,ip:port等属性覆盖免改文件灰度切流 client.xml 本文件 常规部署(本文实测采用) 配置服务端下发 启动后从 http-port拉取/cat/s/router路由服务端集群扩缩容后动态生效 本地缓存 client_cache.xml(拉取失败时兜底)配置中心短暂不可用时保命 本文单机环境
servers只写本机一行;集群环境下 client.xml 先写任一可用节点,路由拉通后以服务端routerConfig下发为准。
4.3 路由下发端点实测与 NPE 排障实录
客户端启动后按 http-port 请求服务端 /cat/s/router 端点拿路由。实测该端点必须携带 domain 参数,缺参会触发服务端 500:
curl -s -m 8 'http://127.0.0.1:8080/cat/s/router'
实测输出(服务端 500 错误页,节选):
<!doctype html><html lang="en"><head><title>HTTP Status 500 – Internal Server Error</title>...
<p><b>Message</b> Error occured when handling uri: /cat/s/router</p>
服务端日志(/data/appdatas/cat/cat_20261023.log)同步记录了完整堆栈,定位到空指针行:
[10-23 00:22:42.788] [ERROR] [HttpServlet] Error occured when handling uri: /cat/s/router
java.lang.RuntimeException: Error occured during handling outbound action(router)
...
Caused by: java.lang.NullPointerException
at com.dianping.cat.system.page.router.config.RouterConfigManager.queryServersByDomain(RouterConfigManager.java:283)
at com.dianping.cat.system.page.router.Handler.buildRouterInfo(Handler.java:88)
at com.dianping.cat.system.page.router.Handler.handleOutbound(Handler.java:139)
...
定位:对照源码 RouterConfigManager.java 第 283 行是 int hashCode = domain.hashCode();——domain 入参为 null,即 HTTP 请求没带 domain 查询参数。解决:带上 domain(生产中由 CAT 客户端自动携带,手工探测时手动加)与 ip:
curl -s -m 8 'http://127.0.0.1:8080/cat/s/router?domain=testapp&ip=10.89.66.3&hostname=cat-server.local'
实测输出(分号分隔的服务端地址列表,结尾分号收尾):
127.0.0.1:2280;
💡 说明:返回串
127.0.0.1:2280;即客户端解析后得到的可上报服务端列表(多节点时形如ip1:2280;ip2:2280;)。排障时该端点是判断「路由配置是否正确下发」的最直接探针:返回 500 先查参数,返回空串或旧节点先查 config 表routerConfig行。
五、datasources.xml 逐项详解(数据库连接池)
datasources.xml 决定 CAT 服务端如何连 MySQL——报表读写全部走这里配置的连接池。解析入口在源码 cat-home/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java(实测 defineJdbcDataSourceConfigurationManagerComponent("datasources.xml"))。
5.1 官方模板与实测文件
官方 docker 模板(源码 docker/datasources.xml)与本文实测文件字段完全一致,仅连接串不同。本文实测文件(数据库 IP 为 10.89.66.2):
<?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://10.89.66.2:3306/cat]]></url>
<user>root</user>
<password>q1w2e3r4</password>
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>
5.2 参数逐项说明
| 参数 | 本文取值 | 官方模板取值 | 含义与调整建议 |
|---|---|---|---|
data-source id | cat | cat | 数据源标识,CAT 固定读 id=cat,勿改 |
maximum-pool-size | 3 | 3 | 连接池上限。官方模板即 3;CAT 报表落库以批量写为主,3 个连接足够支撑单机,集群大流量可上调到 5-8,并同步观察 MySQL max_connections |
connection-timeout | 1s | 1s | 从池里拿连接的最长等待时间;拿不到即快速失败,避免报表线程堆积 |
idle-timeout | 10m | 10m | 空闲连接回收时间 |
statement-cache-size | 1000 | 1000 | 预编译语句缓存条数 |
driver | com.mysql.jdbc.Driver | 同左 | 固定旧驱动类名——WAR 内置 mysql-connector-java-5.1.20.jar,必须用它 |
url | jdbc:mysql://10.89.66.2:3306/cat | jdbc:mysql://MYSQL_URL:MYSQL_PORT/MYSQL_SCHEMA | 库地址;集群只需一个库(官方提醒勿每节点建库) |
user/password | root/q1w2e3r4 | 占位符 | 数据库账号 |
connectionProperties | useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000 | 同左 | 逐项:UTF-8 编码(防中文乱码)、断线自动重连、socket 读超时 120 秒(报表大事务保护) |
5.3 连接池生效验证
maximum-pool-size=3 是否生效,直接数 MySQL 端的连接数(在 CAT 服务器执行):
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "SELECT SUBSTRING_INDEX(host,':',1) AS client_host, COUNT(*) AS conn_cnt FROM information_schema.processlist GROUP BY client_host;"
实测输出:
client_host conn_cnt
10.89.66.3 3
localhost 1
💡 说明:来自 CAT 服务器(10.89.66.3)的连接恰好 3 条,与
maximum-pool-size=3完全吻合(localhost 的 1 条是本次查询自身)。改大池子后用同一条命令复核即可。
六、server.xml 逐项详解(服务端角色与存储)
server.xml 是服务端本地兜底配置(server-config 初始化源)。解析类为源码 cat-core/src/main/java/com/dianping/cat/config/server/ServerConfigManager.java。再次强调:3.x 运行期权威值在 config 表 server-config 行(见 6.4 与第七章),server.xml 只在数据库不可用时兜底。
6.1 本文实测文件
<?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-enable" value="false"/>
</properties>
<storage local-base-dir="/data/appdatas/cat/bucket/" local-report-storage-time="7" local-logivew-storage-time="7">
</storage>
<consumer>
<long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
</long-config>
</consumer>
</server>
</server-config>
6.2 核心属性逐项说明
<property> 全部为「名称=布尔/字符串」开关,五个官方属性:
| 属性 | 本文取值 | 默认值(源码) | 含义 |
|---|---|---|---|
local-mode | false | false | true=本地模式:消息只写本地 bucket 不入库,用于开发调试;生产必须 false |
job-machine | true | false | 任务机:负责小时/天/周/月报表的汇总任务调度,集群中只放 1 台 |
send-machine | true | false | 发送机:触发告警事件对外发送 |
alarm-machine | true | false | 告警机:运行告警规则评估(异常/心跳/业务等 analyzer) |
hdfs-enabled | false | false | 报表/消息转存 HDFS;不用 Hadoop 生态保持 false(小规模直接磁盘模式) |
<storage> 属性:
| 属性 | 本文取值 | 含义 |
|---|---|---|
local-base-dir | /data/appdatas/cat/bucket/ | 消息与报表本地落盘根目录,目录必须存在且可写 |
local-report-storage-time | 7 | 本地报表保留天数 |
local-logivew-storage-time | 7 | 本地 LogView(调用链视图)保留天数 |
max-hdfs-storage-time | (config 表版 15) | HDFS 模式下的存储保留天数,仅 hdfs-enabled=true 有效 |
har-mode / upload-thread | (config 表版 true / 5) | 归档模式与上传线程数,HDFS 场景使用 |
<consumer><long-config> 属性(慢请求判定阈值,单位毫秒):
| 属性 | 默认值 | 含义 |
|---|---|---|
default-url-threshold | 1000 | URL 请求超過 1000ms 记为 Long-URL |
default-sql-threshold | 100 | SQL 超過 100ms 记为 Long-SQL |
default-service-threshold | 50 | Service(对内服务)超過 50ms 记为 Long-Service |
6.3 隐藏属性清单(源码默认值实测)
ServerConfigManager 支持的属性远不止官方文档列出的五个。实测在源码中 grep getProperty 全量提取(grep -nE "getProperty\(\"" .../ServerConfigManager.java),得到以下可配置项与默认值:
| 属性 | 默认值 | 含义 |
|---|---|---|
message-dumper-thread | 5 | 消息落盘线程数 |
message-processor-thread | 20 | 消息处理(消费)线程数 |
model-service-thread | 100 | 模型服务(报表实时查询)线程数 |
block-dump-thread | 5 | 块转储线程数 |
max-type-threshold | 100 | 单项目 Transaction type 数量上限,超限丢弃防打爆 |
type-name-length-limit | 256 | type 名长度上限 |
tp-value-expire-minute | 1 | TP 分位值统计过期时间(分钟) |
storage-compress-type | snappy | 本地存储压缩算法(snappy/deflate) |
storage-deflate-level | 5 | deflate 压缩级别 |
storage-max-block-size | 131072 | 存储块大小(字节,128KB) |
storage-nio-enable | true | 存储是否用 NIO |
use-new-storage | true | 是否用新存储引擎 |
<analyzer>-analyzer-threads | 2 | 各分析器线程数(如 transaction-analyzer-threads) |
<analyzer>-analyzer-enable | true | 各分析器开关(如 cross-analyzer-enable=false 可关某个分析器) |
remote-servers | 空串 | 集群节点列表 ip:8080,ip:8080,告警远程同步用 |
remote-servers-fixed | false | 是否固定 remote-servers 不动态调整 |
router-adjust-enabled | false | 是否开启路由自动调节 |
forced-statistic-type-prefixes | — | 强制统计的 type 前缀 |
💡 说明:这些隐藏属性同样通过
<property name="..." value="..."/>写进 server.xml 或经控制台提交到server-config行。调优时常用的三个:消息堆积加大message-processor-thread;type 打爆限流调max-type-threshold;关闭不需要的分析器省 CPU(如无跨调用分析需求设cross-analyzer-enable=false)。
6.4 生效机制:config 表 vs 本地文件(含生效验证)
server.xml 的角色开关改完「没生效」是最高频疑问。机制:首次启动时若 config 表 server-config 行不存在,CAT 以 server.xml 内容入库;之后运行期只认表内值。因此正确改法是控制台提交(第七章 7.2),提交后重启本节点,用日志验证角色生效:
grep 'CAT server is running' /data/appdatas/cat/cat_20261023.log | tail -3
实测输出(提交 job-machine=true/alarm-machine=true 并重启后):
[10-23 00:06:53.687] [INFO] [ServerConfigManager] CAT server is running with hdfs,false
[10-23 00:06:53.687] [INFO] [ServerConfigManager] CAT server is running with alert,true
[10-23 00:06:53.687] [INFO] [ServerConfigManager] CAT server is running with job,true
(alert,true 即告警机、job,true 即任务机已生效;hdfs,false 对应 hdfs-enabled=false。)
七、config 表配置中心逐行详解
本章把 config 表 23 行逐行讲清。查看单行内容用 \G 竖排输出,例如:
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content FROM config WHERE name='server-config'\G"
(以下各节内容均为此命令的实测回显,数据库机器为 10.89.66.2。)
7.1 全量配置行清单
| name 行 | 作用 | 修改入口(op) | 关联章节 |
|---|---|---|---|
user-config | 平台用户角色 | 控制台「用户管理」 | 7.9 |
resource-config | 页面访问权限 | 控制台 | 7.9 |
server-config | 服务端角色/存储/慢查询阈值 | serverConfigUpdate | 7.2 |
serverFilter | 服务端消息过滤 | serverFilterConfigUpdate | 7.8 |
all-report-config | 全量报表聚合项 | allReportConfig | 7.9 |
atomic-message-config | 原子消息聚合规则 | 控制台 | 7.9 |
tp-value-statistic-config | TP 分位值统计范围 | 控制台 | 7.9 |
report-reload-config | 报表重载周期 | reportReloadConfigUpdate | 7.9 |
domainGroup | 域分组(多机房归组) | domainGroupConfigUpdate | 7.9 |
heartbeat-display-policy | 心跳图展示策略 | displayPolicy | 7.9 |
topologyConfig / topoGraphFormat | 拓扑图配置 | 控制台 | 7.9 |
routerConfig | 客户端路由 | routerConfigUpdate | 7.3 |
senderConfig | 告警发送通道 | alertSenderConfigUpdate | 7.5 |
storageGroup | 存储分组 | storageGroupConfigUpdate | 7.9 |
exceptionRuleConfig | 异常告警阈值/排除 | exceptionThresholdUpdate 等 | 7.7 |
alertPolicy | 告警级别与通道策略 | 控制台 | 7.6 |
alertConfig | 告警接收人 | 控制台 | 7.6 |
sampleConfig | 采样率 | sampleConfigUpdate | 7.4 |
heartbeatRuleConfig | 心跳告警规则 | 控制台 | 7.9 |
transactionRule / eventRule | Transaction/Event 告警规则 | transactionRuleUpdate/eventRuleUpdate | 7.9 |
capacityUpdateStatus | 报表容量统计游标 | 系统自动 | 7.9 |
7.2 server-config(服务端角色与存储)
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content FROM config WHERE name='server-config'\G"
实测输出:
*************************** 1. row ***************************
content: <?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="127.0.0.1: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">
</storage>
<consumer>
<long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
</long-config>
</consumer>
</server>
</server-config>
逐项解读:属性含义同 6.2 节表格,另注意三点——① 行内属性名是 hdfs-enabled(server.xml 里写成 hdfs-enable 的旧写法在入库时会被规范化,统一以 -enabled 为准);② remote-servers 单机填 127.0.0.1:8080,集群填全部节点 ip1:8080,ip2:8080,...;③ storage 的 har-mode="true" 与 upload-thread="5" 为内置默认,仅 HDFS 模式生效,磁盘模式可忽略。修改入口为控制台「配置管理 → 服务端配置」(op=serverConfigUpdate),提交后重启节点并按 6.4 节日志验证。
7.3 routerConfig(客户端路由)
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content FROM config WHERE name='routerConfig'\G"
实测输出:
*************************** 1. row ***************************
name: routerConfig
content: <?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="??" 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>
<domain id="cat">
<group id="default">
<server id="127.0.0.1" port="2280" weight="1.0"/>
</group>
</domain>
</router-config>
逐项说明:
| 元素/属性 | 含义 |
|---|---|
router-config backup-server / backup-server-port | 全局兜底服务器;客户端所有路由都失败时连它 |
default-server id/weight/port/enable | 默认上报节点与权重(同权重随机,权重高流量大) |
network-policy server-group | 网络策略把哪些 IP 段引到哪个 server-group(多机房分流) |
server-group / group-server | 分组内的节点集合 |
domain id="cat" | 按应用域定制的专属路由(示例为服务端自监控域 cat) |
集群改造示例:两节点时把 <default-server>/<server-group> 中加入第二台,如 <default-server id="10.0.0.2" weight="1.0" port="2280" enable="true"/> 与 <group-server id="10.0.0.2"/>。改完无需重启,客户端下次拉取 /cat/s/router 即得到新列表(用 4.3 节端点实测验证)。
7.4 sampleConfig(采样率)——在线修改与还原实测
采样率控制消息上报的留存量(1.0=全量,0.5=50%)。当前值查询:
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content FROM config WHERE name='sampleConfig'\G"
实测输出(初始内置值):
*************************** 1. row ***************************
name: sampleConfig
content: <?xml version="1.0" encoding="utf-8"?>
<sample-config>
<domain id="cat" sample="1.0"></domain>
<domain id="javacat" sample="1.0"></domain>
</sample-config>
修改实测:登录后用接口把 javacat 域采样改为 0.5(op=sampleConfigUpdate,XML 放 content 参数):
curl -s -m 8 -b /tmp/cc.txt --data-urlencode 'content=<?xml version="1.0" encoding="utf-8"?>
<sample-config>
<domain id="cat" sample="1.0"></domain>
<domain id="javacat" sample="0.5"></domain>
</sample-config>' -o /dev/null -w 'update=%{http_code}\n' \
'http://127.0.0.1:8080/cat/s/config?op=sampleConfigUpdate'
实测输出:
update=200
验证入库(注意服务端把提交内容规范化重排了):
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content, modify_date FROM config WHERE name='sampleConfig'\G"
实测输出:
*************************** 1. row ***************************
content: <?xml version="1.0" encoding="utf-8"?>
<sample-config>
<domain id="cat" sample="1.0"/>
<domain id="javacat" sample="0.5"/>
</sample-config>
modify_date: 2026-10-23 00:22:32
还原实测(同接口把 0.5 改回 1.0):
curl -s -m 8 -b /tmp/cc.txt --data-urlencode 'content=<?xml version="1.0" encoding="utf-8"?>
<sample-config>
<domain id="cat" sample="1.0"></domain>
<domain id="javacat" sample="1.0"></domain>
</sample-config>' -o /dev/null -w 'revert=%{http_code}\n' \
'http://127.0.0.1:8080/cat/s/config?op=sampleConfigUpdate'
实测输出:
revert=200
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content, modify_date FROM config WHERE name='sampleConfig'\G"
实测输出:
*************************** 1. row ***************************
content: <?xml version="1.0" encoding="utf-8"?>
<sample-config>
<domain id="cat" sample="1.0"/>
<domain id="javacat" sample="1.0"/>
</sample-config>
modify_date: 2026-10-23 00:22:42
两次修改在审计表 config_modification 留痕(回显见 3.4 节)。要点:① 采样按「域」粒度配置,新增业务域默认全量,需要限流时按域加行;② 服务端会规范化 XML(自闭合标签、去 XML 声明),比对内容时以回读值为准;③ 提交即生效,无需重启。
7.5 senderConfig(告警发送通道)
mysql -h10.89.66.2 -uroot -pq1w2e3r4 -e "USE cat; SELECT content FROM config WHERE name='senderConfig'\G"
实测输出:
*************************** 1. row ***************************
name: senderConfig
content: <?xml version="1.0" encoding="utf-8"?>
<sender-config>
<sender id="mail" url="http://test/" type="post" successCode="200" batchSend="true">
<par id="type=1500"/>
<par id="key=title,body"/>
<par id="re=test@test.com"/>
<par id="to=${receiver}"/>
<par id="value=${title},${content}"/>
</sender>
<sender id="weixin" url="http://test/" type="post" successCode="success" batchSend="true">
<par id="domain=${domain}"/>
<par id="email=${receiver}"/>
<par id="title=${title}"/>
<par id="content=${content}"/>
<par id="type=${type}"/>
</sender>
<sender id="sms" url="http://test/" type="post" successCode="200" batchSend="false">
<par id="jsonm={type:808,mobile:'${receiver}',pair:{body='${content}'}}"/>
</sender>
</sender-config>
逐项说明:内置 mail/weixin/sms 三个发送通道,均为 HTTP POST 型 webhook(url 指向企业内部的邮件/微信/短信网关,内置值 http://test/ 是占位);successCode 是判定发送成功的响应关键字(mail/sms 按 HTTP 200,weixin 按响应体含 success);batchSend 是否批量;par 定义 POST 参数模板,${receiver}/${title}/${content}/${domain}/${type} 为运行期变量替换。对接自有告警网关时:改 url 为真实网关、按网关 API 调整 par 模板即可,通道 id(mail/weixin/sms)与 alertPolicy 的 send 字段对应,勿改。
7.6 alertPolicy 与 alertConfig(告警策略与接收人)
alertPolicy 实测内容:
*************************** 1. row ***************************
name: alertPolicy
content: <?xml version="1.0" encoding="utf-8"?>
<alert-policy>
<type id="Transaction">
<group id="default">
<level id="warning" send="mail,weixin" suspendMinute="5"/>
<level id="error" send="mail,weixin" suspendMinute="5"/>
</group>
</type>
<type id="Event">
<group id="default">
<level id="warning" send="mail,weixin" suspendMinute="5"/>
<level id="error" send="mail,weixin" suspendMinute="5"/>
</group>
</type>
<type id="Exception">
<group id="default">
<level id="warning" send="mail,weixin" suspendMinute="5"/>
<level id="error" send="mail,weixin" suspendMinute="5"/>
</group>
</type>
<type id="Business">
<group id="default">
<level id="error" send="mail,weixin" suspendMinute="5"/>
<level id="warning" send="mail,weixin" suspendMinute="5"/>
</group>
<group id="demo-project1">
<level id="error" send="mail,weixin,sms" suspendMinute="5"/>
<level id="warning" send="mail,weixin,sms" suspendMinute="5"/>
</group>
</type>
<type id="Heartbeat">
<group id="default">
<level id="warning" send="mail,weixin" suspendMinute="10"/>
<level id="error" send="mail,weixin" suspendMinute="10"/>
</group>
</type>
<type id="default">
<group id="default">
<level id="warning" send="mail,weixin" suspendMinute="5"/>
<level id="error" send="mail,weixin" suspendMinute="5"/>
</group>
</type>
</alert-policy>
| 元素 | 含义 |
|---|---|
type id | 告警大类:Transaction/Event/Exception/Business/Heartbeat,default 兜底其余 |
group id | 项目分组(对应「项目分组管理」),default 为全部分组 |
level id | warning/error 两级 |
send | 发送通道,逗号分隔,取值对应 senderConfig 的 sender id |
suspendMinute | 同一告警的抑制时间(分钟),防止告警风暴 |
alertConfig(接收人)实测内容:
*************************** 1. row ***************************
name: alertConfig
content: <alert-config>
<receiver id="Transaction" enable="true">
<email>testUser1@test.com</email>
<email>testUser2@test.com</email>
<phone>12345678901</phone>
<phone>12345678902</phone>
</receiver>
<receiver id="Event" enable="true">
<email>testUser1@test.com</email>
<email>testUser2@test.com</email>
<phone>12345678901</phone>
<phone>12345678902</phone>
</receiver>
<receiver id="Exception" enable="true">
<email>testUser1@test.com</email>
<email>testUser2@test.com</email>
<phone>12345678901</phone>
<phone>12345678902</phone>
</receiver>
<receiver id="Heartbeat" enable="true">
<email>testUser1@test.com</email>
<email>testUser2@test.com</email>
<phone>12345678901</phone>
<phone>12345678902</phone>
</receiver>
<receiver id="Business" enable="true">
<email>testUser1@test.com</email>
<email>testUser2@test.com</email>
<phone>12345678901</phone>
<phone>12345678902</phone>
</receiver>
</alert-config>
💡 说明:
receiver id同样是告警大类,phone逐行添加;email 走 senderConfig 的 mail 通道、phone 走 sms 通道。生产落地顺序:先改 senderConfig 指向真实网关 → 再改 alertConfig 填真实接收人 → 最后按需收紧 alertPolicy 的 suspendMinute。
7.7 exceptionRuleConfig(异常告警阈值与排除)
*************************** 1. row ***************************
name: exceptionRuleConfig
content: <?xml version="1.0" encoding="utf-8"?>
<exception-rule-config>
<exception-limit id="cat:Total" domain="cat" name="Total" warning="100" error="300" />
<exception-exclude id="cat:org.apache.hadoop.ipc.RemoteException" domain="cat" name="org.apache.hadoop.ipc.RemoteException"/>
<exception-exclude id="cat:java.net.ConnectException" domain="cat" name="java.net.ConnectException"/>
<exception-limit id="Default:Total" domain="Default" name="Total" warning="200" error="400" />
<exception-exclude id="Default:com.mongodb.MongoException$Network" domain="Default" name="com.mongodb.MongoException$Network"/>
<exception-exclude id="Default:net.spy.memcached.internal.CheckedOperationTimeoutException" domain="Default" name="net.spy.memcached.internal.CheckedOperationTimeoutException"/>
</exception-rule-config>
| 元素 | 含义 |
|---|---|
exception-limit domain name warning error | 每分钟异常量阈值:domain=cat name=Total 即 cat 域全量异常超 100 次 warning、超 300 次 error;Default 域规则兜底所有未单独配置的项目 |
exception-exclude domain name | 排除清单:命中的异常类不参与告警(如已知网络抖动 ConnectException) |
修改入口:控制台「配置管理 → 异常告警配置」的阈值增删改(op 见 3.2 节表)。
7.8 serverFilter(服务端消息过滤)
*************************** 1. row ***************************
name: serverFilter
content: <?xml version="1.0" encoding="utf-8"?>
<server-filter-config>
<transaction-type>Service</transaction-type>
<transaction-type>PigeonService</transaction-type>
<transaction-type>URL</transaction-type>
<transaction-name>piegonService:heartTaskService:heartBeat</transaction-name>
<transaction-name>pigeon:HeartBeatService:null</transaction-name>
<transaction-name></transaction-name>
<transaction-name>/</transaction-name>
<transaction-name>/index.jsp</transaction-name>
<transaction-name>/Heartbeat.html</transaction-name>
<transaction-name>/heartbeat.jsp</transaction-name>
<transaction-name>/inspect/healthcheck</transaction-name>
<transaction-name>/MonitorServlet</transaction-name>
<transaction-name>/monitorServlet?client=f5</transaction-name>
<domain>PhoenixAgent</domain>
<domain></domain>
<domain>cat-agent</domain>
<domain>All</domain>
<domain>FrontEnd</domain>
<domain>paas</domain>
<domain>SMS-RECEIVER</domain>
<atomic-tree-config start-types="Cache.;Squirrel." match-types="SQL"/>
</server-filter-config>
| 元素 | 含义 |
|---|---|
transaction-type | 报表聚合时保留的 Transaction type 白名单核心类目 |
transaction-name | 丢弃不统计的 Transaction 名(健康检查 /heartbeat.jsp、/inspect/healthcheck 等噪音) |
domain | 丢弃不统计的整个应用域(探针/代理类噪音域) |
atomic-tree-config | 原子消息树聚合:以 Cache./Squirrel. 开头的消息与 SQL 匹配合并 |
⚠️ 实用技巧:业务上线后若发现健康检查请求把 URL 报表刷屏,把对应 URI 追加为
<transaction-name>即可,改完即时生效。
7.9 其余配置行速览
- user-config(用户角色)与 resource-config(页面权限):
*************************** 1. row ***************************
name: user-config
content: <user-config>
<user id="test1@dianping.com" role="2"/>
<user id="test2@dianping.com" role="2"/>
</user-config>
*************************** 2. row ***************************
name: resource-config
content: <resource-config>
<resource path="/r" op="view" role="2"/>
<resource path="/r" op="test" role="1"/>
<resource path="/s/config" op="view" role="2"/>
</resource-config>
(role="1" 为管理员、role="2" 为普通用户;resource-config 把页面路径 /r、/s/config 的查看权限授给 role=2,把压测等操作留给 role=1。)
- domainGroup(域分组,示例内置值):
*************************** 1. row ***************************
name: domainGroup
content: <?xml version="1.0" encoding="utf-8"?>
<domain-group>
<domain id="domain1">
<group id="main">
<ip>10.10.10.1</ip>
<ip>10.10.10.2</ip>
</group>
<group id="event">
<ip>10.10.10.3</ip>
<ip>10.10.10.4</ip>
</group>
</domain>
</domain-group>
- topoGraphFormat(拓扑图排版):
*************************** 1. row ***************************
name: topoGraphFormat
content: <?xml version="1.0" encoding="utf-8"?>
<topoGraph-format-config>
<productLine id="titile1" colInside='5' />
<productLine id="title2" colInside='3' />
</topoGraph-format-config>
- storageGroup(存储分组,示例内置值,用于「存储监控」报表的展示分组):
*************************** 1. row ***************************
name: storageGroup
content: <?xml version="1.0" encoding="utf-8"?>
<storage-group-config>
<storage-group id="SQL">
<link url="test">
<par>a=b</par>
<par>c=d</par>
</link>
<storage id="cat" department="arch" productline="cat" title="cat" />
<storage id="shop-web" department="arch" productline="cat" title="cat" />
</storage-group>
<storage-group id="Cache">
<storage id="cat" department="arch" productline="cat" title="cat" />
<storage id="memcached" department="arch" productline="cat" title="cat" />
</storage-group>
</storage-group-config>
- all-report-config(全量报表聚合项):内置对 Transaction 的 URL、Event 的 URL/SQL 做全量(
<name id="*"/>)聚合,内容见 3.2 节 bytes 表,此处不重复展开。 - atomic-message-config:与 serverFilter 的
atomic-tree-config同义(按域配置 start-types/match-types),内置 default 与 cat 两域。 - tp-value-statistic-config:对哪些 type 做 TP 分位统计,内置
SQL/URL/Rpc/OuterRpc/Dao/pack/voucher七类。 - report-reload-config:报表对象过期重载的时段配置(内置 2016070503/04 两个示例时段,一般不动)。
- heartbeatRuleConfig / transactionRule / eventRule:心跳/Transaction/Event 告警规则(monitor-rules 结构,规则 id 形如
cat;URL;All;count,条件含minute(连续 N 分钟)、alertType、sub-condition type=MaxVal/SumMaxVal text=阈值),在控制台「告警规则」页增删改。 - heartbeat-display-policy(6478 字节):心跳页面各指标项的展示策略(show/avg/max/min 列开关),行数多、纯展示层配置,控制台「心跳展示策略」维护。
- topologyConfig(2416 字节):拓扑图的产品线与连线样式配置,控制台维护。
- capacityUpdateStatus(
Hourly:0;Daily:0;Weekly:0;Monthly:0;):四类报表容量统计的进度游标,系统自动读写,勿手工修改。
八、app.xml 说明(3.x 已移除)
不少 CAT 1.x/2.x 时代的资料提到客户端配置 /data/appdatas/cat/app.xml(绑定应用域与开关)。3.1.0 已不再使用该文件,两项实测证据:
① 实验机上不存在且服务正常运行:
ls /data/appdatas/cat/app.xml
实测输出:
ls: cannot access '/data/appdatas/cat/app.xml': No such file or directory
② 全源码零引用(在 3.1.0 完整源码树中检索):
grep -rn 'app\.xml' /opt/cat-src --include='*.java'
实测输出:
(无任何命中)
3.x 中原先由 app.xml 承担的「应用域识别」改由框架自动完成:客户端默认取部署单元的 /META-INF/app.properties 中的 app.name(源码 Cat.java 注释原文「domain is from property app.name of resource /META-INF/app.properties」,服务端 WAR 内该文件实测内容为 app.name=cat),也可用启动参数 -Dproject.name=<域名> 显式指定业务域。老版本升级到 3.x 时 app.xml 可直接删除。
九、JVM 参数(setenv.sh / CATALINA_OPTS)
CAT 服务端是常驻 Java 进程,JVM 参数集中在 Tomcat 的 /opt/tomcat/bin/setenv.sh(启动脚本自动 source),实测文件内容:
cat /opt/tomcat/bin/setenv.sh
实测输出:
export CAT_HOME=/data/appdatas/cat/
CATALINA_OPTS="$CATALINA_OPTS -server -DCAT_HOME=$CAT_HOME -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xms256m -Xmx512m -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -DCAT_ADMIN_PWD=q1w2e3r4"
| 参数 | 本文取值 | 说明与调整位置 |
|---|---|---|
-DCAT_HOME | /data/appdatas/cat/ | 配置与数据根目录;换目录时连 client.xml 查找路径一起变 |
-Xms/-Xmx | 256m/512m | 堆大小。验证环境限 256–512MB;生产按官方建议放大到 10G 级并追加 CMS/G1 参数(官方模板见安装指南 4.8 节) |
-DCAT_ADMIN_PWD | q1w2e3r4 | 控制台 admin 账号密码,改密码只改这里 |
-Dfile.encoding | UTF-8 | 报表中文防乱码 |
| SelectorProvider | epoll | Linux 高并发官方模板原文 |
修改后重启 Tomcat 生效,用 jps -v 验证实际生效值(命令输入与回显实测如下):
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
jps -v | grep Bootstrap | tr ' ' '\n' | grep -E '^-Xms|^-Xmx|CAT_HOME|CAT_ADMIN|file.encoding'
实测输出:
-DCAT_HOME=/data/appdatas/cat/
-Dfile.encoding=UTF-8
-Xms256m
-Xmx512m
-DCAT_ADMIN_PWD=q1w2e3r4
⚠️ 注意:
jps位于 JDK 的 bin 目录,JAVA_HOME未全局导出时用绝对路径/usr/lib/jvm/java-8-openjdk-amd64/bin/jps -v。
十、生产配置模板
以下两套模板基于本文全部实测项整理,可直接按注释替换实值。
10.1 单机模板(适用 4-8 台接入应用、日均消息 1 亿级以内、8GB+ 内存虚机)
<!-- /data/appdatas/cat/server.xml(首次启动前放置;入库后以 config 表为准) -->
<?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"/>
</properties>
<storage local-base-dir="/data/appdatas/cat/bucket/" local-report-storage-time="7" local-logivew-storage-time="7">
</storage>
<consumer>
<long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
</long-config>
</consumer>
</server>
</server-config>
<!-- /data/appdatas/cat/datasources.xml(替换 DB_IP/账号密码) -->
<?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://DB_IP:3306/cat]]></url>
<user>cat_user</user>
<password>cat_pass</password>
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>
配套动作:MySQL 启动加 max_allowed_packet=1G;JVM 堆按机器内存放大(setenv.sh);告警网关与接收人按 7.5/7.6 配置。
10.2 集群模板(3 节点:2 台消费机 + 1 台任务机兼任告警,适用日均消息 10 亿级)
角色拆分(每台的 config 表 server-config 行按控制台分别提交):
| 节点 | local-mode | job-machine | send-machine | alarm-machine | remote-servers |
|---|---|---|---|---|---|
| node1(任务+告警) | false | true | true | true | node1:8080,node2:8080,node3:8080 |
| node2(消费) | false | false | false | false | 同上 |
| node3(消费) | false | false | false | false | 同上 |
routerConfig(全集群一份,控制台 routerConfigUpdate 提交,核心差异处节选):
<router-config backup-server="node1" backup-server-port="2280">
<default-server id="node1" weight="1.0" port="2280" enable="true"/>
<default-server id="node2" weight="1.0" port="2280" enable="true"/>
<default-server id="node3" 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="node1"/>
<group-server id="node2"/>
<group-server id="node3"/>
</server-group>
</router-config>
各业务机 client.xml 的 <servers> 写同一批节点(每台一行)。改完用 4.3 节端点逐台验证路由下发。
十一、常见问题(FAQ)
Q1:改了 server.xml 的角色,为什么不生效?
3.x 运行期权威值在 config 表 server-config 行,server.xml 只在首次初始化时兜底。用控制台「服务端配置」提交新 XML 后重启该节点,再按 6.4 节 grep 日志验证(alert,true/job,true)。
Q2:控制台/接口提交配置时报错或没变化?
按序检查:① 是否已登录(接口要带登录 Cookie,见 3.3 节登录命令);② XML 是否合法(服务端会解析失败拒绝入库);③ 提交成功后回读 config 表确认 modify_date 与内容(注意服务端会重排格式,比对以回读为准);④ 查 config_modification 确认提交动作已留痕。
Q3:/cat/s/router 返回 500?
缺 domain 参数。客户端访问自动带参无此问题;手工 curl 探测时必须带 domain(可选 ip/hostname),见 4.3 节排障实录。仍 500 则查服务端日志 NullPointerException 堆栈确认 routerConfig 行是否被改坏(恢复办法:控制台重新提交一份合法 routerConfig)。
Q4:客户端连不上服务端,如何分辨是 client.xml 还是 routerConfig 的问题?
先看客户端本地能否拉到路由:在客户端机器 curl 'http://<server>:8080/cat/s/router?domain=<app>&ip=<client-ip>',返回 ip:2280; 说明服务端路由正常,问题在客户端网络/端口 2280 连通性;返回 500 或空则查服务端 routerConfig(Q3)。
Q5:连接池参数改大后 MySQL 报连接数过多?
先看当前连接分布(5.3 节命令);CAT 每节点池上限 = maximum-pool-size,N 节点集群总连接 ≈ N×池大小 + 管理连接。调大池子的同时确认 MySQL max_connections 余量,或改小 idle-timeout 加速回收。
Q6:消息量太大报表打爆怎么办?
三层限流按序落:客户端按域降采样(7.4 节 sampleConfig);服务端提 type 数量上限(6.3 节 max-type-threshold,默认 100);噪音域名/URI 直接过滤(7.8 节 serverFilter)。
Q7:告警收不到邮件/微信?
senderConfig 的 url 仍是内置占位 http://test/(7.5 节)。把三个通道换成企业真实网关地址并按网关 API 调整 par 模板,再到 alertConfig 填真实接收人;alertPolicy 的 send 字段决定每个级别走哪些通道。
十二、参考链接
- 本专栏姊妹篇:《CAT 监控 3.1.0 介绍与选型指南》、《CAT 监控 3.1.0 安装指南》、《CAT 监控 3.1.0 常用 CLI 命令与工具详解》
- 官方服务端部署文档(Wiki readme_server):https://github.com/dianping/cat/wiki/readme_server
- 官方 docker 配置模板(datasources.xml/client.xml):https://github.com/dianping/Cat/tree/master/docker
- 服务端配置管理源码(Action 枚举与处理器):https://github.com/dianping/Cat/tree/master/cat-home/src/main/java/com/dianping/cat/system/page/config
- 部署 FAQ(官方 Wiki):https://github.com/dianping/cat/wiki/cat_faq