架构-数据库层面-分库分表-mycat技术栈

之前已经说了,为什么要分库分表

这篇文章的核心就是,如何分库分表

以mycat为例

主要也是介绍一下这个技术栈

我们使用mycat的基本流程是这样的

1.使用docker安装mycat

2.在mycat的配置文件里,配置规则,连上mysql

3.了解mycat提供的机制,以及落地方案

4.springboot操作mycat

一、MyCat是什么?

MyCat是一个开源的分布式数据库中间件,可以把它理解为一个数据库代理。前端用户可以把MyCat看作一个MySQL数据库服务器,用MySQL客户端工具和命令行访问;后端它可以用MySQL原生协议与多个MySQL服务器通信。

简单来说,MyCat本身不存储数据 ,数据实际存储在后端的MySQL上,MyCat负责把SQL路由到正确的数据库节点执行,再把结果汇总返回。对应用层来说,操作MyCat就像操作一个普通的MySQL数据库,分库分表的逻辑完全在MyCat层配置,业务代码几乎不需要改动


二、使用Docker安装MyCat

由于Docker官方镜像仓库里几乎没有MyCat的现成镜像,一般需要本地打包构建一个Docker镜像

2.1 准备目录和下载MyCat

bash 复制代码
# 创建目录
mkdir /usr/local/mycat/conf -p
mkdir /usr/local/docker/mycat/ -p
cd /usr/local/docker/mycat

# 下载MyCat(以1.6.7.1版本为例)
wget http://dl.mycat.org.cn/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz

# 重命名并解压
mv Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz mycat.tar.gz
tar -zxvf mycat.tar.gz

# 复制配置文件到宿主机
cp -r mycat/conf/ /usr/local/mycat

2.2 编写Dockerfile

/usr/local/docker/mycat目录下创建dockerfile文件:

dockerfile 复制代码
FROM openjdk:8
ADD mycat.tar.gz /usr/local
VOLUME /usr/local/mycat
WORKDIR /usr/local/mycat
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console"]

2.3 打包镜像并启动容器

bash 复制代码
# 打包镜像
docker build -t mycat:1.6 .

# 启动容器(挂载配置和日志目录)
docker run --name mycat -p 8066:8066 -p 9066:9066 \
  -v /usr/local/mycat/conf/:/usr/local/mycat/conf/ \
  -v /usr/local/mycat/logs/:/usr/local/mycat/logs/ \
  -d mycat:1.6

注意:建议先把配置文件挂载到宿主机,这样即使配置文件写错导致容器启动失败,也可以直接在宿主机上修改,不需要进入容器。


三、MyCat核心配置文件详解

MyCat的核心配置主要有三个文件:

配置文件 作用
server.xml 配置MyCat的系统参数、用户、密码等
schema.xml 定义逻辑库、逻辑表、数据节点、数据主机等
rule.xml 定义分片规则(分库分表的具体策略)

3.1 server.xml --- 用户配置

配置MyCat的登录用户和密码:

xml 复制代码
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
</user>

3.2 schema.xml --- 逻辑库和表配置

这是最核心的配置文件,定义了逻辑库、逻辑表以及数据如何分布到物理数据库。

xml 复制代码
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- 定义逻辑表,指定分片规则 -->
    <table name="t_order" dataNode="dn1,dn2" rule="by-user-id"/>
</schema>

<!-- 定义数据节点 -->
<dataNode name="dn1" dataHost="localhost1" database="order_db_1"/>
<dataNode name="dn2" dataHost="localhost1" database="order_db_2"/>

<!-- 定义数据主机(连接真实的MySQL) -->
<dataHost name="localhost1" maxCon="1000" minCon="10" 
          balance="1" writeType="0" dbType="mysql" dbDriver="native">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"/>
</dataHost>

3.3 rule.xml --- 分片规则配置

定义具体的分片策略,如哈希取模、范围分片等:

xml 复制代码
<!-- 定义分片规则 -->
<tableRule name="by-user-id">
    <rule>
        <columns>user_id</columns>      <!-- 分片字段 -->
        <algorithm>mod-long</algorithm>  <!-- 分片算法 -->
    </rule>
</tableRule>

<!-- 定义分片算法:按ID取模 -->
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <property name="count">2</property>  <!-- 分片数量 -->
</function>

3.4 两种分库分表方式

  • 垂直切分:按照业务将不同的表分到不同的数据库(如用户表在一个库,订单表在另一个库)
  • 水平切分:将同一个表的数据按照某种规则拆分到多个数据库中(如用户ID取模)

四、Spring Boot操作MyCat

4.1 添加依赖

pom.xml中添加MyCat客户端和MySQL驱动依赖:

xml 复制代码
<dependency>
    <groupId>org.mycat</groupId>
    <artifactId>mycat-client</artifactId>
    <version>1.6.7.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

4.2 配置数据源

application.yml中配置数据源,指向MyCat的地址和端口(默认8066):

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://192.168.x.x:8066/TESTDB?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

4.3 编写业务代码

对Spring Boot应用来说,MyCat就是一个普通的MySQL数据库。使用JPA、MyBatis等ORM框架的方式和操作普通MySQL完全一样:

java 复制代码
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
    // 正常的CRUD操作,分库分表由MyCat在底层处理
}

唯一需要注意的是:分片表建议使用基础的SQL语句,以达到最佳性能。


五、总结

使用MyCat进行分库分表的整体流程可以概括为:

  1. Docker安装MyCat:本地构建镜像并启动容器,挂载配置文件到宿主机以便管理
  2. 配置三大核心文件
    • server.xml → 用户和系统参数
    • schema.xml → 逻辑库/表、数据节点、数据主机
    • rule.xml → 分片规则和算法
  3. Spring Boot集成:把数据源指向MyCat的8066端口,业务代码几乎不需要改动

MyCat的核心价值在于:将分库分表的复杂性从应用层剥离,交给中间件统一管理。对开发者来说,操作MyCat就像操作一个单库,底层的数据分布完全透明。

⚠️ 注意:MyCat官方已停止维护,如果是新项目,也可以考虑ShardingSphere等仍在活跃维护的同类中间件。