大规模数据迁移,速度是关键,没人愿意等待几天几夜时间完成数据搬迁,在没有实时同步功能的情况下,业务对于数据搬迁的时间容忍度可能就 2~3 个小时。
这篇文章就来聊聊大规模数据迁移为什么慢,以及几种常用的提速方法。最后,我们也会简单提到 CloudCanal 在这方面提供的一个能力:任务组,帮助你更高效、更有序地执行多任务迁移。
为什么大规模数据迁移这么慢?
大规模数据迁移之所以慢,往往不是单一因素造成的,而是多个因素交织的结果。
网络瓶颈
从 IDC 到公有云,或跨区域迁移时,网络带宽和延迟直接决定了传输速度。带宽不足会导致数据传输缓慢,而高延迟则会增加每次数据包往返的时间。
源端/目标端性能限制
数据在迁移过程中通常需要进行处理,如数据转换、压缩、解压缩等,这些操作会消耗大量的 CPU 和内存资源。如果资源不足,任务就会排队等待,导致整体速度下降。
数据库本身的配置,如缓冲区大小、并发连接数、日志模式等,都会影响数据读写效率。不合理的配置会限制迁移工具的性能发挥。
数据特性与复杂性
对于没有主键或索引的大表,全表扫描效率低,数据分片和并行处理较为困难,极易出现性能瓶颈。
BLOB、CLOB 等大对象数据类型,以及包含大量嵌套结构的数据,处理起来比简单数据类型更耗时。
工具与策略选择不当
各种迁移工具有各自的应用场景,数据库类型(同构/异构),数据处理功能丰富度,根据物理位置间距所采用的不同迁移方式,都会影响工具的选择和适配,选择正确,则事半功倍,反之则影响效率。
如何提速?
下面是几种在实践中常用的大规模数据迁移提速策略:
并行处理与并发优化
任务拆分:将一个庞大的迁移任务分解为多个独立的小任务,例如按表并行、按数据范围并行(如通过主键范围、哈希分片),然后同时执行这些任务。
增加并发连接数:调整迁移工具、数据库和操作系统的并发连接数限制,允许更多的连接同时读写数据。注意并发数不是越高越好,应评估目标库并发承压能力。
多线程:在迁移工具层面,启用多线程模式,并行处理数据。
优化网络与传输
提升网络带宽:升级网络设备,增加源端和目标端之间的网络带宽。对于跨云或跨地域迁移,考虑使用专线或高速通道。
减少网络延迟:尽可能缩短源端和目标端之间的物理距离。
数据压缩:在网络带宽有限但 CPU 资源充足的情况下,可以考虑采用 GZIP/LZ4 压缩数据,节省带宽。但这需要权衡压缩和解压缩带来的 CPU 开销。
提升源端与目标端性能
硬件升级:升级更快的 CPU、增加内存可以显著提升数据处理能力。
数据库优化:调整数据库缓冲区、日志文件大小、并发连接数等参数,以适应高并发写入。同时将批量插入替代逐条写入,批次大小根据目标库写入能力动态调整。
优化数据处理策略
数据分片策略:针对大表,选择合适的分片策略。对于无主键表,可以考虑使用 rowid(如果数据库支持)或其他自定义方式进行逻辑分片。
增量+全量结合:对于需要保持业务连续性的场景,可以先进行全量迁移,然后通过增量同步工具(如 CDC 工具)捕获并同步全量迁移期间产生的增量数据,最后进行业务切换,最大限度地减少停机时间。
跳过不必要的数据:提前识别并过滤掉不需要迁移的数据,减少迁移总量。
选择合适的工具与平台
根据数据量、业务复杂度、数据安全需求等综合评估,可选择官方迁移工具、第三方迁移工具或自研工具,关于如何选型,可参考 数据库官方工具与第三方工具如何选择?
CloudCanal 任务组:数据并行迁移同步
在解决大规模数据迁移慢的问题上,数据迁移同步工具 CloudCanal 提供了一个非常实用的能力:任务组,帮助开发人员有组织、有节奏地管理多个并发数据流:
自动拆分任务
当任务加入并行组时,系统会自动为其分配一个序号。任务运行时,系统会基于 Hash(主键) mod 并行度 == 当前任务序号 的条件自动进行数据过滤。
并行迁移
任务组内各任务并行执行,仅消费各自所属部分的数据,提升迁移同步性能。个别任务失败不会影响整个组,便于局部重试。
统一监控与追踪
任务组作为一个逻辑单元,迁移过程更透明、状态更清晰,方便统一展示、统一控制。
为验证并行任务组对数据迁移性能的提升,我们进行了一次性能对比测试,数据链路为 MySQL -> MySQL,具体结果如下:
任务类型
单任务运行
4 个任务并行
任务规格
4GB
4GB
待消费数据 (条)
1000w
1000w
完成时间 (估计值 秒)
330 s
180 s
200 s
195 s
230 s
RPS (最大)
43.00 k
15.52 k
13.99 k
14.34 k
14.52 k
RPS (平均)
40.70 k
14.49 k
13.21 k
13.49 k
14.20 k
注:因绝对迁移速度和数据大小、迁移机器、数据库性能等相关,此表数据不表示其绝对性能,只作为两种方式对比参考。
由上表可见,全量任务下 4 个任务并行,约能够带来 30 % 的性能提升。但由于并行任务下每批量能够拉取的数据减少,性能提升并非线性。
总结
数据迁移看似简单,但在规模巨大、时间有限的条件下,难度会大幅度上升,选择合适的处理策略和技术,辅助工具使用以提升目标达成率。
最后如果你正面对此类场景,不妨试试 CloudCanal 任务组能力,相信对你的工作会有所帮助。