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 环境)

  1. 环境要求:CentOS Stream 8/9(兼容稳定)、JDK 8+(Mycat 基于 Java 开发)。
  2. 依赖准备:
    • 安装 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';)。

三、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 是否能连接。

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
    sql
    mysql> 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 聚合效果

  1. 通过 Mycat 查询所有数据(Mycat 会自动从 2 个分片查询并聚合结果):
    sql
    mysql> select * from user;
    +----+--------+-----+
    | id | name   | age |
    +----+--------+-----+
    |  1 | 张三   |  20 |
    |  2 | 李四   |  22 |
    |  3 | 王五   |  25 |
    |  4 | 赵六   |  28 |
    +----+--------+-----+
    
  2. 分别查询真实数据库,验证数据分布:
    • 登录 192.168.1.101:3306/db1
      sql
      select * from user; -- 结果:ID=2、4(李四、赵六)
      
    • 登录 192.168.1.202:3306/db2
      sql
      select * 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 数量一致

六、进阶学习方向(入门后拓展)

  1. 核心功能深入
    • 读写分离:在 schema.xml 中配置 readHost(如主库 192.168.1.101,从库 192.168.1.103),设置 balance="1" 开启读分离。
    • 分表规则:学习更多分片规则(如按时间范围、按地区、一致性哈希),修改 rule.xml 自定义规则。
    • 高可用:配置双主双从,实现主库故障自动切换(writeHost 多节点配置)。
  2. 运维与监控
    • Mycat 管理端口:9066(用于管理命令,如 mysql -h127.0.0.1 -P9066 -umycat_app -p123456,执行 show @@datanode; 查看分片状态)。
    • 日志排查:logs/mycat.log(运行日志)、logs/wrapper.log(启动日志)。
  3. 实战场景
    • 结合 Spring Boot 项目,连接 Mycat 实现分布式订单系统(订单表分库分表 + 读写分离)。
    • 学习 Mycat 2.0(新版本,支持更多特性)。

七、优质学习资源

  1. 官方文档:Mycat 官方文档(权威,覆盖所有配置细节)。
  2. 视频教程:
    • 尚硅谷《Mycat 分布式数据库中间件教程》(零基础友好,结合实战)。
    • 黑马程序员《Mycat 分库分表实战》(侧重企业级场景)。
  3. 书籍:《Mycat 权威指南》(深入核心原理与配置)。

核心学习建议

  1. 「配置驱动学习」:Mycat 核心是配置文件,先通过简单场景(如本次分库分表)理解 server.xml 和 schema.xml 的作用,再逐步添加复杂配置(读写分离、高可用)。
  2. 「实操验证」:每修改一项配置,都要通过「连接 Mycat → 执行 SQL → 查看真实数据库」的流程验证效果,避免盲目配置。
  3. 「日志优先」:遇到问题先看日志(mycat.log),日志会明确提示错误原因(如配置错误、数据库连接失败),比盲目搜索更高效。
按照这个路径,1 周内就能掌握 Mycat 基础使用,后续结合分布式系统实战,就能真正发挥其分库分表、读写分离的核心价值~
阅读剩余
THE END