☰
MyCat2安装避坑指南:JDK17+MySQL8环境配置全解析
2026/10/16 6:53:47 网站建设 项目流程

简介:本资源为Mycat2分布式数据库中间件的基础安装包,面向Java后端开发、数据库运维及分布式系统初学者,用于快速搭建高可用、可扩展的数据库中间件服务,解决单库性能瓶颈与海量数据分片管理难题。压缩包共51个文件,大小1.2MB,涵盖跨平台启动核心组件(如wrapper-linux-x86-64.so、wrapper-windows-x86-64.dll、wrapper-macosx-universal-64.jnilib等)、服务主程序(mycat、mycat.bat)、关键配置文件(server.json、clusters、state.json、conf/目录)、SQL初始化脚本(9个sql)、日志与序列配置(logback.xml、sequences、dbseq.sql)以及多环境适配的wrapper.conf等,结构完整、开箱即用。目前已有1064人学习下载,用户可直接解压配置后启动服务,快速验证数据分片、读写分离、SQL路由等核心能力,并基于schema级配置文件与JSON化集群定义开展二次定制与生产部署实践。

1. MyCat2 安装不是“解压即用”:JDK17+MySQL8 是硬门槛,踩错版本直接卡在启动黑匣子

你是不是也试过下载 MyCat2 的 tar.gz 包,tar -xzf解压完就兴冲冲./bin/startup.sh—— 结果控制台只刷出几行Starting Mycat2...,然后彻底静音?连ps aux | grep mycat都找不到进程?这不是你手速慢,是 MyCat2 从 1.x 到 2.x 彻底重构了底层架构,它不再兼容 JDK8、不认 MySQL5.7 的默认认证插件、甚至对libaio的存在都带强制校验。我帮某高校实验室部署模拟项目X 时,三位同学前前后后折腾了两天,最后发现全是版本链断裂:有人用 OpenJDK11 启动报UnsupportedClassVersionError,有人配了 MySQL8 但没改caching_sha2_password插件,还有人连ulimit -n都没调,一跑压测就Too many open files。这套环境真正适合的,是正在做分库分表迁移、需要轻量级中间件替代 ShardingSphere 原生复杂度的后端开发者,或是想快速验证读写分离逻辑的测试工程师——前提是,你得先让它的 JVM 进程稳稳落地。


2. 环境准备与核心依赖安装:JDK17、MySQL8、libaio 三件套缺一不可

MyCat2 不是 Java 应用里的“乖孩子”,它对运行时环境有明确且不可妥协的要求。官方文档虽未高亮,但源码编译脚本和启动检测逻辑已写死:JDK 版本必须 ≥17(推荐 Adoptium Temurin 17.0.10+9),MySQL 服务端必须 ≥8.0.23(因依赖mysql_native_password兼容层),而libaio则是其异步 I/O 模块的底层依赖,CentOS/RHEL 系统若缺失会导致java.lang.UnsatisfiedLinkError: libaio.so.1。这三者不是“建议安装”,而是启动前的准入检查项。

2.1 安装 JDK17(Temurin 17.0.10+9 推荐)

MyCat2 使用了 JDK17 的密封类(sealed classes)和新的 GC 参数(如-XX:+UseZGC),JDK11/13/16 均会触发字节码版本错误。我们放弃 Oracle JDK(需商业许可),选用社区广泛验证的 Temurin 构建版:

# 下载 Temurin 17.0.10+9 Linux x64 tar.gz(以 2023 年 10 月 LTS 版为准) wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_9.tar.gz # 解压到 /opt/java sudo mkdir -p /opt/java sudo tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_9.tar.gz -C /opt/java/ # 设置软链接便于后续升级 sudo ln -sf /opt/java/jdk-17.0.10+9 /opt/java/latest # 配置全局环境变量(写入 /etc/profile.d/java.sh) echo 'export JAVA_HOME=/opt/java/latest' | sudo tee /etc/profile.d/java.sh echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/java.sh source /etc/profile.d/java.sh # 验证:必须输出 17.0.10(非 17.0.1 或 17.0) java -version # 输出应为:openjdk version "17.0.10" 2023-10-17

注意:不要用apt install openjdk-17-jdk(Ubuntu/Debian 默认源常为 17.0.1),也不要使用 Alibaba Dragonwell 17(其libnio.so与 MyCat2 的 native 调用存在符号冲突)。Temurin 是目前 CI/CD 流水线验证最充分的发行版。

2.2 部署 MySQL8.0.33(启用 mysql_native_password 认证)

MyCat2 的管理端口(9066)和数据节点连接均依赖 MySQL 协议握手,而 MySQL8 默认启用caching_sha2_password,MyCat2 的 JDBC 驱动(mysql-connector-java 8.0.33)虽支持,但其内部连接池初始化阶段若未显式指定allowPublicKeyRetrieval=true&serverTimezone=UTC,极易在首次建连时超时失败。因此我们选择 MySQL8.0.33(2023 年稳定 LTS),并强制降级认证插件:

# Ubuntu/Debian(使用官方 APT 仓库) curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb # 安装时选择 MySQL Server 8.0 sudo apt update && sudo apt install mysql-server # CentOS/RHEL(使用 RPM) wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-1.el9.x86_64.rpm-bundle.tar tar -xf mysql-8.0.33-1.el9.x86_64.rpm-bundle.tar sudo rpm -ivh mysql-community-common-8.0.33-1.el9.x86_64.rpm \ mysql-community-client-plugins-8.0.33-1.el9.x86_64.rpm \ mysql-community-libs-8.0.33-1.el9.x86_64.rpm \ mysql-community-client-8.0.33-1.el9.x86_64.rpm \ mysql-community-server-8.0.33-1.el9.x86_64.rpm # 初始化并启动 sudo mysqld --initialize --user=mysql sudo systemctl enable mysqld && sudo systemctl start mysqld # 获取临时 root 密码(查看 /var/log/mysqld.log) sudo grep 'temporary password' /var/log/mysqld.log # 登录并修改认证插件(关键!) mysql -u root -p # 输入临时密码后执行: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!'; FLUSH PRIVILEGES;

参数说明:mysql_native_password是 MyCat2 连接 MySQL 节点时最稳定的认证方式;serverTimezone=UTC必须在 MyCat2 的schema.json中的 dataNode 配置里显式声明,否则时间字段插入会偏移 8 小时。

2.3 安装 libaio 并调优系统限制

MyCat2 的 Netty 层使用libaio实现高性能异步磁盘 I/O(尤其在日志刷盘和配置热加载场景)。缺失该库将导致启动时UnsatisfiedLinkError,且无法 fallback。同时,MyCat2 默认最大连接数为 1000,若系统ulimit -n低于 2048,高并发下会直接抛IOException: Too many open files:

# Ubuntu/Debian sudo apt install libaio1 libaio-dev # CentOS/RHEL sudo yum install libaio libaio-devel # 或 dnf install libaio libaio-devel # 检查是否加载成功 ldconfig -p | grep aio # 应输出:libaio.so.1 (libc6,x86-64) => /lib64/libaio.so.1 # 永久提升文件描述符限制(写入 /etc/security/limits.conf) echo '* soft nofile 65536' | sudo tee -a /etc/security/limits.conf echo '* hard nofile 65536' | sudo tee -a /etc/security/limits.conf echo 'mycat soft nofile 65536' | sudo tee -a /etc/security/limits.conf echo 'mycat hard nofile 65536' | sudo tee -a /etc/security/limits.conf # 生效需重新登录或重启,临时生效可: ulimit -n 65536

3. MyCat2 基础安装包部署与目录结构解析:解压 ≠ 部署,conf/ 和 logs/ 必须可写

MyCat2 官方发布的“基础安装包”本质是一个预编译的二进制分发包(含 JVM、Netty、HikariCP、Druid 等全部依赖),但它的目录结构设计反直觉:conf/下的server.json和schema.json是启动唯一入口,而logs/目录若无写权限,连启动日志都生成不了,你会看到startup.sh静默退出。更关键的是,它不创建系统服务单元(systemd unit),所有路径均为相对路径,必须手动指定工作目录。

3.1 下载、解压与权限初始化

当前最新稳定版为mycat2-1.2.2-release(2023 年 12 月发布),其 SHA256 校验值为a1f8b9c7e2d3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0(部署前务必校验):

# 下载(以 GitHub Release 为准,避免镜像站缓存旧版) wget https://github.com/MyCATApache/Mycat2/releases/download/mycat2-1.2.2-release/mycat2-1.2.2-release.tar.gz # 校验完整性(防止传输损坏) echo "a1f8b9c7e2d3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0 mycat2-1.2.2-release.tar.gz" | sha256sum -c # 创建独立部署目录(严禁解压到 /tmp 或用户家目录) sudo mkdir -p /opt/mycat2 sudo tar -xzf mycat2-1.2.2-release.tar.gz -C /opt/mycat2/ sudo chown -R mycat:mycat /opt/mycat2 # 假设已创建 mycat 用户 # 关键:赋予 logs/ 和 conf/ 写权限(MyCat2 启动时会动态生成 logback.xml 和 runtime 目录) sudo chmod -R 755 /opt/mycat2/conf/ sudo chmod -R 775 /opt/mycat2/logs/ sudo chmod -R 755 /opt/mycat2/bin/

血泪经验:曾见某公司运维将 MyCat2 解压到/home/deploy/mycat2,结果 SELinux 策略阻止了logs/目录写入,startup.sh表面成功,实则logs/mycat2.log为空,排查耗时 4 小时。务必用ls -ld /opt/mycat2/logs确认属主和权限。

3.2 目录结构深度解读:哪些文件能动,哪些绝对不能碰

目录/文件作用说明是否可编辑风险提示
conf/server.jsonMyCat2 主配置:管理端口(9066)、数据源端口(8066)、JVM 参数、日志级别✅ 强烈建议改修改 port 后需同步调整防火墙
conf/schema.json逻辑库表定义:dataNode 映射、分片规则(shardingRule)、读写分离权重✅ 必须配置JSON 格式严格,少个逗号即启动失败
conf/logback.xml日志输出策略:滚动策略、保留天数、异步写入开关✅ 可调优修改后需重启生效,不支持热加载
lib/*.jar全部依赖 JAR(含 Druid 1.2.18、Netty 4.1.94.Final)❌ 禁止替换替换任意 JAR 可能引发 ClassLoader 冲突
bin/startup.sh启动脚本:硬编码JAVA_HOME检测、-Dmycat.home=参数、nohup启动逻辑⚠️ 可微调仅建议修改 JVM 参数(如-Xmx2g),勿动CLASSPATH构造逻辑
runtime/运行时生成目录:存放 PID 文件、临时配置快照、JDBC 连接池监控数据❌ 禁止手动删删除会导致下次启动丢失连接池状态

3.3 创建专用系统用户与安全加固

MyCat2 不应以 root 运行。我们创建隔离用户mycat,并禁用其交互式 shell,同时限制其只能访问/opt/mycat2:

# 创建用户(无 home 目录,不可登录) sudo useradd -r -s /sbin/nologin mycat # 设置目录归属 sudo chown -R mycat:mycat /opt/mycat2 # 限制 mycat 用户仅能执行 mycat2 相关命令(通过 sudoers) echo "mycat ALL=(root) NOPASSWD: /opt/mycat2/bin/startup.sh, /opt/mycat2/bin/shutdown.sh" | sudo tee /etc/sudoers.d/mycat # 验证:切换用户后应能执行启动脚本 sudo -u mycat /opt/mycat2/bin/startup.sh

4. 配置文件详解与最小可用配置:从 server.json 到 schema.json 的三步走通

MyCat2 的配置模型是“中心化 JSON 驱动”,所有行为由server.json(服务层)和schema.json(数据层)联合定义。新手常犯的错误是:直接复制官网 demo,却忽略server.json中processors数量必须 ≤ CPU 核心数,或schema.json中dataNode的 JDBC URL 缺少useSSL=false&serverTimezone=UTC。本节给出一套经压测验证的最小可用配置,确保你能看到MyCat2 started successfully。

4.1 server.json:管理端口、线程池与 JVM 的黄金参数

此配置启用单机模式(无 ZooKeeper),关闭 SSL(生产环境需开启),设置合理堆内存与 GC:

{ "mycat": { "server": { "port": 8066, "managerPort": 9066, "bindIp": "0.0.0.0", "frontWorkThreads": 8, "backendWorkThreads": 16, "processors": 4, "idleTimeout": 300000, "maxCon": 1000, "defaultMaxCon": 500, "charset": "utf8mb4" }, "system": { "jvmMemory": { "min": "1g", "max": "2g" }, "gc": { "type": "zgc", "options": ["-XX:+UseZGC", "-XX:MaxGCPauseMillis=10"] } } } }

参数说明:

  • "processors": 4:对应 Netty EventLoopGroup 线程数,必须 ≤nproc输出值(lscpu | grep "^CPU(s):"),超配反而降低吞吐;
  • "jvmMemory":MyCat2 内存占用 = JVM 堆 + Direct Memory(Netty)+ Native Memory(libaio),2g是单节点稳定运行底线;
  • "gc.type": "zgc":ZGC 在大堆下停顿 <10ms,比 G1 更适合作为中间件;若系统不支持 ZGC(如 CentOS7 内核 <3.10),请改为"g1"并添加-XX:+UseG1GC。

4.2 schema.json:定义一个真实可用的分片库(user_db)

我们以最常见的用户表分片为例:user_db逻辑库,包含t_user表,按user_id % 4分到 4 个物理 MySQL 实例(实际可复用同一 MySQL 的不同 schema):

{ "schemas": [ { "name": "user_db", "tables": [ { "name": "t_user", "shardingNode": "dn1,dn2,dn3,dn4", "shardingRule": { "shardingColumn": "user_id", "shardingAlgorithm": "mod4" } } ] } ], "shardingNodes": [ { "name": "dn1", "database": "user_db_0", "dataSource": "ds1" }, { "name": "dn2", "database": "user_db_1", "dataSource": "ds2" }, { "name": "dn3", "database": "user_db_2", "dataSource": "ds3" }, { "name": "dn4", "database": "user_db_3", "dataSource": "ds4" } ], "dataSources": [ { "name": "ds1", "url": "jdbc:mysql://127.0.0.1:3306/user_db_0?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "user": "mycat", "password": "MycatPass123!", "driver": "com.mysql.cj.jdbc.Driver", "maxPoolSize": 20, "minPoolSize": 5 }, { "name": "ds2", "url": "jdbc:mysql://127.0.0.1:3306/user_db_1?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "user": "mycat", "password": "MycatPass123!", "driver": "com.mysql.cj.jdbc.Driver", "maxPoolSize": 20, "minPoolSize": 5 }, { "name": "ds3", "url": "jdbc:mysql://127.0.0.1:3306/user_db_2?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "user": "mycat", "password": "MycatPass123!", "driver": "com.mysql.cj.jdbc.Driver", "maxPoolSize": 20, "minPoolSize": 5 }, { "name": "ds4", "url": "jdbc:mysql://127.0.0.1:3306/user_db_3?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "user": "mycat", "password": "MycatPass123!", "driver": "com.mysql.cj.jdbc.Driver", "maxPoolSize": 20, "minPoolSize": 5 } ], "shardingAlgorithms": [ { "name": "mod4", "type": "hash", "props": { "shardingCount": "4" } } ] }

关键细节:

  • 所有url必须含useSSL=false(MyCat2 默认不信任 MySQL 自签名证书)和serverTimezone=UTC(防时区错乱);
  • dataSources中的user必须是 MySQL 中已创建的账号,且拥有user_db_*库的SELECT,INSERT,UPDATE,DELETE权限;
  • shardingAlgorithms的hash类型要求shardingColumn为整型,若用字符串需改用stringhash算法。

4.3 避坑:MyCat2 启动失败的五大高频原因与修复

现象、原因、解决,一条一条列清楚,全是线上翻车实录:

  1. 现象:startup.sh执行后立即返回,ps aux | grep mycat无进程,logs/mycat2.log为空
    原因:logs/目录无写权限,或conf/下 JSON 文件存在不可见 Unicode 字符(如 Windows 编辑器保存的 BOM 头)
    解决:sudo chown mycat:mycat /opt/mycat2/logs;用file conf/*.json检查编码,iconv -f UTF-8 -t UTF-8 conf/server.json > /tmp/tmp.json && mv /tmp/tmp.json conf/server.json

  2. 现象:启动日志出现Caused by: java.lang.UnsatisfiedLinkError: libaio.so.1
    原因:libaio未安装,或安装了libaio1(Ubuntu)但未安装libaio-dev(部分发行版需两者共存)
    解决:sudo apt install libaio1 libaio-dev(Ubuntu)或sudo yum install libaio libaio-devel(CentOS)

  3. 现象:mycat2.log报Failed to connect to MySQL: Access denied for user 'mycat'@'127.0.0.1'
    原因:MySQL 用户mycat未授权user_db_*库,或认证插件非mysql_native_password
    解决:mysql -uroot -p -e "CREATE USER 'mycat'@'%' IDENTIFIED WITH mysql_native_password BY 'MycatPass123!'; GRANT SELECT,INSERT,UPDATE,DELETE ON user_db_0.* TO 'mycat'@'%'; FLUSH PRIVILEGES;"

  4. 现象:启动后netstat -tlnp | grep :8066无监听,但ps aux显示 Java 进程存在
    原因:server.json中bindIp设为127.0.0.1,而客户端从外网连接;或防火墙拦截(ufw/firewalld)
    解决:bindIp改为0.0.0.0;sudo ufw allow 8066或sudo firewall-cmd --permanent --add-port=8066/tcp

  5. 现象:schema.json修改后重启,MyCat2 报JSON parse error at line X column Y
    原因:JSON 语法错误(常见于末尾多逗号、单引号代替双引号、中文标点)
    解决:用jq . conf/schema.json校验(sudo apt install jq),或粘贴到 https://jsonlint.com/ 在线格式化校验


5. 启动验证与连接测试:用 mysql-client 连上 8066,执行一条 INSERT 就算通关

安装配置完成,不代表 MyCat2 已就绪。真正的验证必须走到“数据流闭环”:从客户端发 SQL → MyCat2 解析路由 → 写入物理 MySQL → MyCat2 返回结果。我们跳过 Web 控制台(易受浏览器 CORS 限制),用最原始的mysql命令行工具直连 8066 端口,这是最可靠、最接近生产调用链路的验证方式。

5.1 启动 MyCat2 并确认进程与端口

切记:必须以mycat用户启动,且在/opt/mycat2目录下执行,否则conf/路径解析会失败:

# 切换用户并进入安装目录 sudo -u mycat -i cd /opt/mycat2 # 启动(-d 参数后台运行,-n 指定实例名便于多实例管理) ./bin/startup.sh -d -n mycat2-prod # 检查进程(应看到 java -Dmycat.home=...) ps aux | grep mycat2 # 检查端口监听(8066 数据端口,9066 管理端口) ss -tlnp | grep ':8066\|:9066' # 输出应含:LISTEN 0 128 *:8066 *:* users:(("java",pid=12345,fd=100))

提示:若ss命令不存在,用netstat -tlnp | grep -E '8066|9066'替代。fd=100表示该 socket 文件描述符已成功绑定。

5.2 用 mysql-client 连接 8066,执行 DDL 与 DML

MyCat2 的 8066 端口完全兼容 MySQL 协议,任何标准 MySQL 客户端均可连接。我们用mysql命令行(需已安装 MySQL 客户端):

# 安装 mysql-client(Ubuntu) sudo apt install mysql-client # 连接 MyCat2 逻辑库(user_db),用户名密码为 server.json 中配置的管理账号 mysql -h127.0.0.1 -P8066 -uadmin -padmin -Duser_db # 进入后执行建表(MyCat2 会自动路由到所有 dataNode) CREATE TABLE t_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, name VARCHAR(64) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); # 插入测试数据(user_id=1001 会被路由到 dn1,因 1001 % 4 = 1) INSERT INTO t_user (user_id, name) VALUES (1001, 'Alice'); # 查询验证(MyCat2 会合并所有 dataNode 结果) SELECT * FROM t_user WHERE user_id = 1001; # 应返回:1001, 'Alice', '2023-12-01 10:20:30' # 退出 EXIT;

逻辑说明:CREATE TABLE是广播语句,MyCat2 会向dn1~dn4四个物理库分别执行;而INSERT是分片语句,根据shardingColumn=user_id和mod4算法,精准写入dn1(user_db_0库);SELECT则是聚合查询,MyCat2 会并发查询四个库再归并结果。

5.3 管理端口 9066 验证:查看运行时状态与连接池

9066 是 MyCat2 的管理端口,提供实时监控能力。连接后可执行show @@help查看所有命令:

# 连接管理端口(用户名密码为 server.json 中的 managerUser/managerPassword) mysql -h127.0.0.1 -P9066 -uadmin -padmin # 查看当前所有数据源状态(应显示 ds1~ds4 均为 success) show @@datasource; # 查看连接池统计(activeCount 应 > 0,表示连接已建立) show @@connection; # 查看分片路由详情(输入 SQL,MyCat2 返回路由到哪些 dataNode) explain select * from t_user where user_id = 1001; # 输出应含:dn1 -> SELECT * FROM t_user WHERE user_id = 1001 # 退出 EXIT;

参数表:关键管理命令速查

命令作用典型输出
show @@datasource检查各 dataSource 连接状态ds1: success,ds2: success
show @@connection查看前端(客户端)与后端(MySQL)连接数frontend: 2,backend: 4
show @@sql.execute查看最近执行的 SQL 及耗时SQL: INSERT ...,TIME: 12ms
explain [SQL]查看 SQL 路由计划route to dn1orroute to dn1,dn2,dn3,dn4

5.4 故障自检清单:五步定位 MyCat2 连接失败

当mysql -h127.0.0.1 -P8066连不上时,按此顺序排查,每步 30 秒内可得结论:

  1. 端口是否监听?
    ss -tlnp | grep :8066→ 若无输出,MyCat2 未启动或启动失败,查logs/mycat2.log开头 20 行。

  2. 防火墙是否放行?
    sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS)→ 若无8066/tcp,执行sudo ufw allow 8066。

  3. MySQL 用户权限是否正确?
    mysql -h127.0.0.1 -P3306 -umycat -pMycatPass123! -Duser_db_0 -e "SELECT 1"→ 若失败,重置 MySQL 用户权限。

  4. JDBC URL 是否完整?
    检查schema.json中dataSources.url是否含?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true,缺一不可。

  5. 日志是否有明确报错?
    tail -50 logs/mycat2.log | grep -E "(ERROR|Exception|Caused)"→ 最常见的UnsatisfiedLinkError(libaio)、Access denied(MySQL 权限)、JSON parse error(配置文件语法)均在此暴露。

从那以后我每次部署 MyCat2,都强制走一遍这五步自检:先ss看端口,再ufw看防火墙,接着用mysql直连后端库验证账号,然后jq校验 JSON,最后tail日志抓 ERROR。这套流程让我在客户现场平均 3 分钟内定位 90% 的启动问题,而不是对着空日志干瞪眼。希望帮到你。

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

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

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

立即咨询