介绍
当单个数据库无法承载海量数据或高并发访问时,MyCat能让你的应用像操作一个数据库一样,去访问和管理后端的多个数据库集群
核心功能
- 分库分表:把一张数据量巨大的表,按照一定的规则(比如按用户ID取模、按日期范围等)水平切分成多个小表,分布存储在不同的数据库节点上,从而解决单库的容量和性能瓶颈
- 读写分离:能自动将写操作路由到主数据库,将读操作分摊到多个从数据库,提升系统吞吐量。同时,它能通过心跳检测监控后端数据库的健康状态,在主库发生故障时自动切换,保障服务可用性
- SQL路由与结果聚合:MyCat会解析应用发来的SQL语句,根据预先配置的分片规则,计算出该SQL应该发送到哪个或哪些具体的数据库节点上执行,然后将各个节点返回的结果进行合并、排序等处理,最终统一返回给应用
分片规则
- 取模分片:根据分片键的值对节点数取模,数据分布较均匀,是使用最广的规则之一
- 范围分片:根据分片键的值范围划分数据(如 1-1000 在节点1,1001-2000在节点2)
- 枚举分片:根据预定义的枚举值将数据映射到特定分片(如按地区编码分片)
- 按日期分片:按日期或时间范围进行分片,适用于日志、流水等数据
如何保证全局主键ID的唯一性
由于数据库自增 ID 无法跨库唯一,MyCat 提供了全局序列号(Sequence)方案
- 本地文件方式:将 ID 存储在本地文件中,读取快,但 MyCat 主机宕机后存在风险
- 数据库方式:利用数据库的一张专用表来记录 ID 号段。MyCat 会预加载一批 ID 到内存中,用完后再取,效率较高且更可靠
- 时间戳方式:ID 由时间戳、机器 ID、业务编码和自增序列组合而成(类似雪花算法),配置简单但 ID 可能较长
分布式事务
跨多个数据库的事务一致性难以保证,需要支持两阶段提交(2PC) 协议来尽量保证事务的 ACID 特性
和ShardingSphere-JDBC相比
- MyCat:属于服务端代理(Proxy)方案
- 优点是对应用透明,无需修改代码,且支持跨语言(任何支持MySQL协议的语言都可以用)
- 缺点是配置相对复杂,版本迭代较慢,且由于多了一层网络转发,性能会有一些损耗
- ShardingSphere-JDBC:属于客户端增强(JDBC 驱动)方案
- 优点是性能更高,接入灵活,适合==Java技术栈==且对底层有更强控制力的团队
- 缺点是仅支持 Java,且需要修改应用代码