Mycat 使用入门:从概念到 CentOS 实操
Mycat 是一款基于 MySQL 协议的 开源分布式数据库中间件,核心作用是「伪装成 MySQL 服务器」,对应用透明地实现数据库的 分库分表、读写分离、高可用 等能力 —— 应用无需修改代码,只需像连接普通 MySQL 一样连接 Mycat,即可访问背后的多台真实数据库服务器。
对于 CentOS 环境学习者(尤其后端开发 / 运维),Mycat 是分布式系统必备技能,以下从「核心概念→CentOS 部署→基础配置→实战演示」展开,帮你快速入门。
一、先搞懂:Mycat 是什么?解决什么问题?
1. 核心价值(分布式数据库痛点解决方案)
| 核心功能 | 通俗理解 | 典型场景 |
|---|---|---|
| 分库分表 | 将超大表(如千万级订单表)按规则拆分到多台数据库 / 数据表中,降低单库单表压力 | 电商订单表:按用户 ID 分库,按时间分表 |
| 读写分离 | 读请求转发到从库,写请求转发到主库,提高系统并发能力 | 博客系统:查询文章(读)走从库,发布文章(写)走主库 |
| 高可用 | 主库故障时自动切换到从库,避免数据库单点故障 | 金融系统:核心数据库需 7x24 可用 |
| 透明接入 | 应用端无需修改代码,连接 Mycat 如同连接普通 MySQL | 已有项目快速升级分布式数据库架构 |
2. 核心概念(必须掌握)
- 逻辑库(Schema):Mycat 对外暴露的「虚拟数据库」,应用连接的是逻辑库,而非真实数据库。
- 逻辑表(Table):Mycat 对外暴露的「虚拟表」,对应背后多台真实数据库中的「分片表」(分库分表后的数据表)。
- 分片(DataNode):真实的数据存储节点,对应「某台数据库服务器的某个数据库」(如
dn1=localhost:3306/db1)。 - 分片规则:将逻辑表数据拆分到不同分片的规则(如「按 ID 取模」「按时间范围」)。
- 读写分离:通过「主库(writeHost)」「从库(readHost)」配置,实现读、写请求分离转发。
二、前置条件(CentOS 环境)
- 环境要求:CentOS Stream 8/9(兼容稳定)、JDK 8+(Mycat 基于 Java 开发)。
- 依赖准备:
- 安装 JDK 8(Mycat 对 JDK 8 兼容性最好):
bash运行
# 安装 OpenJDK 8 dnf install -y java-1.8.0-openjdk-devel # 验证 JDK 安装(出现版本号即成功) 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';)。
- 数据库 1:
- 安装 JDK 8(Mycat 对 JDK 8 兼容性最好):
三、CentOS 实战:Mycat 安装与配置(重点)
步骤 1:下载并安装 Mycat
Mycat 官方推荐版本为 1.6.x(稳定版),下载地址:Mycat 官网下载,本次用
Mycat-server-1.6.7.6-linux.tar.gz 为例:bash
运行
# 1. 下载 Mycat(若官网链接失效,可改用镜像)
wget http://dl.mycat.org.cn/1.6.7.6/20220524173828/Mycat-server-1.6.7.6-linux.tar.gz
# 2. 解压到 /usr/local 目录(标准安装路径)
tar -zxvf Mycat-server-1.6.7.6-linux.tar.gz -C /usr/local/
# 3. 查看目录结构(核心目录说明)
cd /usr/local/mycat
ls
# bin:启动/停止脚本(mycat)
# conf:核心配置文件(schema.xml、server.xml、rule.xml)
# logs:日志文件(mycat.log 排查问题用)
步骤 2:核心配置文件修改(Mycat 灵魂)
Mycat 核心配置集中在
conf 目录,需修改 3 个关键文件:server.xml(用户 / 权限配置)、schema.xml(逻辑库 / 分片 / 读写分离配置)、rule.xml(分片规则配置,默认无需修改,按需调整)。1. 配置 server.xml(定义应用连接 Mycat 的用户)
作用:设置应用连接 Mycat 的用户名、密码、默认逻辑库,类似 MySQL 的用户授权。
bash
运行
# 编辑 server.xml
vim /usr/local/mycat/conf/server.xml
保留核心配置(删除多余注释,简化如下):
xml
<?xml version="1.0" encoding="UTF-8"?>
<mycat:server xmlns:mycat="http://io.mycat/">
<!-- 应用连接 Mycat 的用户配置 -->
<user name="mycat_app">
<!-- 密码 -->
<property name="password">123456</property>
<!-- 默认逻辑库(需与 schema.xml 中定义的逻辑库名一致) -->
<property name="schema">mycat_db</property>
<!-- 只读权限(false 为可读可写) -->
<property name="readOnly">false</property>
</user>
</mycat:server>
- 说明:应用后续连接 Mycat 时,用户名
mycat_app、密码123456,默认连接逻辑库mycat_db。
2. 配置 schema.xml(定义逻辑库、分片、真实数据库)
作用:关联逻辑库与真实数据库,配置分片规则、读写分离,是 Mycat 最核心的配置文件。
bash
运行
# 编辑 schema.xml
vim /usr/local/mycat/conf/schema.xml
以「分库分表(按 ID 取模分 2 库)」为例,配置如下:
xml
<?xml version="1.0" encoding="UTF-8"?>
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 逻辑库配置:name 为逻辑库名(与 server.xml 中 schema 一致) -->
<schema name="mycat_db" checkSQLschema="false" sqlMaxLimit="100">
<!-- 逻辑表配置:name 为逻辑表名,dataNode 为关联的分片,rule 为分片规则 -->
<table name="user" dataNode="dn1,dn2" rule="mod-long" primaryKey="id" />
</schema>
<!-- 分片配置:dataNode 对应真实数据库(主机:端口/数据库名) -->
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host2" database="db2" />
<!-- 真实数据库主机配置:dataHost 对应物理数据库服务器 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<!-- 心跳检测:确保数据库存活 -->
<heartbeat>select 1</heartbeat>
<!-- 主库配置(writeHost 负责写请求) -->
<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 需通过主键判断分片)。
3. 验证分片规则(rule.xml,默认无需修改)
rule.xml 定义了 Mycat 内置的分片规则,本次用的 mod-long 规则如下(默认已配置):xml
<!-- rule.xml 中默认配置 -->
<tableRule name="mod-long">
<rule>
<columns>id</columns> <!-- 按 id 字段分片 -->
<algorithm>mod-long</algorithm> <!-- 算法名 -->
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property> <!-- 分片数量(需与 dataNode 数量一致) -->
</function>
步骤 3:启动 Mycat 并验证
1. 启动 Mycat
bash
运行
# 进入 Mycat 二进制目录
cd /usr/local/mycat/bin
# 启动 Mycat(console 表示前台启动,方便查看日志;后台启动用 ./mycat start)
./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是否能连接。
- JDK 未安装或版本不兼容:检查
2. 连接 Mycat(模拟应用访问)
Mycat 默认端口为
8066(MySQL 协议端口),用 MySQL 客户端连接(如 Navicat、命令行):bash
运行
# 用 MySQL 命令行连接 Mycat(无需安装 Mycat 客户端,直接用 MySQL 客户端)
mysql -h127.0.0.1 -umycat_app -p123456 -P8066
- 连接成功后,执行
show databases;,会看到 Mycat 暴露的逻辑库mycat_db:sqlmysql> show databases; +------------+ | DATABASE | +------------+ | mycat_db | +------------+
四、实战演示:分库分表效果验证
目标:通过 Mycat 操作逻辑表
user,验证数据按「ID 取模」拆分到 db1.user 和 db2.user。步骤 1:通过 Mycat 创建逻辑表
连接 Mycat 后,执行建表语句(Mycat 会自动将建表语句同步到所有分片的真实数据库):
sql
-- 切换到逻辑库
use mycat_db;
-- 创建逻辑表(与普通 MySQL 建表一致)
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 自动同步建表)。
步骤 2:插入数据,验证分库效果
通过 Mycat 插入 4 条数据(ID 分别为 1、2、3、4):
sql
-- 插入数据(ID 为 1:1%2=1 → 存 dn2(db2))
INSERT INTO user (id, name, age) VALUES (1, '张三', 20);
-- ID=2:2%2=0 → 存 dn1(db1)
INSERT INTO user (id, name, age) VALUES (2, '李四', 22);
-- ID=3:3%2=1 → 存 dn2(db2)
INSERT INTO user (id, name, age) VALUES (3, '王五', 25);
-- ID=4:4%2=0 → 存 dn1(db1)
INSERT INTO user (id, name, age) VALUES (4, '赵六', 28);
步骤 3:查询数据,验证 Mycat 聚合效果
- 通过 Mycat 查询所有数据(Mycat 会自动从 2 个分片查询并聚合结果):
sql
mysql> select * from user; +----+--------+-----+ | id | name | age | +----+--------+-----+ | 1 | 张三 | 20 | | 2 | 李四 | 22 | | 3 | 王五 | 25 | | 4 | 赵六 | 28 | +----+--------+-----+ - 分别查询真实数据库,验证数据分布:
- 登录
192.168.1.101:3306/db1:sqlselect * from user; -- 结果:ID=2、4(李四、赵六) - 登录
192.168.1.202:3306/db2:sqlselect * from user; -- 结果:ID=1、3(张三、王五)
- 登录
- 结论:Mycat 成功实现分库分表,应用无需关心数据存储位置,仅需操作逻辑表。
五、新手必避的坑与解决方案
| 常见问题 | 原因 | 解决方案 |
|---|---|---|
| 连接 Mycat 失败(10061 错误) | 1. Mycat 未启动;2. 8066 端口未开放;3. 防火墙拦截 | 1. 启动 Mycat:./mycat start;2. 开放端口:firewall-cmd --permanent --add-port=8066/tcp && firewall-cmd --reload;3. 关闭防火墙(测试环境):systemctl stop firewalld |
| 插入数据报错(无主键) | Mycat 分片规则依赖主键判断分片位置 | 建表时必须指定主键(如 id),且插入数据时需包含主键 |
| 建表后真实数据库无表 | 1. 逻辑表未关联 dataNode;2. 真实数据库用户无建表权限 | 1. 检查 schema.xml 中 <table> 标签的 dataNode 属性;2. 给真实数据库用户授予建表权限:grant create on *.* to 'mycat'@'%'; |
| 查询数据不全 | 分片规则配置错误(如分片数量与 dataNode 不一致) | 确保 rule.xml 中 mod-long 的 count 与 schema.xml 中 dataNode 数量一致 |
六、进阶学习方向(入门后拓展)
- 核心功能深入:
- 读写分离:在 schema.xml 中配置
readHost(如主库 192.168.1.101,从库 192.168.1.103),设置balance="1"开启读分离。 - 分表规则:学习更多分片规则(如按时间范围、按地区、一致性哈希),修改 rule.xml 自定义规则。
- 高可用:配置双主双从,实现主库故障自动切换(
writeHost多节点配置)。
- 读写分离:在 schema.xml 中配置
- 运维与监控:
- Mycat 管理端口:
9066(用于管理命令,如mysql -h127.0.0.1 -P9066 -umycat_app -p123456,执行show @@datanode;查看分片状态)。 - 日志排查:
logs/mycat.log(运行日志)、logs/wrapper.log(启动日志)。
- Mycat 管理端口:
- 实战场景:
- 结合 Spring Boot 项目,连接 Mycat 实现分布式订单系统(订单表分库分表 + 读写分离)。
- 学习 Mycat 2.0(新版本,支持更多特性)。
七、优质学习资源
- 官方文档:Mycat 官方文档(权威,覆盖所有配置细节)。
- 视频教程:
- 尚硅谷《Mycat 分布式数据库中间件教程》(零基础友好,结合实战)。
- 黑马程序员《Mycat 分库分表实战》(侧重企业级场景)。
- 书籍:《Mycat 权威指南》(深入核心原理与配置)。
核心学习建议
- 「配置驱动学习」:Mycat 核心是配置文件,先通过简单场景(如本次分库分表)理解
server.xml和schema.xml的作用,再逐步添加复杂配置(读写分离、高可用)。 - 「实操验证」:每修改一项配置,都要通过「连接 Mycat → 执行 SQL → 查看真实数据库」的流程验证效果,避免盲目配置。
- 「日志优先」:遇到问题先看日志(
mycat.log),日志会明确提示错误原因(如配置错误、数据库连接失败),比盲目搜索更高效。
按照这个路径,1 周内就能掌握 Mycat 基础使用,后续结合分布式系统实战,就能真正发挥其分库分表、读写分离的核心价值~
阅读剩余
版权声明:
作者:SE_Yang
链接:https://www.cnesa.cn/9250.html
文章版权归作者所有,未经允许请勿转载。
THE END
相关推荐