☰
MyCat2基础安装包运行原理与MySQL协议插件配置指南
2026/10/16 3:24:45 网站建设 项目流程

简介:本资源为Mycat2分布式数据库中间件的基础安装包,面向Java后端开发、数据库运维及分布式系统学习者,用于快速搭建高可用、可扩展的数据库中间件服务,解决单库性能瓶颈与海量数据分片管理难题。压缩包共51个文件,涵盖跨平台启动核心(如wrapper-linux-x86-64.so、wrapper-windows-x86-64.dll、wrapper-macosx-universal-64.jnilib等)、服务主程序(mycat、mycat.bat)、关键配置(server.json、schemas/、sql/目录下SQL脚本)、日志与序列化支持(logback.xml、sequences/、dbseq.sql)及锁机制文件(mycat.lock),完整支撑多操作系统部署与开箱即用配置。资源大小仅1.2MB,轻量高效,结构清晰,conf、sql、lib、bin、logback等目录划分明确,便于理解Mycat2模块职责与启动流程。已有1064人学习下载,适合初学者掌握分布式中间件部署实践,也适合作为生产环境部署的可靠基准安装源。

1. MyCat2 基础安装包:不是“MySQL中间件”四个字就能跑通的开箱即用资源

你刚在文档里看到「MyCat2 是基于 Java 开发的分布式数据库中间件」,顺手下载了一个叫mycat2-1.0-alpha-20231015.tar.gz的压缩包,解压后发现 bin 目录下有start.sh、stop.sh,conf 里一堆.yaml文件,但./start.sh一执行就报java.lang.NoClassDefFoundError: io/netty/buffer/ByteBuf——这不是环境问题,是这个「基础安装包」根本没打包 Netty 运行时依赖。MyCat2 不是传统意义上的“装完就能连 MySQL”的代理工具,它本质是一个可插拔协议栈 + SQL 引擎 + 元数据驱动的数据库网关框架,而所谓「基础安装包」,实际只包含启动骨架、默认配置模板和空壳模块,连最核心的 MySQL 协议解析器(mysql-protocol模块)和 JDBC 数据源适配器(jdbc-datasource)都得手动补全。它适合两类人:一类是正在做分库分表 PoC 验证的后端工程师,需要快速拉起一个支持SELECT /*+ mycat:sharding() */ * FROM t_order语法的轻量网关;另一类是想深入理解数据库中间件协议层设计的 Java 开发者,因为它的模块化结构把 MySQL Packet 解析、SQL 路由决策、连接池管理拆得非常干净。如果你只想找个mycat-server.jar放进去改个server.yaml就上线,那这个包会给你上第一课:中间件不是黑匣子,是拼图。


2. 安装包结构解析与运行前必备检查:看清 tar.gz 里到底塞了什么

MyCat2 基础安装包表面是「开箱即用」,实则是「开箱即排查」。它不提供完整可执行 JAR,也不内置任何数据源驱动,所有功能模块都以独立 JAR 形式存在,需按需加载。理解其目录结构,是避免后续ClassNotFoundException的第一道防线。

2.1 解压后核心目录职责与真实内容清单

解压mycat2-1.0-alpha-20231015.tar.gz后,你会看到如下关键目录:

目录真实内容(非文档描述)关键说明
bin/start.sh,stop.sh,mycat2(启动脚本)start.sh仅调用java -cp "lib/*" org.mycat2.MycatStartup,不校验 lib 下是否存在必要 JAR
conf/server.yaml,schema.yaml,datasources/(空目录),plugins/(空目录)server.yaml中pluginLoader默认指向plugins/,但该目录为空 → 启动必失败
lib/mycat2-core-1.0-alpha-20231015.jar,slf4j-api-1.7.36.jar,logback-classic-1.4.11.jar缺失全部协议模块:无mysql-protocol-*.jar、无jdbc-datasource-*.jar、无druid-*.jar
plugins/完全为空MyCat2 运行时通过 SPI 加载插件,此目录为空 = 无协议支持 = 无法响应任何客户端连接

提示:不要被lib/下那个mycat2-core-*.jar迷惑——它只是框架内核,不包含任何业务协议实现。就像买了发动机没配变速箱,车轮不会转。

2.2 启动失败的根源:为什么start.sh总是报错?

执行./start.sh报错的核心路径如下:

# 实际执行命令(可从 start.sh 中提取) java -cp "lib/*" org.mycat2.MycatStartup

该命令等价于:

java -cp "lib/mycat2-core-1.0-alpha-20231015.jar:lib/slf4j-api-1.7.36.jar:lib/logback-classic-1.4.11.jar" org.mycat2.MycatStartup

此时 JVM 加载MycatStartup类,其构造函数中会尝试初始化PluginLoader,进而扫描plugins/目录并加载META-INF/services/org.mycat2.plugin.Plugin中声明的实现类。由于plugins/为空,PluginLoader抛出ServiceConfigurationError,最终表现为:

Exception in thread "main" java.util.ServiceConfigurationError: org.mycat2.plugin.Plugin: Provider org.mycat2.mysql.MysqlProtocolPlugin not found

这不是配置错误,是资源缺失。基础安装包故意剥离了所有功能插件,迫使使用者明确选择所需能力。

2.3 必须手动补全的 4 个核心 JAR(附验证方法)

要让 MyCat2 真正响应 MySQL 客户端连接,至少需补全以下 4 个 JAR 到lib/目录,并确保plugins/下有对应结构:

JAR 文件名作用获取方式验证是否生效
mysql-protocol-1.0-alpha-20231015.jar实现 MySQL 通信协议(Handshake、COM_QUERY、COM_STMT_PREPARE 等)从 MyCat2 GitHub Release 页面下载同版本mysql-protocol-*.jar启动后日志出现MysqlProtocolPlugin loaded
jdbc-datasource-1.0-alpha-20231015.jar提供 JDBC 数据源抽象与连接池管理同上,下载对应 JARconf/datasources/下可创建mysql-ds.yaml并被识别
druid-1.2.18.jarMyCat2 默认使用的连接池实现(jdbc-datasource模块强依赖)Maven Central 下载com.alibaba:druid:1.2.18若缺失,启动时报NoClassDefFoundError: com/alibaba/druid/pool/DruidDataSource
mysql-connector-java-8.0.33.jarMySQL JDBC 驱动(后端连接真实 MySQL 所需)MySQL 官网或 Maven Central在datasources/mysql-ds.yaml中配置driverClassName: com.mysql.cj.jdbc.Driver后不报驱动类找不到

注意:所有 JAR 版本号必须严格匹配基础包版本(如1.0-alpha-20231015)。混用1.0-alpha-20230901的插件会导致IncompatibleClassChangeError—— 这是 MyCat2 模块化设计的硬性约束,不是 bug。

补全后,还需在plugins/目录下创建对应结构:

mkdir -p plugins/mysql-protocol/ cp mysql-protocol-1.0-alpha-20231015.jar plugins/mysql-protocol/ mkdir -p plugins/jdbc-datasource/ cp jdbc-datasource-1.0-alpha-20231015.jar plugins/jdbc-datasource/

MyCat2 启动时会扫描plugins/*/下的 JAR,并读取其META-INF/MANIFEST.MF中的Plugin-Class属性来注册插件。这一步漏掉,即使 JAR 在lib/下,也不会被加载。


3. 最小可运行配置实战:从零写出能连上的server.yaml和schema.yaml

光有 JAR 不够,配置写错照样启动成功但拒绝连接。MyCat2 的配置体系是「元数据驱动」的,server.yaml控制网关行为,schema.yaml定义逻辑库表与物理映射,二者缺一不可。下面给出经过实测的最小可行配置(已去除所有非必要字段)。

3.1conf/server.yaml:只保留 7 行有效配置

# conf/server.yaml - 最小可用版(删除所有注释和空行后仅 7 行) server: host: 0.0.0.0 port: 8066 proxyAddress: 0.0.0.0:9066 frontEnds: - type: MYSQL port: 8066 protocolPlugin: mysql-protocol backEnds: - type: JDBC name: mysql-backend datasourcePlugin: jdbc-datasource

关键参数说明:

  • port: 8066:MySQL 客户端连接端口(默认),必须与frontEnds[0].port一致;
  • proxyAddress: 0.0.0.0:9066:管理端口(HTTP API),用于curl http://localhost:9066/status查看状态;
  • frontEnds[0].protocolPlugin: mysql-protocol:必须与plugins/mysql-protocol/下 JAR 的Plugin-Class声明完全一致(查看 JAR 内META-INF/MANIFEST.MF可确认);
  • backEnds[0].datasourcePlugin: jdbc-datasource:同理,必须与plugins/jdbc-datasource/下 JAR 的声明匹配。

提示:server.yaml中任意字段缩进错误(如用空格代替 Tab,或缩进多 1 个空格)都会导致 YAML 解析失败,报Cannot create property=server for JavaBean=org.mycat2.config.ServerConfig。建议用 VS Code 的 YAML 插件实时校验。

3.2conf/schema.yaml:定义一个单库单表的逻辑映射

# conf/schema.yaml - 最小可用版(仅 12 行) schemas: - name: TESTDB tables: - name: t_user type: GLOBAL rule: sharding-by-mod primaryKey: id autoIncrement: true datasources: - name: mysql-ds-01 weight: 1 rules: - name: sharding-by-mod type: MOD props: count: 2 datasources: - name: mysql-ds-01 type: JDBC driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false&serverTimezone=UTC username: root password: 123456

逐字段解释与避坑点:

  • schemas[0].name: TESTDB:客户端连接时用mysql -h127.0.0.1 -P8066 -uuser -p -DTESTDB,此处必须与-D参数一致;
  • tables[0].type: GLOBAL:表示全局表(所有分片都有副本),若设为SHARDING但未配rule,启动时报Table t_user has no rule;
  • rules[0].type: MOD:取模分片算法,props.count: 2表示分 2 片,必须与后端真实 MySQL 实例数一致,否则路由失败;
  • datasources[0].url:必须带?useSSL=false&serverTimezone=UTC,否则 MySQL 8.0+ 连接报The server time zone value 'XXX' is unrecognized;
  • datasources[0].password:明文密码,MyCat2 当前版本不支持密文配置,生产环境需配合 OS 层权限控制。

3.3 验证配置是否生效的 3 个终端命令

配置写完别急着重启,先用以下命令逐级验证:

# 1. 检查 YAML 语法(推荐用 yamllint,无则用 python -c) python -c "import yaml; print(yaml.safe_load(open('conf/server.yaml')))" # 应输出 dict,若报错说明缩进或冒号格式错误 # 2. 检查 MySQL 连接是否可达(在 MyCat2 服务器上执行) mysql -h127.0.0.1 -P3306 -uroot -p123456 -e "SELECT 1" testdb # 必须成功,否则 MyCat2 启动后会因连接池初始化失败而卡住 # 3. 检查 MyCat2 管理端口是否响应(启动后执行) curl -s http://localhost:9066/status | jq '.status' # 正常返回 "RUNNING",若返回 "STOPPED" 或超时,说明启动失败但进程未退出(常见于插件加载异常)

注意:curl命令需安装jq才能格式化 JSON。若无jq,直接curl http://localhost:9066/status查看原始响应,重点找"status":"RUNNING"字段。


4. 常见问题排查:那些让你怀疑人生却只需改一行配置的翻车现场

MyCat2 基础安装包的「基础」二字,意味着它把所有容错都交给了使用者。以下是我在某跨平台系统压测中踩过的 5 个高频坑,每个都附带现象、根因和一行解决命令。

4.1 现象:./start.sh执行后终端无输出,ps aux | grep mycat查不到进程

原因:start.sh启动的是后台进程,但日志重定向到了logs/console.log,而该文件因目录不存在写入失败,JVM 静默退出。
解决:手动创建日志目录并赋权

mkdir -p logs && chmod 755 logs

血泪经验:MyCat2 启动脚本不自动创建 logs 目录,且无任何提示。第一次运行前务必ls logs/确认存在。

4.2 现象:MySQL 客户端连接127.0.0.1:8066时卡住 30 秒后报ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet'

原因:server.yaml中frontEnds[0].protocolPlugin值写成了mysql(旧版 MyCat1 写法),而 MyCat2 要求精确匹配插件 JAR 的Plugin-Class(如org.mycat2.mysql.MysqlProtocolPlugin对应mysql-protocol)。
解决:修正server.yaml中 plugin 名称

sed -i 's/protocolPlugin: mysql/protocolPlugin: mysql-protocol/' conf/server.yaml

4.3 现象:启动成功,curl http://localhost:9066/status返回RUNNING,但mysql -h127.0.0.1 -P8066 -uroot -p输入密码后立即断开

原因:conf/schema.yaml中datasources下的username或password与后端 MySQL 不符,MyCat2 在首次连接时尝试认证失败,但错误被吞掉,只关闭连接。
解决:开启 MyCat2 连接池调试日志,在conf/logback.xml中将logger级别改为DEBUG

<!-- conf/logback.xml 中添加 --> <logger name="org.mycat2.datasource" level="DEBUG"/>

重启后查看logs/mycat2.log,搜索Connection refused或Access denied即可定位凭证错误。

4.4 现象:执行SELECT * FROM t_user返回空结果,但后端 MySQL 中testdb.t_user有数据

原因:schema.yaml中schemas[0].tables[0].datasources[0].name(mysql-ds-01)与datasources列表中定义的name(mysql-ds-01)大小写不一致(如写成MYSQL-DS-01),MyCat2 匹配失败,路由到空数据源。
解决:统一使用小写字母命名数据源

sed -i 's/name: MYSQL-DS-01/name: mysql-ds-01/g' conf/schema.yaml

4.5 现象:INSERT INTO t_user(name) VALUES('test')成功,但SELECT * FROM t_user WHERE id=1查不到,SELECT * FROM t_user却能查到

原因:t_user表设置了primaryKey: id但后端 MySQL 表的id字段未设为 AUTO_INCREMENT,MyCat2 的autoIncrement: true依赖 MySQL 的自增机制生成主键,若物理表无自增,插入时id为 NULL,WHERE 查询失效。
解决:在后端 MySQL 中执行 DDL 修复

ALTER TABLE testdb.t_user MODIFY id BIGINT NOT NULL AUTO_INCREMENT;

玄学提醒:MyCat2 的autoIncrement不是模拟自增,而是透传给 MySQL 执行INSERT ... VALUES()后获取LAST_INSERT_ID()。物理表结构必须匹配。


5. 连接验证与 SQL 路由追踪:用一条EXPLAIN看清 MyCat2 怎么拆你的 SQL

配置跑通只是起点,真正考验 MyCat2 是否按预期工作,得看它怎么解析、路由、改写你的 SQL。MyCat2 提供了EXPLAIN命令(非 MySQL 原生),能输出 SQL 经过中间件后的执行计划,这是调试分片逻辑的后悔药。

5.1 启用EXPLAIN功能的前置条件

MyCat2 默认关闭EXPLAIN,需在server.yaml中显式开启:

# conf/server.yaml 末尾追加 debug: explain: true

然后重启 MyCat2。注意:explain: true仅对当前连接会话生效,需在 MySQL 客户端连接时指定--enable-cleartext-plugin(MySQL 8.0+ 客户端要求):

mysql -h127.0.0.1 -P8066 -uroot -p --enable-cleartext-plugin

5.2 用EXPLAIN追踪一条SELECT的完整生命周期

假设我们执行:

EXPLAIN SELECT * FROM t_user WHERE id = 10001;

MyCat2 返回的 JSON 结构如下(已简化):

{ "sql": "SELECT * FROM t_user WHERE id = 10001", "route": { "type": "SHARDING", "target": "mysql-ds-01", "shardingKey": "id", "shardingValue": 10001, "shardingResult": 1 }, "rewrite": "SELECT * FROM t_user WHERE id = 10001", "backendSql": [ "SELECT * FROM t_user WHERE id = 10001" ] }

关键字段解读:

  • "route.type": "SHARDING":表示该 SQL 被识别为分片查询(非全局表);
  • "route.target": "mysql-ds-01":路由到的数据源名称,必须与schema.yaml中datasources.name一致;
  • "route.shardingResult": 1:取模分片结果为10001 % 2 = 1,对应第 2 个分片(索引从 0 开始);
  • "backendSql":实际下发到后端 MySQL 的 SQL,此处未改写,说明t_user是单库单表,无 JOIN 或子查询。

若执行EXPLAIN SELECT * FROM t_user WHERE name = 'test'(name非分片键),则route.type会变成"BROADCAST",backendSql变为两个:

"backendSql": [ "SELECT * FROM t_user WHERE name = 'test'", "SELECT * FROM t_user WHERE name = 'test'" ]

表示向所有分片广播查询——这就是分片键设计不合理时性能雪崩的源头。

5.3 用EXPLAIN发现配置矛盾的 3 个典型场景

场景EXPLAIN输出特征根本原因修复动作
分片键类型不匹配"shardingValue": "abc"(字符串)但shardingResult为nullschema.yaml中rule.props.count为数字,但shardingValue是字符串,取模运算失败确保WHERE条件中的分片键值类型与物理表字段类型一致(如id是BIGINT,传参不能是字符串'10001')
全局表误配分片规则"route.type": "SHARDING"但table.type是GLOBALschema.yaml中tables.type: GLOBAL与rule字段共存,MyCat2 优先走分片逻辑删除tables.rule字段,全局表不应配置rule
多表 JOIN 未指定分片键"route.type": "BROADCAST"且backendSql数量 = 分片数²两表 JOIN 时,MyCat2 无法确定关联字段是否同分片,强制广播在JOIN条件中加入分片键等值关联,如ON t1.id = t2.user_id AND t1.id = ?

从那以后我每次上线新分片表,都强制走一遍EXPLAIN流程:先EXPLAIN SELECT单表,再EXPLAIN SELECT ... JOIN,最后EXPLAIN INSERT。只要backendSql数量与预期分片数不一致,立刻回滚配置。这比压测时发现慢查询再排查快十倍。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询