0
0
0
0
博客/.../

中小电商订单库从 MySQL 分库分表平滑迁移 TiDB 全纪录

 大唐天子  发表于  2026-06-09
原创

做电商后端的同学应该都深有体会:MySQL 分库分表能救一时,但救不了一辈子。

随着订单数据量持续上涨,分片越来越多、扩容越来越重、跨表统计越来越慢。我所在的生鲜电商团队,此前订单系统长期使用 8库64表 Sharding-JDBC 分片架构,稳定跑了三年,但从去年开始,大促限流、报表延迟、运维爆炸的问题集中爆发。

经过多轮 POC 对比,我们最终彻底放弃传统分库分表方案,将核心订单业务整体迁移到 TiDB 7.5 HTAP 集群,实现了:单逻辑表承载百亿数据、无需分片、联机交易+实时报表一套集群搞定。

本文是真实线上迁移落地复盘,包含完整迁移方案、性能对比、生产踩坑和成本收益,无水文、无套话,可直接作为中小公司 TiDB 落地参考。

一、为什么我们彻底放弃了 MySQL 分库分表?

先讲真实线上现状,不夸大、不渲染。

我们订单系统日常日单量百万级,大促峰值单日可达3000万+,三年累计数据 18亿+、2.1TB。原有 64 张子表,单表数据量早已突破亿级。

这套架构的痛点已经不是“慢”,而是严重阻碍业务迭代

1. 扩容成本极高

传统分片扩容需要拆实例、拆表、改路由、回归验数据,一次扩容流程走完至少一周。去年618前夕分片容量告急,来不及扩容只能临时限流,直接影响成交。

2. 实时统计完全无法支撑

运营日报、销量统计、区域GMV全部需要跨64表 UNION 聚合。MySQL 根本扛不住,只能凌晨离线跑批,业务拿到的数据永远是 T+1。

我们曾用 MySQL+ES 做实时查询,但是字段变更、数据同步、运维复杂度大幅上升,非常笨重。

3. 运维负担爆炸

64 张表的备份、巡检、索引优化、慢 SQL 排查,工作量是单表的数倍,DBA 大量精力消耗在重复分片运维上。

基于以上问题,我们明确了新架构的核心诉求:

  • 无需人工分表,天然分布式扩容
  • 兼容 MySQL,业务代码尽量不动
  • 一套集群同时支撑交易 + 实时分析
  • 高可用、低运维成本

最终选型 TiDB,完全贴合我们的业务场景。

二、生产集群部署架构(真实线上配置)

我们采用物理机自建集群,稳定度更高,适合核心交易业务。

  • PD 3节点:负责元数据调度、分片均衡
  • TiDB 4节点:计算层,承接业务读写请求
  • TiKV 6节点(三副本):事务存储,承载核心订单写入、查询
  • TiFlash 3节点:列式存储,专门用来跑报表、统计、OLAP 查询

核心优势:一份数据、双引擎复用。联机走 TiKV 行存,分析走 TiFlash 列存,互不抢占资源。

三、MySQL 到 TiDB 完整迁移方案(零停机、灰度安全)

我们采用业内最稳妥的方案:Lightning 全量冷导入 + DM 增量同步 + 灰度切流,全程不影响原线上业务,无停机窗口。

1. 前置兼容性排查

迁移前必须做兼容性校验,否则上线必翻车。我们通过官方工具扫描,主要处理三类问题:

  • 废弃复杂存储过程,统一下沉到业务代码
  • 所有表统一 InnoDB、规范主键结构
  • 去掉 MySQL 分区表,改用 TiDB 天然分片替代

重点规范:所有核心表必须有主键,杜绝隐式 _rowid 热点

2. 全量历史数据导入

针对 2.1TB 海量历史数据,我们使用 Dumpling 导出 + Lightning 本地模式导入

这里是 TiDB 最香的一点:MySQL 64 张子表,直接合并为 TiDB 一张逻辑大表。彻底告别分片逻辑。

整个全量导入耗时约 11 小时,放在凌晨低峰窗口完成,对业务无感知。

3. DM 增量实时同步

全量数据对齐后,搭建 DM 同步 Binlog,保持 MySQL 与 TiDB 数据实时一致。

初期同步延迟 10–30s,优化 TiKV 队列与批量参数后,稳定延迟 500ms 以内,完全满足交易业务一致性要求。

4. 三级灰度切流(核心上线策略)

为保证绝对安全,我们采用阶梯式灰度:

  1. 只读灰度:10% → 50% → 100% 切读流量,观察慢 SQL、延迟、CPU、GC
  2. 双写灰度:业务同时写 MySQL、TiDB,定时对比数据一致性
  3. 全量切换:确认 24h 数据零差异,彻底下线 MySQL 分片架构

业务侧零代码改造,仅修改 JDBC 连接地址与参数,极大降低上线风险。

四、上线后真实性能对比(生产实测)

1. 交易性能提升明显

  • 下单 TP99 延迟:320ms → 78ms,降低 75%+
  • 大促峰值承载:4.2w 限流 → 5.5w 稳定无限流
  • DDL 变更:从几小时跨表变更 → 秒级在线 DDL

2. 报表能力质变

原 MySQL 跨表统计:30 分钟+,只能 T+1 离线跑批。

TiDB + TiFlash 之后:同款 SQL 1s 级返回,实时当日经营数据

我们直接下线了整套 ES 报表架构,每年节省不少机器与运维成本。

五、生产真实踩坑总结(非常实用)

这里分享几个我们真实踩过、全网高复用的坑。

1. 自增主键导致写入热点

初期沿用 MySQL 自增 ID,大促集中写入全部打在同一个分片,单节点 CPU 跑满。

解决方案:业务主键统一改为AUTO_RANDOM,数据自动打散,热点彻底解决。

2. 未开启批量写入参数,性能极差

没有配置 rewriteBatchedStatements,批量入库效率极低。开启后批量写入性能提升数倍,属于生产必配参数。

3. 全量表开启 TiFlash 导致磁盘压力大

并非所有表都需要列存副本。优化后:仅报表、统计类表开启 TiFlash,流水日志表关闭,磁盘压力大幅下降。

4. 上游大 DDL 容易导致 DM 同步异常

规范流程:上游 MySQL DDL 变更,先在 TiDB 预执行,再变更源端,避免同步中断。

六、迁移后的整体收益

  • 研发效率提升:彻底告别分表规则设计,迭代速度明显加快
  • 运维压力减半:64 表运维简化为单逻辑表运维
  • 硬件成本下降:下线大量 MySQL、ES 节点,整体 TCO 下降 30%+
  • 业务能力升级:具备实时经营分析能力,支撑精细化运营

七、总结

这次迁移最大的感受是:MySQL 分库分表是“被动填坑”,TiDB 是“架构升级”。

对于中小电商、互联网业务,只要数据量达到单表亿级、有冷热混合读写、有实时统计需求,TiDB 的 HTAP 架构优势非常明显。不用再为分片扩容熬夜、不用再维护笨重的辅助查询组件、不用再忍受 T+1 的滞后数据。

技术选型从来不追新,只选合适的。TiDB 不是万能的,但在替代 MySQL 分库分表、一套架构支撑交易+实时分析的场景下,是目前最稳、最落地的选择。

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论