简介:这份压缩包面向需要部署Mycat2分布式数据库中间件的开发与运维人员,Mycat2通过数据分片、读写分离和SQL路由解决大数据量、高并发场景下的数据库扩展难题,作为第二代版本在性能、稳定性与多数据库支持上均有提升。资源共51个文件、压缩包约1.2MB,体积小巧便于快速分发,其中SQL脚本用于初始化分片库表,JSON/XML配置(如server.json、schema.xml等)定义全局参数与分片规则,并配套Windows、Linux、macOS、Solaris、AIX等多平台Wrapper运行库及启动脚本,方便在不同服务器环境直接部署。目前已有1056人学习下载。解压后conf配置、bin启动脚本、lib依赖库和wrapper.jar等核心模块一目了然,用户可依据内置分片规则示例快速搭建Mycat2实例,理解各配置项作用,标准目录结构对从零入门分布式中间件的初学者尤其友好,也能帮助运维人员快速搭建和调优生产环境。
1. 从“mycat2基础安装包”到可用节点:先搞清楚这包到底跑在哪
很多人搜“mycat2基础安装包”,是以为拿到包解压、启动就完事了。真正动手你会发现,这个包要跑成可用的数据库代理,前置条件比想象多:JDK 版本要对、元数据库要单独准备、端口不能被占,这些串起来才是一个可用节点。Mycat2 是 MySQL 生态里常用的数据库中间件,核心价值是把分库分表、读写分离、多租户隔离从业务代码里拆出来,让应用层继续走 MySQL 协议。它适合已经在用 MySQL、想在多个实例前加一层统一入口的团队,也适合刚接触中间件想搭一套最小环境的人。这篇把基础安装包从解压到验证的过程讲清楚,包括参数、命令和踩坑,照着做能少走弯路。
2. 部署前置项:JDK 8、独立元数据库和 8066/9066 端口规划
安装包解压只是开始,Mycat2 是跑在 JVM 上的代理进程,自己只做协议解析和路由,业务数据不存,但路由信息、数据源、逻辑库这类元数据必须有一个可靠的地方存放。这三项前置不看仔细,后面每一步都在猜,所以第一个一级节点没跑起来之前,别急着碰分片规则。
2.1 为什么 Mycat2 对 JDK 版本敏感:运行时底层是 NIO 与反射
Mycat2 的通讯层基于 Java NIO 实现,早期版本大量使用反射和内部 API,这些行为在 JDK 9 引入模块化之后被收紧。所以用 JDK 11 或 17 跑基础安装包,经常会在启动阶段报出ClassNotFoundException或InaccessibleObjectException,这不是包坏了,而是运行时和编译目标版本不匹配。官方默认推荐 JDK 8,这也是我每次装新环境第一个确认的点。检查命令很简单:
java -version echo "$JAVA_HOME"如果输出里不是 1.8 开头,或者JAVA_HOME为空,就先装 JDK 8。常见做法是用发行版包管理器直接安装 openjdk-8-jdk,再把它设为默认。例如在 CentOS 系环境里:
sudo yum install -y java-1.8.0-openjdk-devel sudo update-alternatives --config java export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk这里的JAVA_HOME要写进/etc/profile或~/.bashrc,因为 Mycat2 的启动脚本bin/mycat会优先读这个变量来拼 JVM 参数。网上很多教程会把 JDK 安装包和 Mycat2 安装包打包在一起给人下载,我一般不建议用这种整合包,版本配死之后排查问题更麻烦。机器上同时有多个 JDK 时,人们习惯把java命令软链指向新版本,但 Mycat2 的脚本认的是JAVA_HOME,这一步漏掉会出现“命令行 java 版本正常,启动脚本还是找不到 JDK”的诡异现象,先记一句:环境变量比 PATH 里的 java 重要。
2.2 元数据库怎么选:单独建一个 mycat 库,而不是复用业务库
Mycat2 的配置体系和 Mycat1 不一样,Mycat1 的 schema.xml、rule.xml 文件在 Mycat2 里被收进了元数据库。这个元数据库用 MySQL 存放,里面保存数据源、逻辑库、全局序列、用户权限等运行时信息。所以基础安装包落地前,你得先准备好一个 MySQL 实例,并且建一个独立的、不跟业务混在一起的库,名字通常就叫 mycat。
为什么不能复用业务库?原因是这个库会被 Mycat2 高频读写,属于控制面数据;如果和业务表混在一起,备份、恢复、权限隔离都会互相干扰,而且一旦业务库出问题,中间件也跟着失控。建库命令很简单:
mysql -h127.0.0.1 -uroot -p -e \ "CREATE DATABASE IF NOT EXISTS mycat DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"字符集选 utf8mb4 是因为元数据里可能存中文库名、注释和自定义分片算法参数,utf8mb4 兼容性最好。这里要注意,这个 MySQL 实例必须是 Mycat2 进程能直接连到的地址,不能把它放在 Mycat2 自身代理后面,否则启动时形成循环依赖,日志里会一直报连接超时。我见过有人把元数据库也放进分片计划里,结果是 Mycat 一启动就要连自己,永远连不上。
2.3 端口规划与安装包落位:8066 数据口、9066 管理口,别放 /tmp
Mycat2 对外默认监听 8066 作为数据端口,应用连接它就像连接 MySQL;9066 是管理端口,用于查看状态和在线命令。安装包解压前先检查这两个端口有没有被占,避免启动时绑定失败:
ss -lntp | grep -E '8066|9066' netstat -lntp 2>/dev/null | grep -E '8066|9066'如果发现被占用,要么停掉占用的服务,要么在之后的mycat.yml里改端口。很多人习惯把安装包解压到/tmp,这在大内存机器上问题不大,但生产环境我一般放到数据盘,比如/data/mycat,因为日志文件会持续增长,/tmp在部分系统重启后会被清空,服务就“神秘消失”了。命令如下:
mkdir -p /data/mycat tar -xzf mycat2-xxx-linux.tar.gz -C /data/mycat解压完成后,留意安装包解出来的目录名是否带版本号。带版本号的话,我习惯再做一个current软链接,后续脚本和配置都指向固定路径,升级时只换软链,不用改一堆绝对路径:
ln -s /data/mycat/mycat2-xxx /data/mycat/current到这里,前置条件基本齐了:JDK 8 就位、元数据库已建好、端口无冲突、安装包落在固定目录。下面进入真正的安装流程。
3. 安装包落地四步:从解压结构到跑出第一个 Mycat2 节点
前置准备好后,Mycat2 的安装包本身装起来很快,但每一步都要确认清楚,尤其是初始化和启动方式这两个地方,很多人栽在这里。我从头过一遍。
3.1 解压前先看包结构:bin、conf、lib、logs 各自管什么
解压前我会先用 tar 的列表参数看一眼安装包里有什么,避免解压出来一堆奇怪文件还不知道往哪找:
tar -tzf mycat2-xxx-linux.tar.gz | head -30-t是列出内容而不是真正解压,-z表示用 gzip 解压,-f指定文件。这一步能提前确认包是 Linux 版还是 Windows zip,也能看出有没有奇怪的顶层目录。一个标准的基础安装包,解压后通常会有四个目录:bin放启动、停止、安装成系统服务的脚本;conf放 yml、json 等配置文件模板;lib是运行时要加载的 jar 包;logs是运行时日志输出目录。搞清楚这个结构的好处是出问题时知道去哪找东西,比如端口起不来先看 logs,配置没生效先看 conf,不要一上来就去翻 lib。
解压命令和前面接上:
mkdir -p /data/mycat tar -xzf mycat2-xxx-linux.tar.gz -C /data/mycat ls -lh /data/mycat/mycat2-xxx参数说明:-xzf分别是解压、用 gzip 解压、指明文件,-C指定解压目标目录。有人图省事用unzip去解 tar.gz,结果得到一堆乱文件,因为 tar.gz 并不是 zip 格式。解压后不要急着启动,先找到 conf 目录下的主配置模板,确认里面默认的元数据库连接地址和账号,这部分下一章细讲。
3.2 初始化元数据库:找到初始化脚本并导入,避免空库启动翻车
Mycat2 的元数据库里需要一批基础表,用来记录数据源、逻辑库、分片规则等。多数发行包会在 conf 或 doc 目录里附带初始化脚本,名字可能是init.sql、schema.sql这类。我先用 find 定位一下:
find /data/mycat -maxdepth 3 \( -iname '*.sql' -o -iname '*template*' \) | head -20这里的\( -iname ... -o -iname ... \)是 find 的组合条件写法,-maxdepth 3限制目录深度,避免把整个磁盘翻一遍。找到后导入之前建好的 mycat 库:
mysql -h127.0.0.1 -uroot -p mycat < /data/mycat/mycat2-xxx/conf/init.sql导入前建议先看一眼这个 SQL 里有没有DROP TABLE,有些发行包的初始化脚本为了可重入,会先删表再建表,如果你已经有手工初始化的数据,会被清掉。如果发行包里没有现成脚本,就先保持空库,第一次启动时观察日志,部分版本会自动建表;自动建表失败的话,再去官方文档对应版本章节拿初始化 SQL。这里有个动作我每次都做:导入完成后,把该库里的所有表导出备份一份,后续反复实验改坏配置能快速回退,算是给自己的后悔药。
3.3 首次启动用 console 模式,确认日志无异常后再转后台
Mycat2 的bin/mycat脚本支持多个子命令。第一次启动我强烈建议用console而不是start,因为 console 会把日志直接打到终端上,有什么异常一眼能看到,start是后台守护方式,适合确认没问题之后再用:
cd /data/mycat/current bin/mycat console看到类似端口绑定成功、元数据库连接成功的提示后,按 Ctrl+C 停掉,再用后台方式启动:
bin/mycat start bin/mycat statusstart子命令会把进程拉到后台并记录 PID,status会返回进程状态。如果状态显示 running,但过一会儿进程消失,多半是启动后初始化失败被守护进程退出,这时候去看 logs 下的主日志文件:
tail -100 /data/mycat/current/logs/mycat.log日志里最有价值的信息,一个是“元数据库连接失败”,另一个是“端口已被占用”,前者回 2.2 检查连接串,后者回 2.3 改端口。这里要提醒一点:console和start不要同时用,否则两个进程抢同一个端口,报错信息反而不容易看懂。到这里,一个最小 Mycat2 节点已经跑起来了,但能不能真正承接业务流量,还要做配置验证,也就是下一章。
4. 配置验证不能省:改 mycat.yml、建测试账号、确认 SQL 真的被转发
很多环境装完能启动,但连上 8066 报错或者查不到库,问题都出在配置和元数据不一致。这个环节的目的是确认应用层看到的逻辑库和后端真实的 MySQL 数据源被中间件正确串联。
4.1 mycat.yml 里至少要确认四个点:数据端口、管理端口、元数据库、日志级别
Mycat2 的主配置文件是 conf 目录下的 mycat.yml。不同版本字段名会有差异,但常见的四项逃不开:服务端口、管理端口、元数据库连接、日志级别。一个示意配置如下:
server: port: 8066 managerPort: 9066 metadata: type: mysql url: jdbc:mysql://127.0.0.1:3306/mycat user: mycat_user password: "mycat@123" log: level: info这里要说明,上面只是一个结构示意,不是让你原样覆盖模板,正确做法是把模板里对应字段逐个改掉。url里的 IP 和端口要指向真正建了 mycat 库的 MySQL,user和password是那个库的账号,不是之后业务系统连 Mycat2 的账号,这两个是两码事。YAML 里密码如果包含@或#,最好用双引号包起来,否则解析时会被当成注释或特殊字符。
改完配置必须重启进程,Mycat2 的端口和元数据连接不会像部分分片规则那样热加载:
bin/mycat restart重启后先抓一条启动日志确认加载的是你刚改的文件,免得改错路径还蒙在鼓里:
tail -50 logs/mycat.log | grep -i 'config\|metadata'如果 grep 结果里出现两个不同路径的配置,说明运行目录和安装目录不一致,最常见是之前用旧目录启动,current软链换了但进程没重启。
4.2 创建一个用于验证的代理账号,再像连 MySQL 一样连 8066
Mycat2 对应用来说是透明的 MySQL 服务端,所以验证方式可以直接用 mysql 客户端。先别急着拿业务账号试,我习惯在配置或元数据里加一个最小权限的测试账号,只给它对应逻辑库的访问权限。加完账号后执行:
mysql -h127.0.0.1 -P8066 -umycat_user -p这里-P8066是代理端口,-u和-p是你在 Mycat2 里维护的账号密码,跟 4.1 里元数据账号不是同一个。登录成功后再执行几条 SQL:
SHOW DATABASES; USE your_logic_db; SELECT 1;SHOW DATABASES能看到 Mycat2 对外暴露的逻辑库;USE和SELECT 1是最基础的连通性验证,能成功说明协议解析、鉴权、元数据读取都正常。到这里,基础安装包才算是真正可用。很多人连着 8066 端口却用后端 MySQL 的业务账号登录,结果一直报权限错误,实际上代理账号要单独维护,这点一定要分清。
4.3 验证失败的定位顺序:网络层、代理层、元数据层
连不上或者查询报错时,我按照“客户端到代理、代理到元数据、代理到后端”三层来缩小范围。
telnet 127.0.0.1 8066 ss -lntp | grep 8066 tail -100 logs/mycat.log第一层是网络,telnet 不通就回去查端口和防火墙。第二层是代理,能通但登录失败查账号配置。第三层是元数据,登录成功但查不到库,查元数据库里的逻辑库表、后端数据源配置。大多数安装翻车卡在第一层和第三层,前者是防火墙没放行,后者是元数据库初始化不完整或数据源地址写错。按这个顺序排查,通常十分钟内能定位。
5. Mycat2 安装部署常见避坑:5 条踩坑记录与排查命令
下面 5 条是我在不同机器上装基础安装包时真遇到过的,现象和原因都比较典型,照顺序排查能省掉半天黑盒猜谜。每条我都按现象、原因、解决的顺序写。
5.1 启动立刻退出,日志报不支持的主版本号或类找不到
现象:执行bin/mycat start后进程秒退,日志里有unsupported class file major version或NoClassDefFoundError。
原因:JVM 版本和 jar 包的编译版本对不上,最常见是系统默认 JDK 是 11/17,而 Mycat2 基础包按 JDK 8 编译。
解决:安装 JDK 8,并确保JAVA_HOME指向它,不只是改java软链:
java -version echo "$JAVA_HOME"如果java -version已经是 1.8,但JAVA_HOME为空或指向别处,bin/mycat脚本依然可能找不到正确 JDK。这类问题我用得很笨但有效:把JAVA_HOME显式 export 到启动脚本所在 shell,再确认/usr/lib/jvm下确实有对应目录。
5.2 状态显示 running,客户端却 Connection refused
现象:bin/mycat status正常,但 telnet 127.0.0.1 8066 显示拒绝连接。
原因:进程虽然活着,但端口没绑在预期地址上,或者监听的是内网地址,或者防火墙和 SELinux 挡了。
解决:先看监听地址:
ss -lntp | grep 8066监听地址如果是 127.0.0.1,远端机器当然连不上,到 mycat.yml 里把绑定的 host 改为 0.0.0.0 再重启。如果是 0.0.0.0 还连不上,查云主机安全组、firewalld 和 SELinux。这一步最容易让人误判成安装包有问题,其实和 Mycat2 本身没关系。
5.3 后端是 MySQL 8,启动日志报认证插件错误
现象:日志出现Unable to load authentication plugin 'caching_sha2_password',或 Mycat 能启动但元数据连不上。
原因:MySQL 8 默认认证插件是 caching_sha2_password,Mycat2 驱动版本不一定支持。
解决:为元数据库单独建一个使用 mysql_native_password 的账号,并只给它管理 mycat 库的最小权限:
CREATE USER 'mycat_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; GRANT ALL PRIVILEGES ON mycat.* TO 'mycat_user'@'%'; FLUSH PRIVILEGES;我用这个方式解决过两次,一次是 MySQL 8.0.24,一次是 8.0.32。原则就一条:元数据库账号的认证插件按中间件驱动能力来定,别让业务账号来顶,业务表的数据账号完全可以继续用默认插件,两者不冲突。
5.4 用mycat install把服务装到系统时提示权限不足
现象:普通用户执行bin/mycat install报 Permission denied,但bin/mycat start能跑。
原因:install 子命令需要把启动脚本注册进系统服务目录,比如写 /etc/init.d,普通用户没有写系统目录的权限。
解决:用 root 执行 install。已经用 start 启动的话,先 stop 再装服务,之后用 service 或 systemd 管理:
sudo bin/mycat stop sudo bin/mycat install sudo service mycat start注意先停掉当前实例再装服务,否则可能出现两个进程抢端口,启动日志会报 bind 失败,但你又不知道旧进程潜伏在哪里。
5.5 改了 mycat.yml 但行为没变化,怀疑配置未生效
现象:改完端口或元数据库连接后 restart,ss 看到的还是旧端口。
原因:改错了文件,或者运行目录和安装目录不一致。有些人解压出两个同版本目录,脚本还在用旧目录。
解决:先确认当前进程的工作路径:
ls -l /proc/$(pgrep -f 'mycat')/cwd然后用bin/mycat restart重启,并在日志里看它实际加载的配置文件路径。另一个隐蔽原因是元数据库里缓存了部分配置,修改本地 yml 后没有把元数据同步过来,这种情况回到 4.2 确认逻辑库和后端数据源是否对得上。我的习惯是改完配置后先把配置备份一份,再重启,出问题能马上 diff 出改动点。
6. 把一次性安装固化成部署脚本:我的最小实现与三条验证命令
安装包装一次容易,换台机器重来就要重复踩坑。我现在把上面几步写成一个最小脚本,每装新环境先跑它。
6.1 最小部署脚本模板
#!/bin/bash # install_mycat.sh <mycat2-xxx-linux.tar.gz> set -e INSTALL_DIR="${INSTALL_DIR:-/data/mycat}" META_DB_HOST="${META_DB_HOST:-127.0.0.1}" META_DB_PASS="${META_DB_PASS:-root123}" TARBALL="$1" mkdir -p "$INSTALL_DIR" tar -xzf "$TARBALL" -C "$INSTALL_DIR" ln -sfn "$INSTALL_DIR"/mycat2-* "$INSTALL_DIR/current" mysql -h"$META_DB_HOST" -uroot -p"$META_DB_PASS" -e \ "CREATE DATABASE IF NOT EXISTS mycat DEFAULT CHARACTER SET utf8mb4;" "$INSTALL_DIR/current/bin/mycat start" sleep 2 "$INSTALL_DIR/current/bin/mycat status"脚本逻辑不复杂:第一条命令用环境变量控制落位和元数据库地址,方便不同机器覆盖;第二条解压安装包;第三条做 current 软链;第四条建空元数据库;最后启动并查状态。密码我放在环境变量里,不进脚本硬编码,这是长期维护的基本习惯。
6.2 装完我再固定跑这三条验证命令
ss -lntp | grep -E '8066|9066' mysql -h127.0.0.1 -P8066 -umycat_user -p -e "SELECT 1;" tail -20 "$INSTALL_DIR/current/logs/mycat.log"顺序是先看端口监听,再看能否登录执行 SQL,最后看日志有没有隐藏告警。如果三条都过,这个基础安装包就算真正落地了,可以继续往里配数据源和分片规则。我现在每装一个新环境都会先把这套脚本和验证跑一遍,少了很多靠猜的排查。希望帮到你。
本文还有配套的精品资源,点击获取