之前已经说了,为什么要分库分表
这篇文章的核心就是,如何分库分表
以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进行分库分表的整体流程可以概括为:
- Docker安装MyCat:本地构建镜像并启动容器,挂载配置文件到宿主机以便管理
- 配置三大核心文件 :
server.xml→ 用户和系统参数schema.xml→ 逻辑库/表、数据节点、数据主机rule.xml→ 分片规则和算法
- Spring Boot集成:把数据源指向MyCat的8066端口,业务代码几乎不需要改动
MyCat的核心价值在于:将分库分表的复杂性从应用层剥离,交给中间件统一管理。对开发者来说,操作MyCat就像操作一个单库,底层的数据分布完全透明。
⚠️ 注意:MyCat官方已停止维护,如果是新项目,也可以考虑ShardingSphere等仍在活跃维护的同类中间件。