Mycat 是一款基于 MySQL 协议的 开源分布式数据库中间件,核心作用是「伪装成 MySQL 服务器」,对应用透明地实现数据库的 分库分表、读写分离、高可用 等能力 —— 应用无需修改代码,只需像连接普通 MySQL 一样连接 Mycat,即可访问背后的多台真实数据库服务器。
对于 CentOS 环境学习者(尤其后端开发 / 运维),Mycat 是分布式系统必备技能,以下从「核心概念→CentOS 部署→基础配置→实战演示」展开,帮你快速入门。
- 逻辑库(Schema):Mycat 对外暴露的「虚拟数据库」,应用连接的是逻辑库,而非真实数据库。
- 逻辑表(Table):Mycat 对外暴露的「虚拟表」,对应背后多台真实数据库中的「分片表」(分库分表后的数据表)。
- 分片(DataNode):真实的数据存储节点,对应「某台数据库服务器的某个数据库」(如
dn1=localhost:3306/db1)。
- 分片规则:将逻辑表数据拆分到不同分片的规则(如「按 ID 取模」「按时间范围」)。
- 读写分离:通过「主库(writeHost)」「从库(readHost)」配置,实现读、写请求分离转发。
- 环境要求:CentOS Stream 8/9(兼容稳定)、JDK 8+(Mycat 基于 Java 开发)。
- 依赖准备:
- 安装 JDK 8(Mycat 对 JDK 8 兼容性最好):
dnf install -y java-1.8.0-openjdk-devel
java -version
- 准备真实数据库(主从 / 单机均可,本次用 2 台单机 MySQL 模拟分库场景):
- 数据库 1:
192.168.1.101:3306,创建数据库 db1。
- 数据库 2:
192.168.1.102:3306,创建数据库 db2。
- 注意:所有真实数据库需创建 Mycat 连接用户,并授予权限(如
grant all on *.* to 'mycat'@'%' identified by '123456';)。
Mycat 官方推荐版本为 1.6.x(稳定版),下载地址:
Mycat 官网下载,本次用
Mycat-server-1.6.7.6-linux.tar.gz 为例:
wget http://dl.mycat.org.cn/1.6.7.6/20220524173828/Mycat-server-1.6.7.6-linux.tar.gz
tar -zxvf Mycat-server-1.6.7.6-linux.tar.gz -C /usr/local/
cd /usr/local/mycat
ls
Mycat 核心配置集中在 conf 目录,需修改 3 个关键文件:server.xml(用户 / 权限配置)、schema.xml(逻辑库 / 分片 / 读写分离配置)、rule.xml(分片规则配置,默认无需修改,按需调整)。
作用:设置应用连接 Mycat 的用户名、密码、默认逻辑库,类似 MySQL 的用户授权。
vim /usr/local/mycat/conf/server.xml
保留核心配置(删除多余注释,简化如下):
<?xml version="1.0" encoding="UTF-8"?>
<mycat:server xmlns:mycat="http://io.mycat/">
<user name="mycat_app">
<property name="password">123456</property>
<property name="schema">mycat_db</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
- 说明:应用后续连接 Mycat 时,用户名
mycat_app、密码 123456,默认连接逻辑库 mycat_db。
作用:关联逻辑库与真实数据库,配置分片规则、读写分离,是 Mycat 最核心的配置文件。
vim /usr/local/mycat/conf/schema.xml
以「分库分表(按 ID 取模分 2 库)」为例,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycat_db" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" dataNode="dn1,dn2" rule="mod-long" primaryKey="id" />
</schema>
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host2" database="db2" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="host1-master" url="192.168.1.101:3306" user="mycat" password="123456" />
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<writeHost host="host2-master" url="192.168.1.102:3306" user="mycat" password="123456" />
</dataHost>
</mycat:schema>
- 关键参数说明:
balance="0":不开启读写分离(1 = 开启,读请求转发到 readHost)。
rule="mod-long":分片规则为「按主键 ID 取模」(默认规则,在 rule.xml 中定义,分 2 片则 id%2=0 存 dn1,id%2=1 存 dn2)。
primaryKey="id":逻辑表主键(Mycat 需通过主键判断分片)。
rule.xml 定义了 Mycat 内置的分片规则,本次用的 mod-long 规则如下(默认已配置):
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
cd /usr/local/mycat/bin
./mycat console
- 启动成功标志:日志中出现
Mycat Server startup successfully. see logs in logs/mycat.log。
- 常见启动失败排查:
- JDK 未安装或版本不兼容:检查
java -version。
- 配置文件语法错误:查看
logs/mycat.log,日志会提示具体错误行(如 XML 标签缺失、数据库连接失败)。
- 真实数据库未启动或用户权限不足:验证
mysql -h192.168.1.101 -umycat -p123456 是否能连接。
Mycat 默认端口为 8066(MySQL 协议端口),用 MySQL 客户端连接(如 Navicat、命令行):
mysql -h127.0.0.1 -umycat_app -p123456 -P8066
- 连接成功后,执行
show databases;,会看到 Mycat 暴露的逻辑库 mycat_db:
mysql> show databases;
+
| DATABASE |
+
| mycat_db |
+
目标:通过 Mycat 操作逻辑表 user,验证数据按「ID 取模」拆分到 db1.user 和 db2.user。
连接 Mycat 后,执行建表语句(Mycat 会自动将建表语句同步到所有分片的真实数据库):
use mycat_db;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 验证:分别登录 2 台真实数据库,查看
db1.user 和 db2.user 是否已创建(Mycat 自动同步建表)。
通过 Mycat 插入 4 条数据(ID 分别为 1、2、3、4):
INSERT INTO user (id, name, age) VALUES (1, '张三', 20);
INSERT INTO user (id, name, age) VALUES (2, '李四', 22);
INSERT INTO user (id, name, age) VALUES (3, '王五', 25);
INSERT INTO user (id, name, age) VALUES (4, '赵六', 28);
- 通过 Mycat 查询所有数据(Mycat 会自动从 2 个分片查询并聚合结果):
mysql> select * from user;
+
| id | name | age |
+
| 1 | 张三 | 20 |
| 2 | 李四 | 22 |
| 3 | 王五 | 25 |
| 4 | 赵六 | 28 |
+
- 分别查询真实数据库,验证数据分布:
- 登录
192.168.1.101:3306/db1:
- 登录
192.168.1.202:3306/db2:
- 结论:Mycat 成功实现分库分表,应用无需关心数据存储位置,仅需操作逻辑表。
- 核心功能深入:
- 读写分离:在 schema.xml 中配置
readHost(如主库 192.168.1.101,从库 192.168.1.103),设置 balance="1" 开启读分离。
- 分表规则:学习更多分片规则(如按时间范围、按地区、一致性哈希),修改 rule.xml 自定义规则。
- 高可用:配置双主双从,实现主库故障自动切换(
writeHost 多节点配置)。
- 运维与监控:
- Mycat 管理端口:
9066(用于管理命令,如 mysql -h127.0.0.1 -P9066 -umycat_app -p123456,执行 show @@datanode; 查看分片状态)。
- 日志排查:
logs/mycat.log(运行日志)、logs/wrapper.log(启动日志)。
- 实战场景:
- 结合 Spring Boot 项目,连接 Mycat 实现分布式订单系统(订单表分库分表 + 读写分离)。
- 学习 Mycat 2.0(新版本,支持更多特性)。
- 官方文档:Mycat 官方文档(权威,覆盖所有配置细节)。
- 视频教程:
- 尚硅谷《Mycat 分布式数据库中间件教程》(零基础友好,结合实战)。
- 黑马程序员《Mycat 分库分表实战》(侧重企业级场景)。
- 书籍:《Mycat 权威指南》(深入核心原理与配置)。
- 「配置驱动学习」:Mycat 核心是配置文件,先通过简单场景(如本次分库分表)理解
server.xml 和 schema.xml 的作用,再逐步添加复杂配置(读写分离、高可用)。
- 「实操验证」:每修改一项配置,都要通过「连接 Mycat → 执行 SQL → 查看真实数据库」的流程验证效果,避免盲目配置。
- 「日志优先」:遇到问题先看日志(
mycat.log),日志会明确提示错误原因(如配置错误、数据库连接失败),比盲目搜索更高效。
按照这个路径,1 周内就能掌握 Mycat 基础使用,后续结合分布式系统实战,就能真正发挥其分库分表、读写分离的核心价值~