CAT 监控 3.1.0 配置参数详解

详解 CAT(Central Application Tracking)3.1.0 全部配置参数:client.xml/datasources.xml/server.xml 逐项实测、config 表 23 行配置中心逐行解析、控制台提交与审计留痕、采样率修改与还原实测、路由端点 NPE 排障实录。

CAT 监控CAT可观测性2026/10/23

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、客户端上报 TCP 2280

⚠️ 说明:本文 CAT 指 Central Application Tracking 应用监控系统,与 Linux Shell 命令 cat 无关。文中出现的 cat.xml、cat_20261023.log 等均为 CAT 自身的文件名。

二、前置条件

阅读与动手前确认:

  1. CAT 服务端已按安装指南部署完成并可登录控制台(安装流程见《CAT 监控 3.1.0 安装指南》,本文不重复安装步骤);
  2. 数据库中 cat 库已建表(26 张表),config 表可读写;
  3. 源码或源码包在手(核对模型与默认值时要用到 /opt/cat-src,离线环境可只保留需要查阅的几个文件);
  4. 控制台账号可登录:账号 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进程启动时一次性读取改文件 + 重启 Tomcatclient.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 / transactionRuleDeleteTransaction 告警规则
eventRuleUpdate / eventRuleSubmit / eventRuleDeleteEvent 告警规则
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 的完整元素树:

层级元素属性说明
根configmode(固定 client)、enabled、dump-lockedenabled=false 关闭客户端上报;dump-locked 锁定本地消息转储
子servers(父级包裹元素)服务端列表
孙serverip、port(TCP 上报端口)、http-port(拉配置用 HTTP 端口)、enabled一行一个服务端节点,可写多行
子domainid、ip、enabled、max-message-size按应用域覆盖默认行为(限流单条消息上限等)
子bindip、port客户端本地绑定地址/端口(特殊网络场景用)
子propertyname + 文本值扩展自定义属性

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 ip127.0.0.1服务端 IP;集群环境写多台节点的真实 IP,每台一行
server port2280TCP 消息上报端口,官方注明 2280 不允许修改
server http-port8080客户端拉路由/配置的 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: &#47;cat&#47;s&#47;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 idcatcat数据源标识,CAT 固定读 id=cat,勿改
maximum-pool-size33连接池上限。官方模板即 3;CAT 报表落库以批量写为主,3 个连接足够支撑单机,集群大流量可上调到 5-8,并同步观察 MySQL max_connections
connection-timeout1s1s从池里拿连接的最长等待时间;拿不到即快速失败,避免报表线程堆积
idle-timeout10m10m空闲连接回收时间
statement-cache-size10001000预编译语句缓存条数
drivercom.mysql.jdbc.Driver同左固定旧驱动类名——WAR 内置 mysql-connector-java-5.1.20.jar,必须用它
urljdbc:mysql://10.89.66.2:3306/catjdbc:mysql://MYSQL_URL:MYSQL_PORT/MYSQL_SCHEMA库地址;集群只需一个库(官方提醒勿每节点建库)
user/passwordroot/q1w2e3r4占位符数据库账号
connectionPropertiesuseUnicode=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-modefalsefalsetrue=本地模式:消息只写本地 bucket 不入库,用于开发调试;生产必须 false
job-machinetruefalse任务机:负责小时/天/周/月报表的汇总任务调度,集群中只放 1 台
send-machinetruefalse发送机:触发告警事件对外发送
alarm-machinetruefalse告警机:运行告警规则评估(异常/心跳/业务等 analyzer)
hdfs-enabledfalsefalse报表/消息转存 HDFS;不用 Hadoop 生态保持 false(小规模直接磁盘模式)

<storage> 属性:

属性本文取值含义
local-base-dir/data/appdatas/cat/bucket/消息与报表本地落盘根目录,目录必须存在且可写
local-report-storage-time7本地报表保留天数
local-logivew-storage-time7本地 LogView(调用链视图)保留天数
max-hdfs-storage-time(config 表版 15)HDFS 模式下的存储保留天数,仅 hdfs-enabled=true 有效
har-mode / upload-thread(config 表版 true / 5)归档模式与上传线程数,HDFS 场景使用

<consumer><long-config> 属性(慢请求判定阈值,单位毫秒):

属性默认值含义
default-url-threshold1000URL 请求超過 1000ms 记为 Long-URL
default-sql-threshold100SQL 超過 100ms 记为 Long-SQL
default-service-threshold50Service(对内服务)超過 50ms 记为 Long-Service

6.3 隐藏属性清单(源码默认值实测)

ServerConfigManager 支持的属性远不止官方文档列出的五个。实测在源码中 grep getProperty 全量提取(grep -nE "getProperty\(\"" .../ServerConfigManager.java),得到以下可配置项与默认值:

属性默认值含义
message-dumper-thread5消息落盘线程数
message-processor-thread20消息处理(消费)线程数
model-service-thread100模型服务(报表实时查询)线程数
block-dump-thread5块转储线程数
max-type-threshold100单项目 Transaction type 数量上限,超限丢弃防打爆
type-name-length-limit256type 名长度上限
tp-value-expire-minute1TP 分位值统计过期时间(分钟)
storage-compress-typesnappy本地存储压缩算法(snappy/deflate)
storage-deflate-level5deflate 压缩级别
storage-max-block-size131072存储块大小(字节,128KB)
storage-nio-enabletrue存储是否用 NIO
use-new-storagetrue是否用新存储引擎
<analyzer>-analyzer-threads2各分析器线程数(如 transaction-analyzer-threads)
<analyzer>-analyzer-enabletrue各分析器开关(如 cross-analyzer-enable=false 可关某个分析器)
remote-servers空串集群节点列表 ip:8080,ip:8080,告警远程同步用
remote-servers-fixedfalse是否固定 remote-servers 不动态调整
router-adjust-enabledfalse是否开启路由自动调节
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服务端角色/存储/慢查询阈值serverConfigUpdate7.2
serverFilter服务端消息过滤serverFilterConfigUpdate7.8
all-report-config全量报表聚合项allReportConfig7.9
atomic-message-config原子消息聚合规则控制台7.9
tp-value-statistic-configTP 分位值统计范围控制台7.9
report-reload-config报表重载周期reportReloadConfigUpdate7.9
domainGroup域分组(多机房归组)domainGroupConfigUpdate7.9
heartbeat-display-policy心跳图展示策略displayPolicy7.9
topologyConfig / topoGraphFormat拓扑图配置控制台7.9
routerConfig客户端路由routerConfigUpdate7.3
senderConfig告警发送通道alertSenderConfigUpdate7.5
storageGroup存储分组storageGroupConfigUpdate7.9
exceptionRuleConfig异常告警阈值/排除exceptionThresholdUpdate 等7.7
alertPolicy告警级别与通道策略控制台7.6
alertConfig告警接收人控制台7.6
sampleConfig采样率sampleConfigUpdate7.4
heartbeatRuleConfig心跳告警规则控制台7.9
transactionRule / eventRuleTransaction/Event 告警规则transactionRuleUpdate/eventRuleUpdate7.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 idwarning/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 同样是告警大类,email/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/-Xmx256m/512m堆大小。验证环境限 256–512MB;生产按官方建议放大到 10G 级并追加 CMS/G1 参数(官方模板见安装指南 4.8 节)
-DCAT_ADMIN_PWDq1w2e3r4控制台 admin 账号密码,改密码只改这里
-Dfile.encodingUTF-8报表中文防乱码
SelectorProviderepollLinux 高并发官方模板原文

修改后重启 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-modejob-machinesend-machinealarm-machineremote-servers
node1(任务+告警)falsetruetruetruenode1:8080,node2:8080,node3:8080
node2(消费)falsefalsefalsefalse同上
node3(消费)falsefalsefalsefalse同上

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 字段决定每个级别走哪些通道。

十二、参考链接

  1. 本专栏姊妹篇:《CAT 监控 3.1.0 介绍与选型指南》、《CAT 监控 3.1.0 安装指南》、《CAT 监控 3.1.0 常用 CLI 命令与工具详解》
  2. 官方服务端部署文档(Wiki readme_server):https://github.com/dianping/cat/wiki/readme_server
  3. 官方 docker 配置模板(datasources.xml/client.xml):https://github.com/dianping/Cat/tree/master/docker
  4. 服务端配置管理源码(Action 枚举与处理器):https://github.com/dianping/Cat/tree/master/cat-home/src/main/java/com/dianping/cat/system/page/config
  5. 部署 FAQ(官方 Wiki):https://github.com/dianping/cat/wiki/cat_faq