双读和双写的数据库迁移方案

两种不停机的数据库迁移的方案

我们在工作中可能会遇到业务升级或者是数据库存储更换选型或者其他的需要做数据迁移的需求

有可能是从oracle更换到mysql这种异构数据的迁移或者是从mysql5.7升级到mysql8这种大版本数据的迁移

这种时候我们就需要一套数据库迁移的方案

我们希望

  1. 不能丢数据
  2. 尽量不影响业务

停机重启方案

最简单的方案就是对数据库停机, 然后copy旧数据到新的数据库

这种数据同步方案非常简单,但是有个致命的问题就是业务要中断,所以肯定会被否掉

不停机方案

双写机制

这种方案过程如下

  1. 先改造我们的数据写入端, 使数据同时写入旧数据库和新数据库
  2. 对存量数据进行不停机的迁移
  3. 等到双写服务运行一段时间,再次进行旧数据和新数据的完全同步
  4. 完全切换读取的数据源为新数据库, 关闭旧数据库的写入和读取,下线旧数据库

该方案比较复杂: 适合业务要求高的事务型数据库的迁移(我们前东家在做oracle到mysql的迁移就采用类似的方案)

渐进式双读

这种方案我们采用渐进式的双读方案

  1. 所有新写入的数据都完全写到新数据库
  2. 读取程序先读新数据库,新数据库中不存在的再读取老数据库, 如果老库存在就把老的库的数据迁移到新的数据库中
  3. 等到老的数据库中数据量变为0, 或者到达一个非常低的阈值, 就进行老数据库的完全迁移和下线

该方案适合读取内容相对简单的k-v数据库之间的迁移(redis中的渐进式rehash就是采用这种机制)