一、 分库分表介绍
1. 为什么要分库分表?
当单表数据量达到千万级别,或数据库实例的 QPS/TPS 过高导致性能瓶颈时,就需要考虑分库分表。
-
垂直分库:按业务模块将不同表拆分到不同数据库中。
-
水平分库:将同一个表的数据按某种规则拆分到多个数据库中。
-
垂直分表:将一个宽表的字段按访问频率拆分成多个表。
-
水平分表:将同一个表的数据按某种规则拆分到多个表中。
核心目的:解决由于数据量过大而导致的数据库性能瓶颈问题。
二、 Mycat 概述
1. 什么是 Mycat?
Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议 的服务器。前端用户可以把它看作是一个数据库代理,其核心功能是分库分表。
2. Mycat 的核心作用
-
读写分离:自动将写操作路由到主库,读操作路由到从库。
-
数据分片:将大数据表水平拆分,分布到多个后端 MySQL 节点上。
-
多数据源整合:统一对外提供服务,隐藏后端复杂的分布式架构。
-
高可用性:支持数据库故障自动切换。
3. Mycat 核心概念
概念 | 描述 |
---|---|
逻辑库 | 应用程序直接连接的数据库,在 Mycat 中配置,不存在于实际 MySQL 中 |
逻辑表 | 在逻辑库中创建的表,是物理表的逻辑映射 |
数据节点 | 存储实际数据的数据库实例,如 192.168.1.1:3306/testdb |
分片规则 | 决定数据如何分布到不同数据节点的算法 |
三、 Mycat 入门
1. 快速开始
-
下载安装:从官网下载 Mycat,解压即可。
-
配置文件 :主要修改
conf/
目录下的配置文件。 -
启动 :执行
bin/mycat start
。 -
连接:使用 MySQL 客户端连接 Mycat(默认端口 8066)。
2. 连接 Mycat
bash
mysql -u root -p -P 8066 -h 127.0.0.1
注意:连接的是 Mycat 服务,不是直接的 MySQL。
四、 Mycat 配置
Mycat 的核心配置文件都在 conf/
目录下。
1. server.xml
- 系统配置
定义用户、权限、系统参数等。
XML
<user name="mycat_user">
<property name="password">mycat_pass</property>
<property name="schemas">TESTDB</property> <!-- 逻辑库名 -->
</user>
2. schema.xml
- 逻辑库表配置
最重要的配置文件,定义逻辑库、逻辑表、数据节点、分片规则等。
XML
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义逻辑库 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- 定义逻辑表 -->
<table name="users" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<!-- 定义数据节点 -->
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host1" database="db2" />
<dataNode name="dn3" dataHost="host2" database="db3" />
<!-- 定义物理数据库连接 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="jdbc:mysql://192.168.1.1:3306"
user="root" password="123456"/>
</dataHost>
</mycat:schema>
3. rule.xml
- 分片规则配置
定义分片算法和规则。
五、 Mycat 分片
1. 常见分片规则
分片规则 | 描述 | 适用场景 |
---|---|---|
取模分片 | 根据字段值取模分配到不同节点 | 数据均匀分布 |
范围分片 | 按字段值范围分配 | 按时间、ID范围划分 |
哈希分片 | 一致性哈希算法 | 减少数据迁移 |
枚举分片 | 按字段枚举值分配 | 如按地区、类型分片 |
2. 分片规则配置示例
取模分片:
XML
<!-- 在 rule.xml 中 -->
<tableRule name="mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property> <!-- 分成3片 -->
</function>
范围分片:
XML
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
在 autopartition-long.txt 中定义范围:
XML
0-1000000=0
1000001-2000000=1
2000001-3000000=2
六、 Mycat 管理与监控
1. 管理命令
sql
-- 查看数据节点状态
show @@datanode;
-- 查看连接状态
show @@connection;
-- 查看缓存
show @@cache;
-- 查看线程池状态
show @@threadpool;
-- 重启Mycat(在连接中执行)
reload @@config;
2. 监控方式
- 命令行监控:通过 9066 管理端口连接
bash
mysql -u root -p -P 9066 -h 127.0.0.1
-
Web 监控:部署 Mycat-web 进行图形化监控
-
JMX 监控:通过 JMX 接口获取运行状态
3. 常见管理操作
sql
-- 在9066管理端口执行
-- 查看帮助
show @@help;
-- 查看系统状态
show @@system;
-- 查看SQL统计
show @@sql;
-- 查看慢SQL
show @@slow;
七、 Mycat 使用示例
1. 完整的分库分表示例
场景 :将 users
表按 user_id
取模分片到3个节点。
① schema.xml 配置:
XML
<schema name="TESTDB" checkSQLschema="false">
<table name="users" primaryKey="user_id" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="host1" database="user_db1" />
<dataNode name="dn2" dataHost="host1" database="user_db2" />
<dataNode name="dn3" dataHost="host2" database="user_db3" />
<dataHost name="host1" maxCon="1000" dbType="mysql">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.1:3306" user="root" password="123456"/>
</dataHost>
② 应用程序连接:
java
// JDBC连接字符串
String url = "jdbc:mysql://mycat-server:8066/TESTDB";
// 应用程序像使用普通MySQL一样操作,无需关心分片细节
八、 注意事项
-
分片键选择:选择查询频繁且数据分布均匀的字段作为分片键。
-
全局表:小量且需要频繁关联查询的表可配置为全局表,在所有节点冗余存储。
-
ER表:有关联关系的表可配置为ER表,保证关联数据在同一分片。
-
分布式事务:Mycat 对分布式事务的支持有限,复杂事务需在应用层处理。
-
SQL限制:某些复杂SQL(如子查询、跨分片JOIN)可能不被支持或性能较差。
总结
Mycat 作为分布式数据库中间件,核心价值在于让应用程序无感知地使用分库分表。
使用流程:
-
分析业务需求,设计分片方案
-
配置
server.xml
、schema.xml
、rule.xml
-
启动 Mycat 服务
-
应用程序连接 Mycat
-
通过管理端口监控运行状态
Mycat 大大降低了分库分表的技术门槛,是构建高并发、大数据量应用的重要工具。