不停机数据迁移方案

序言 在微服务流行的当下,相信很多人遇到过老系统服务化的情况。服务的拆分也会涉及到数据存储的拆分,这就需要把原数据库的数据同步到新库。本文会介绍一种主流的不停机数据迁移的思路。
数据双写 不停机数据迁移方案
文章图片
数据迁移-数据双写方案.jpg
原service A访问DB A的表a,现在要把涉及到表a的业务拆成Service B。不停机双写方案如下:

  1. service A改造服务,关于a的写(CUD)请求,同时同步给服务B。这是双写的由来。读请求还是走旧表。这里需要实现一个动态开关,控制数据的请求流向。
    • CREATE 新旧表都没有数据,所以不会有问题,注意这里同步时要带旧表主键。
    • DELETE 新表有数据旧表没有,旧表数据删除失败
    • UPDATE相当于DELETE+CREATE
  2. 全量同步老表的数据到新表,出现主键冲突,以旧表数据为准。
  3. 循环执行数据校验脚本,发现数据不一致, 以旧表数据为准,覆盖新表数据。这一步要一行一行的比对步骤1开始之后变动的数据。
    • 旧表有,新表也有,但是不一致。以旧表数据为准。
    • 旧表有,新表没有,插入新表。(实际不存在这种情况)
    • 旧表没有,新表有, 删除新表。
4.数据校验不再有不一致数据时,把service A对旧表的访问切换到访问service B。不停机迁移完成
【不停机数据迁移方案】有读者可能会说以旧表为准,可能会导致旧数据覆盖新数据。确实存在这种情况,不过我们的数据校验脚本会一直执行,直到检查不到不一致数据为止,所以 数据最终会一致,而且一致前还是旧库提供服务,所以无伤大雅。

    推荐阅读