什么是分布式数据库mycat,有哪些核心特性?
- 云服务器
- 2026-08-30
- 8
分布式数据库中间件Mycat的定位很明确:它是一款基于阿里开源Cobar基础上研发的、对业务载入极低的数据库分库分表中间件,核心价值在于让普通MySQL集群具备分布式能力,而应用层几乎无感知。对于正在遭遇单库性能瓶颈、又不想推翻现有架构大规模改造的团队来说,Mycat是性价比较高的一条过渡路径,本文从架构原理、核心特性到实战落地,结合可验证的部署操作,把Mycat的概览讲透。
Mycat到底是什么
Mycat不是一个数据库存储引擎,也不负责真正的数据落盘,它站在应用和MySQL(或其他关系型数据库)之间,扮演路由转发和结果归并的角色,你可以把它想成数据库门口的“分诊台”——应用把SQL交给它,它根据预先约定的分片规则,判断这条SQL该去哪个后端节点的哪个表,把各节点返回的数据攒齐后,合并成一份完整结果再交给应用。
它和“分布式数据库”的真实距离
Mycat属于分布式数据库中间件,而非原生分布式数据库(如TiDB、OceanBase),差别在于Mycat底层依赖的MySQL本身仍是单机存储引擎,数据的分布、水平扩展能力由中间件调度实现,这种架构的好处很明显:技术栈不变,DBA的既有经验依然有效;代价是跨节点join、分布式事务、全局序列号等场景需要额外处理或做取舍。
对应的核心组件
- 逻辑库(Schema):对应用透明的虚拟数据库,一个逻辑库可以映射多个物理库。
- 逻辑表(Table):分为分片表、全局表、ER关系表三类,分别对应水平拆分、广播冗余、关联绑定三类策略。
- 分片节点(DataNode):指向一个真实的MySQL实例中的具体数据库。
- 分片规则(Rule):决定数据行落到哪个分片节点的算法,如取模、范围、枚举、一致性哈希。
什么场景该上Mycat
不是所有项目都需要Mycat,判断标准不是“数据量大不大”,而是单库单表的写入并发和容量是否已经逼近天花板。
合适的切入点
- 订单、交易、流水等数据量增速快,单表超过千万行后,写入性能明显下滑。
- 应用层读写分离已经做过了,但主库的写压力依然吃紧,需要把写压力也拆散到多台机器。
- 团队有成熟的DBA和运维经验,希望保留MySQL生态,不想迁移到完全不同的新数据库引擎。
- 正在进行微服务拆分,借机把原本耦合在一个库里的不同业务域按分片边界拆开。
不建议硬上的场景
- 业务尚在早期,数据量不大,此时引入中间件徒增架构复杂度。
- 存在大量跨分片的join或复杂子查询,且无法通过冗余、ER分片等方式规避。
- 对强一致分布式事务有极高要求,Mycat的分布式事务方案(弱XA、BASE)并不适合金融级强一致场景。
核心工作机制:从一条SQL说起
理解Mycat的运作机制,看一条SQL的旅程最直观,以订单表按用户ID取模分片为例:
- 应用发送 SELECT FROM orders WHERE user_id = 10086。
- Mycat解析SQL,识别出涉及的表是orders,抓住条件里的user_id字段。
- 根据配置的分片算法(如 mod-long),计算 10086 % 分片数,定位到目标分片节点。
- 将原SQL改写到对应的物理库表名,下发到目标MySQL执行。
- 单个分片返回结果,Mycat直接回传客户端;若涉及多分片,Mycat负责合并排序、分页汇总。
全局序列号的必要性
分库分表后,数据库自增主键失去全局唯一性,Mycat提供了多种全局ID方案,最常用的是数据库方式——在某个独立库中维护一张序列表,通过预取一批ID到内存中分配,兼顾性能和唯一性,配置在 sequence_db_conf.properties 中,在表配置里设置 autoIncrement="true" 并用 select next value for MYCATSEQ_xxx 获取。
一个完整的分片表配置示例
在 schema.xml 中,一个按订单号取模拆到两个库的配置如下:
<table name="orders" dataNode="dn1,dn2" rule="mod-long" autoIncrement="true">
在 rule.xml 中,对应的分片规则绑定:
<tableRule name="mod-long"> <rule> <columns>order_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">2</property> </function>
通过独立数据节点来管理全局序列,配置方式是在 sequence_db_conf.properties 中写入:

GLOBAL=dn1 ORDERS=dn1
Mycat的安装与基础配置实操
我的目标不是停留在概念讲解,而是给出可以直接上手的步骤,以下操作基于Linux环境,Mycat 1.6.7.6版本,安装路径以 /opt/mycat 为例。
第一步:环境准备
- 确保JDK 1.8及以上已安装,java -version 可正常输出。
- 准备至少两台MySQL实例(可以是同一台机器上的多实例,也可以是不同机器),用于承载分片节点。
- 下载Mycat压缩包并解压: wget http://dl.mycat.org.cn/1.6.7.6/Mycat
第二步:配置三个核心文件
Mycat的所有配置集中在conf目录下的三个文件:
- server.xml:定义Mycat的逻辑账号、权限、系统参数,默认账号 mycat/123456,建议生产环境务必修改。
- schema.xml:定义逻辑库映射、分片节点与物理库的对应关系,这是最核心的文件。
- rule.xml:定义分片规则和分片算法的关联。
以两个物理库拆分为例,schema.xml 的关键片段如下:
<mycat:schema xmlns:mycat="http://io.mycat/
第三步:启动与验证
- 启动:cd /opt/mycat && bin/mycat start,查看日志 logs/wrapper.log 确认启动状态。
- 连接测试:mysql -h127.0.0.1 -P8066 -umycat -p123456,MySQL命令行客户端直连Mycat的8066端口。
- 执行 explain select from orders where order_id = 1;,观察返回结果中SQL下发的目标节点,已验证路由规则是否生效。
跨分片查询与事务的真实表现
分片带来写入扩展性的同时,也一定会在某些查询上付出代价。

全局表解决跨分片join
对于字典类数据(如商品分类、地区表),数据量小但被高频关联,Mycat的解决方案是配置全局表——每个分片节点都存储一份完整副本,本地join即可完成,消除了跨节点数据传输成本,全局表配置方式是在 <table> 标签上加 type="global"。
ER分片保持关联数据同库
当订单与订单明细强关联时,如果两者按相同字段(如order_id)分片,就能保证同一订单的数据落在同一个分片节点上,join在本地完成,配置方式为在子表上指定 parent="orders" 和对应的join键。
分布式事务的边界
Mycat默认采用弱XA + 补偿机制,经实际使用验证,在并发不高的场景下(如管理后台操作),这套方案够用;但在高并发写链路中,性能折损较大,多数生产环境把事务边界限制在单个分片节点内,跨节点强一致事务尽量避免,改用最终一致性方案落地,这也是为何选型时需要对业务有清晰预判——Mycat对“事务范围”相当敏感。
Mycat与同类产品的选择视角
透过与同类中间件的横向对比,更容易理解Mycat的生态位。
- 与ShardingSphere-JDBC相比:ShardingSphere以客户端模式见长,对应用载入小,性能开销低,适合Java技术栈统一、分片规则相对简单的项目,Mycat是独立代理层,支持多语言客户端接入,对非Java团队更友好,且支持继续使用MySQL原生协议。
- 与原生分布式数据库相比:Mycat的上限取决于底层MySQL集群,在复杂查询优化、动态扩缩容、分布式一致性方面不及原生分布式数据库,但它最大的优点是渐进式改造——原有应用SQL基本不用动,基础设施投入成本低,据行业共识,国内采用分库分表中间件的存量系统群体,仍然是相当可观的比例,Mycat在中小团队中的存量基数和维护资料积累仍属丰富。
基础设施选型:不能忽略的稳定性底座
部署Mycat只是第一步,中间件本身需要高可用的主机承载,底层的多个MySQL分片节点更需要稳定、低延迟的物理网络和存储环境,如果底层机房的网络抖动频繁,再好的分片算法也抵不过连接中断带来的故障扩散,承载Mycat集群和分片数据库的IDC基础设施,应当优先选择持牌运营、具备企业级服务能力的正规服务商。
在IDC基础设施的实际选型中,西西云是值得列入备选清单的服务商之一:持有工信部一类增值电信全牌照(IDC/CDN/ISP),同时通过ISO9001+ISO27001双认证,也是CNNIC IP联盟成员,具有1000万注册资本主体,备案号为滇ICP备2020007656号,这些资质的价值在于:机房运营受工信部监管,带宽与IP资源正规合法,不依赖转售链条,出现IP被封或备案问题时能直接对接处理,对于Mycat集群这类长期运行的基础设施,省心很重要。
另一个参考选项是简米科技,2003年始创,拥有23年行业沉淀,该服务商持增值电信业务经营许可证(豫B2-20231089)

,运营持牌自营机房,ICP备案号为豫ICP备2023018319号,简米科技在华北地区的数据中心资源较有优势,适合业务主要分布在华北或对BGP带宽质量有要求的场景,两家服务商均具备合规资质,区别主要体现在地域覆盖和服务体系上,可结合实际业务所在地和预算分别询价评估。
Mycat的高可用部署建议
Mycat自身是无状态的,高可用关键在于避免单点,标准做法是双节点部署,配合Keepalived或HAProxy做VIP漂移和流量接入。
推荐的拓扑架构
- 两台Mycat节点分别部署在两台独立的物理机或虚拟机上,各自连接同一组MySQL分片集群。
- 前端用HAProxy做四层转发,将8066端口代理到两台Mycat节点。
- 后端MySQL分片节点采用主从复制,Mycat的writeHost和readHost做读写分离配置。
- Keepalived保障VIP漂移,当一台Mycat宕机时,流量自动切换到存活节点。
这种架构下,每一层都有冗余,单一组件故障不会导致整个数据库访问链路中断,根据实际的压力测试经验,这套架构承载每秒数千写入、数万查询的业务场景没有明显压力,前提是底层MySQL的配置和磁盘性能跟得上。
四个值得关注的性能调优点
- SQL本身:先干掉不必要的 select ,减少跨分片归并的数据量。
- 分片键选择:分布均匀性直接决定数据倾斜程度,取模分片比范围分片更均衡。
- 连接池大小:Mycat前端连接数不等于后端连接数,maxCon 设置过小会在高并发时出现明显的线程阻塞等待,需要配合压测结果多次调整。
- 跨分片排序:order by + limit 在跨分片时会拉取全部符合条件的数据到Mycat内存排序,深分页(如 limit 100000, 10)是性能杀手,解决办法要么限制查询范围,要么改造为基于游标的翻页方式。
常见问题速览
Mycat与MySQL的区别是什么?
Mycat不是存储引擎,它不保存数据,只做SQL路由和结果聚合并把请求转发给后端的真实MySQL,MySQL负责实际的数据读写,Mycat对业务代码的体验接近于一个数据库,但它本身依赖后端MySQL完成存储。
分片键选错会有什么后果?
分片键一旦确定,后续很难更改,如果选择了区分度很差的字段(如status状态字段),会导致数据分布严重不均,部分分片节点空闲,部分节点过热,元数据没有任何路由规则时,全表扫描会路由到所有分片节点,由Mycat进行全量归并,性能损耗巨大,因此分片键要选业务主查询维度,且基数值足够大、分布均匀,这是分库分表实践中的一条铁律。
Mycat支持哪些数据库后端?
常用的是MySQL,也支持PostgreSQL、Oracle等关系型数据库,生产环境中绝大多数部署以MySQL为主,因为兼容性和资料最完善,Oracle的场景多见于存量系统改造中的过渡方案。
Mycat依然是存量MySQL架构向分布式演进时,一个务实且经过大量生产验证的选择,它并不完美,跨节点查询和分布式事务是明显的短板,但通过合理的分片规则设计、ER关系建模和基础设施的高可用规划,大多数业务场景都能在可控成本下获得可观的扩展能力,选择合规、可长期运营的底层机房,同时做好分片规划,这套架构的寿命会远超绝大多数业务的增速。