☰
mycat2基础安装包部署指南:环境配置、分片路由与避坑排查
2026/10/20 2:32:40 网站建设 项目流程

简介:这份资源是面向Java后端开发与数据库运维人员的Mycat2基础安装包,用于在本地或服务器上快速搭建分布式数据库中间件服务,解决大数据量、高并发场景下单机数据库难以承载的存储与访问瓶颈。压缩包共51个文件,约1.2MB,以跨平台wrapper动态库(so、dll、jnilib、a等)和启动脚本为主,覆盖Linux、Windows、macOS、AIX、Solaris等系统,另含sql初始化脚本、json与xml配置、jar依赖及properties日志配置,解压后即可按平台选用对应组件。目前已有1069人学习下载。通过该安装包可完整体验Mycat2的数据分片、读写分离、SQL路由与动态扩展能力,并借助schema、server等配置理解分片规则与全局参数设置,适合作为学习分布式数据库中间件部署与调优的实践起点。

1. 从一次 MySQL 连接数打满说起:mycat2 基础安装包到底装的是什么

上周帮一个朋友看他的模拟项目X,后端服务刚压测到 200 并发,MySQL 的连接数就顶到了 max_connections,应用日志里全是 “Too many connections”。他第一反应是加机器、调大连接池,但真正的问题在于所有查询都直连同一个库,读写没分离,分片也没做。这种场景下,mycat2 就是那个能把 SQL 拦在数据库前面、按规则路由到不同节点的中间件。mycat2 基础安装包不是一个可执行程序,而是一套运行环境加配置模板的集合,装完之后你得到的是一个能解析 SQL、能连后端 MySQL、能按分片规则转发的服务端。它适合正在做分库分表、读写分离,或者单纯想给数据库加一层连接复用和路由能力的开发者。装不好的典型后果是:服务能起来,但连不上后端库,或者 SQL 被错误路由到不存在的分片,排查起来像在黑匣子里摸路。下面按我实际装过几台机器的顺序,把环境、安装、配置和验证拆开写。

2. 装前把环境钉死:JDK、MySQL 和目录规划

2.1 版本选择:JDK 8 还是 JDK 11

mycat2 基础安装包对 JDK 的依赖比较明确,我一般会先确认机器上已有的 Java 版本。常见做法是优先用 JDK 8,因为 mycat2 的启动脚本和部分依赖在 JDK 8 上验证得最充分;如果机器上只有 JDK 11,也能跑,但需要留意启动参数里有没有被移除的 GC 选项。查看当前版本:

java -version # 输出示例:openjdk version "1.8.0_392"

如果输出是 1.8 开头,基本可以直接用;如果是 11 或 17,先别急着换,继续往下走,后面启动时如果报 Unrecognized VM option,再回来调整。我一般会固定用 JDK 8,因为 mycat2 基础安装包里自带的脚本默认引用的就是 JAVA_HOME 下的 java,版本混用容易出玄学问题。

2.2 MySQL 后端准备:一个能连的库和账号

mycat2 本身不存数据,它所有数据都来自后端 MySQL。装之前至少准备一个 MySQL 实例,并且创建一个专门给 mycat2 连的账号。不要直接用 root,权限太大,出问题不好定位。常见做法是建一个只允许从 mycat2 所在机器 IP 访问的账号:

-- 在后端 MySQL 上执行 CREATE USER 'mycat_user'@'192.168.1.%' IDENTIFIED BY 'Mycat@2024'; GRANT ALL PRIVILEGES ON *.* TO 'mycat_user'@'192.168.1.%'; FLUSH PRIVILEGES;

这里192.168.1.%换成你 mycat2 机器的实际网段,Mycat@2024换成自己的密码。授权范围先给 ALL,等分片规则调通后再按库收敛。另外确认 MySQL 的max_connections至少留出 50 个给 mycat2 的连接池,不然 mycat2 自己先连不上后端。

2.3 目录规划:别把安装包解压到 /root 下面

我见过有人把 mycat2 解压到/root/mycat,然后用普通用户启动,结果日志目录写不进去,服务起不来还找不到原因。我一般会固定两个目录:安装目录/opt/mycat2,日志和数据目录/data/mycat2。先建好:

mkdir -p /opt/mycat2 /data/mycat2/logs chown -R deploy:deploy /opt/mycat2 /data/mycat2

deploy换成你实际用来启动服务的用户。目录权限提前给对,后面启动脚本写日志才不会翻车。

3. 解压与首次启动:mycat2 基础安装包落地步骤

3.1 解压安装包并确认目录结构

拿到 mycat2 基础安装包后,先看压缩包里的顶层目录名,通常是mycat2或带版本号。解压到/opt下:

tar -zxvf mycat2-basic.tar.gz -C /opt/ # 如果解压出来是 mycat2-1.21 这种带版本号的目录,改个名方便后续脚本引用 mv /opt/mycat2-1.21 /opt/mycat2

解压后进目录看一眼关键文件:bin/下是启动停止脚本,conf/下是配置,lib/下是 jar 包。我一般会先ls -lh lib/确认 jar 包数量,如果只有几个,说明安装包不完整,得重新拿。

3.2 配置 JAVA_HOME 和启动参数

启动脚本依赖JAVA_HOME,如果机器上没配,脚本会直接报 “JAVA_HOME is not set”。在/etc/profile.d/下加一个文件:

echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk' >> /etc/profile.d/mycat.sh echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/mycat.sh source /etc/profile.d/mycat.sh

JAVA_HOME的路径用readlink -f $(which java)反推,去掉/bin/java就是。配完之后echo $JAVA_HOME能输出路径才算生效。启动参数在bin/下的脚本里,我一般会调两个地方:-Xmx根据机器内存给,测试环境 2G 够用;-Dmycat.home指向/opt/mycat2,避免脚本从相对路径找配置。

3.3 首次启动与日志观察

启动命令在bin/下,通常是mycat start或startup.sh。我一般用前台方式先跑一次,方便看报错:

cd /opt/mycat2/bin ./mycat console

console模式会把日志直接打到终端。如果看到 “Mycat Server startup successfully” 并且没有异常堆栈,说明进程起来了。这时候别急着 Ctrl+C,另开一个终端tail -f /data/mycat2/logs/mycat.log,观察有没有连后端 MySQL 的报错。常见的是 “Access denied for user”,那就是第 2 章里账号密码或授权网段写错了,回去改conf/下的数据源配置。

4. 配置数据源与分片规则:让 SQL 真正路由起来

4.1 数据源配置:写对 URL 和连接池参数

mycat2 的数据源配置在conf/下,通常是一个datasource相关的 json 或 properties 文件。我一般会先配一个最简单的单库数据源,确认能连通,再往上加分片。关键参数是url、user、password和连接池的maxPoolSize:

{ "name": "mysql_backend_1", "type": "mysql", "url": "jdbc:mysql://192.168.1.10:3306/test_db?useSSL=false&serverTimezone=Asia/Shanghai", "user": "mycat_user", "password": "Mycat@2024", "maxPoolSize": 30, "minPoolSize": 5 }

url里的serverTimezone一定要写,不然 MySQL 8 会报时区错误。maxPoolSize别超过后端 MySQL 的max_connections减去其他应用的占用,我一般给 30 起步。配完之后重启 mycat2,看日志里有没有 “datasource init success” 之类的字样。

4.2 分片规则:先想清楚分片键再动手

分片规则是 mycat2 最容易配错的地方。我一般会先问自己:业务查询里最常用的过滤字段是什么?如果大部分查询都带user_id,那就用user_id做分片键,按取模或范围分。配置里通常要写分片函数和节点映射:

{ "tableName": "orders", "shardingKey": "user_id", "function": "mod", "nodes": ["mysql_backend_1", "mysql_backend_2"], "rule": "mod(user_id, 2)" }

mod(user_id, 2)表示按 user_id 对 2 取模,奇数进节点 1,偶数进节点 2。配完之后一定要用一条带user_id的查询去验证,比如SELECT * FROM orders WHERE user_id = 123,看日志里实际发到了哪个节点。如果查询不带分片键,mycat2 会广播到所有节点,性能会掉,这个后面避坑章节会细说。

4.3 读写分离配置:主从节点别写反

如果后端是主从架构,读写分离的配置要区分writeHost和readHost。我一般会把主库写在writeHost下,从库挂在同一个writeHost的readHost列表里:

{ "writeHost": { "host": "192.168.1.10:3306", "user": "mycat_user", "password": "Mycat@2024", "readHosts": [ { "host": "192.168.1.11:3306", "user": "mycat_user", "password": "Mycat@2024" } ] } }

写反的后果是:写请求打到从库,直接报 read-only 错误;读请求打到主库,主库压力下不来。配完之后用INSERT和SELECT各跑一次,看日志里路由目标是不是符合预期。

5. 避坑与排查:mycat2 装完连不上、路由错的常见原因

5.1 启动报 “JAVA_HOME is not set”

现象是执行启动脚本后立刻退出,终端只输出这一行。原因是脚本里用$JAVA_HOME找 java,但当前 shell 没配。解决方法是按 3.2 节配好/etc/profile.d/下的环境变量,并且确认启动脚本用的是source过的环境。如果用的是 systemd 管理,还要在 unit 文件里加Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk,因为 systemd 不读/etc/profile。

5.2 连后端 MySQL 报 “Access denied”

现象是 mycat2 进程起来了,但日志里反复刷 “Access denied for user 'mycat_user'@'192.168.1.20'”。原因是第 2 章里授权的网段和 mycat2 实际出口 IP 不一致,或者密码里有特殊字符被配置文件转义了。解决方法是先在 mycat2 机器上用mysql -h 后端IP -u mycat_user -p手动连一次,能连上再回去看配置文件。密码里如果有@或#,在 json 里要确认是否需要转义。

5.3 SQL 被广播到所有分片

现象是一条带WHERE user_id = 123的查询,日志里显示发到了所有节点。原因是分片规则里shardingKey写成了别的字段,或者 SQL 里的字段名和配置不一致。解决方法是先EXPLAIN一下 mycat2 的路由结果,确认它识别到的分片键是什么。我一般会在配置改完后,用一条最简单的查询验证路由,再逐步加复杂度。

5.4 日志目录权限不足导致启动失败

现象是启动脚本报 “Permission denied” 写日志。原因是/data/mycat2/logs的属主不是启动用户。解决方法是chown -R deploy:deploy /data/mycat2,并且确认启动脚本里-Dmycat.log.home指向的路径和实际目录一致。如果用的是 root 启动、deploy 用户跑业务,日志文件属主会变成 root,后面 deploy 再启动就写不进去了,这个坑我踩过不止一次。

5.5 连接池耗尽导致后端拒绝连接

现象是压测时 mycat2 日志报 “Too many connections” 或连接超时。原因是maxPoolSize给太大,多个 mycat2 实例加起来超过了后端 MySQL 的max_connections。解决方法是先在后端 MySQL 上SHOW PROCESSLIST看实际连接数,再把每个 mycat2 实例的maxPoolSize调小,或者在后端加max_connections。我一般会留 20% 的余量,不让连接池打满。

6. 装完怎么验证跑通:三条查询加一个习惯

验证 mycat2 是否真正跑通,我一般会按三步走。第一步,确认服务进程和端口:ps -ef | grep mycat能看到进程,netstat -tlnp | grep 8066能看到默认的 8066 端口在监听。8066 是 mycat2 对外提供 MySQL 协议服务的端口,应用连的就是这个口,不是后端 MySQL 的 3306。第二步,用 MySQL 客户端连 mycat2 自己:

mysql -h 127.0.0.1 -P 8066 -u root -p -e "SELECT 1"

这里-u root是 mycat2 自己的逻辑账号,不是后端 MySQL 的账号,密码在conf/下的用户配置里。能返回1说明 mycat2 的 SQL 解析和响应链路是通的。第三步,跑一条真实的分片查询,比如SELECT * FROM orders WHERE user_id = 123,然后立刻tail -f /data/mycat2/logs/mycat.log,看日志里路由到了哪个节点。如果日志里显示只发到了一个节点,并且返回了数据,说明分片规则生效了。

我还会额外做一件事:把EXPLAIN打开,看 mycat2 对每条 SQL 的路由计划。常见做法是在连接 mycat2 后执行EXPLAIN SELECT ...,它会返回路由到的节点列表。这个习惯帮我提前发现了很多分片键写错的问题,比等业务报错再查快得多。

验证通过之后,别急着把 console 模式关掉。我一般会让它在前台跑至少半小时,观察有没有间歇性的连接断开或超时。如果半小时内日志干净,再切到后台启动脚本./mycat start,并且把日志目录挂到监控上。从那以后我每次装完 mycat2,都会强制走一遍“进程→端口→SELECT 1→分片查询→EXPLAIN”这五步,少一步都可能在上线后翻车。希望帮到你。

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

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

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

立即咨询