Mycat 是什么?为什么需要它?
Mycat 是一款开源的分布式数据库中间件,核心目标是解决传统单机数据库的性能瓶颈问题。它通过分库分表 、读写分离 、数据路由 等机制,将多个物理数据库整合为逻辑上统一的数据库服务,对应用层透明。
典型应用场景:
- 高并发读写(如电商订单系统)
- 海量数据存储(日志、用户行为数据)
- 数据库水平扩展(避免单表数据量过大导致性能下降)
二、Mycat 核心概念解析
-
逻辑库(Schema)
Mycat 对外暴露的逻辑数据库名称(如
TESTDB
),实际对应多个物理数据库。应用层直接连接 Mycat,无需感知后端真实的数据库集群。 -
逻辑表(Table)
在逻辑库中定义的表,通过分片规则映射到物理表。例如,用户表
user
可能被拆分到多个物理库的user_1
、user_2
表中。 -
分片规则(Rule)
决定数据如何分布到不同物理节点的规则,常见方式包括:
- 哈希分片 :按字段哈希值分配(如
user_id % 3
) - 范围分片:按字段值范围分配(如订单日期)
- ER 关系分片:关联表数据分配到同一节点(避免跨库 JOIN)
- 哈希分片 :按字段哈希值分配(如
-
数据节点(DataNode)与主机(DataHost)
DataNode
:分片数据的物理存储单元(如dn1
对应 MySQL 实例的db1
)。DataHost
:定义物理数据库的主机地址、读写分离策略(如balance="1"
表示读负载均衡)。
三、快速搭建 Mycat 环境
1. 基础准备
- 安装 JDK 1.8+(Mycat 基于 Java 开发)
- 下载 Mycat 1.6+ 版本(官网或 GitHub 发布页)
2. 关键配置文件
-
schema.xml
:定义逻辑库、表、分片节点及读写分离策略。Xml
ini<schema name="TESTDB" checkSQLschema="false"> <table name="user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long"/> </schema>
-
server.xml
:配置 Mycat 服务参数(如端口号 8066、用户权限)。 -
rule.xml
:自定义分片算法(如按月份分片)。
3. 启动与测试
- 启动命令:
./mycat start
(Linux)或startup_nowrap.bat
(Windows) - 连接测试:使用 MySQL 客户端连接
8066
端口,执行 SQL 验证路由是否正确。
四、Mycat 实战应用场景
-
读写分离
通过配置
dataHost
的balance
属性,实现写操作走主库、读操作走从库。例如:Xml
ini<dataHost name="host1" balance="1" writeType="0"> <writeHost host="master" url="192.168.1.1:3306"/> <readHost host="slave1" url="192.168.1.2:3306"/> </dataHost>
-
分库分表示例
- 垂直分库:按业务拆分(如订单库、用户库)。
- 水平分表:单表数据按规则分散到多个库(如订单表按用户 ID 分片)。
-
全局表(广播表)
小规模静态表(如地区编码表)在所有分片节点同步存储,避免跨库查询。
五、常见问题与优化建议
-
错误:
find no Route
检查
schema.xml
中checkSQLschema
配置是否为true
,并确保 SQL 语句包含逻辑库名(如select * from TESTDB.user
)。 -
性能瓶颈
- 避免跨分片 JOIN,优先使用 ER 分片或冗余字段。
- 监控慢查询日志,优化分片键选择(如高频查询字段作为分片键)。
-
高可用
结合 MySQL 主从复制 + Mycat 故障转移(如
switchType="2"
支持自动切换主库)。
六、学习资源推荐
- 视频教程:尚硅谷《3 小时掌握 Mycat 核心》系列(涵盖分库分表实战)。
- 官方文档:Mycat 官网与 GitHub Wiki(最新配置参数详解)。
- 扩展阅读:《Mycat 权威指南》深入解析分片算法与源码设计。
总结 :Mycat 的核心价值在于屏蔽分布式复杂性,开发者只需关注业务逻辑。通过 3 小时集中学习,掌握配置文件编写与分片策略设计,即可应对大多数企业级数据分片需求。