数据传输 DTS 实践:千里达票务系统从 IDC 平滑上云
千里达票务系统早期部署在公司自己的 IDC,后来业务要上云,最担心的就是数据迁移:停服窗口多久?迁过程中丢数据怎么办?迁完业务怎么切?用阿里云数据传输 DTS 做了一次"在线迁移 + 增量同步 + 灰度切流",全程业务零停机。
一、迁移难点
- 业务不能长时间停服(景区 7×24 售票);
- 数据量 200GB+,停服拷数据要好几小时;
- 老库 MySQL 5.6,新库 RDS MySQL 8.0,版本跨度大。
二、DTS 迁移三阶段
阶段1: 全量迁移 → 把存量数据一次性搬到新 RDS
阶段2: 增量同步 → 老库后续变更实时同步到新库(追平binlog)
阶段3: 灰度切流 → 先切 10% 业务读新库,观察无问题再切全量
三、关键步骤
3.1 迁移前校验
- 老库开启 binlog(ROW 模式);
- 字符集统一 utf8mb4;
- 大表提前归档,避免全量阶段跑太久。
3.2 配置 DTS 任务
- 源:IDC MySQL 公网地址(或走专线/VPN);
- 目标:阿里云 RDS 内网地址;
- 选"结构迁移 + 全量迁移 + 增量迁移";
- 迁移过程中 DTS 自动做主键冲突、字符集转换。
3.3 切流
- 观察 DTS 延迟(目标 < 1s)持续 1 天;
- 配置中心把"读库地址"按 10% 流量切到新 RDS;
- 观察 2 天无异常,切 100%;
- 老库保留 1 周做回滚兜底。
四、踩坑复盘
- 外键约束:老库有外键,迁移时新库建表顺序错导致失败。解决:DTS 选"迁移时禁用外键检查";
- 触发器/存储过程:早期业务用了几个存储过程,DTS 默认不迁。解决:手动导出 SQL 在新库执行;
- 字符集乱码:老库 latin1 存的中文,迁完变问号。解决:迁移前统一改 utf8mb4,DTS 选字符集转换;
- 切流后连接池不刷新:配置中心改了地址,但老连接还在连旧库。解决:切流后重启应用,连接池按新地址重建。
五、效果与总结
整次上云迁移,实际停服时间是 0:白天正常售票,晚上 DTS 追平,灰度切流。DTS 的价值是把"搬家"变成"搬家的同时还在营业"。对千里达票务系统这种不能停服的业务,在线迁移不是加分项,是必选项。