数据迁移方案

迁移目标

  • 迁移应该是在线的迁移,也就是在迁移的同时还会有数据的写入;
  • 数据应该保证完整性,也就是说在迁移之后需要保证新的库和旧的库的数据是一致的;
  • 迁移的过程需要做到可以回滚,这样一旦迁移的过程中出现问题,可以立刻回滚到源库不会对系统的可用性造成影响。

单库到单库的迁移(简单方案)

可以通过MySQL 主从同步的方式做到准实时的数据拷贝;也可以通过mysqldump工具将源库的数据导出再导入到新库

“双写”方案

  1. 将新的库配置为源库的从库用来同步数据;如果需要将数据同步到多库多表,那么可以使用一些第三方工具获取Binlog的增量日志(比如开源工具Canal),在获取增量日志之后就可以按照分库分表的逻辑写入到新的库表中了。
  2. 同时我们需要改造业务代码,在数据写入的时候不仅要写入旧库也要写入新库。当然,基于性能的考虑,我们可以异步地写入新库,只要保证旧库写入成功即可。但是我们需要注意的是,需要将写入新库失败的数据记录在单独的日志中,这样方便后续对这些数据补写,保证新库和旧库的数据一致性。
  3. 然后我们就可以开始校验数据了。由于数据库中数据量很大,做全量的数据校验不太现实。你可以抽取部分数据,具体数据量依据总体数据量而定,只要保证这些数据是一致的就可以。
  4. 如果一切顺利,我们就可以将读流量切换到新库了。由于担心一次切换全量读流量可能会对系统产生未知的影响,所以这里最好采用灰度的方式来切换,比如开始切换10%的流量,如果没有问题再切换到50%的流量,最后再切换到100%。
  5. 由于有双写的存在,所以在切换的过程中出现任何的问题都可以将读写流量随时切换到旧库去,保障系统的性能。
  6. 在观察了几天发现数据的迁移没有问题之后,就可以将数据库的双写改造成只写新库,数据的迁移也就完成了。

这种方式的好处是:迁移的过程可以随时回滚,将迁移的风险降到了最低。劣势是:时间周期比较长,应用有改造的成本。

级联同步方案

  1. 先将新库配置为旧库的从库,用作数据同步;
  2. 再将一个备库配置为新库的从库,用作数据的备份;
  3. 等到三个库的写入一致后,将数据库的读流量切换到新库;
  4. 然后暂停应用的写入,将业务的写入流量切换到新库(由于这里需要暂停应用的写入,所以需要安排在业务的低峰期)。

这种方案优势是简单易实施,在业务上基本没有改造的成本;缺点是在切写的时候需要短暂的停止写入,对于业务来说是有损的,不过如果在业务低峰期来执行切写,可以将对业务的影响降至最低。

数据迁移时如何预热缓存

  1. 在云上部署多组mc的副本组,自建机房在接收到写入请求时,会优先写入自建机房的缓存节点,异步写入云上部署的mc节点;
  2. 在处理自建机房的读请求时,会指定一定的流量(比如10%)优先走云上的缓存节点,这样虽然也会走专线穿透回自建机房的缓存节点,但是流量是可控的;
  3. 当云上缓存节点的命中率达到90%以上时,就可以在云上部署应用服务器,让云上的应用服务器完全走云上的缓存节点就可以了。
    1730028827452.png