序言
在微服务流行的当下,相信很多人遇到过老系统服务化的情况。服务的拆分也会涉及到数据存储的拆分,这就需要把原数据库的数据同步到新库。本文会介绍一种主流的不停机数据迁移的思路。
数据双写
数据迁移-数据双写方案.jpg原service A访问DB A的表a,现在要把涉及到表a的业务拆成Service B。不停机双写方案如下:
- service A改造服务,关于a的写(CUD)请求,同时同步给服务B。这是双写的由来。读请求还是走旧表。这里需要实现一个动态开关,控制数据的请求流向。
- CREATE 新旧表都没有数据,所以不会有问题,注意这里同步时要带旧表主键。
- DELETE 新表有数据旧表没有,旧表数据删除失败
- UPDATE相当于DELETE+CREATE
- 全量同步老表的数据到新表,出现主键冲突,以旧表数据为准。
- 循环执行数据校验脚本,发现数据不一致, 以旧表数据为准,覆盖新表数据。这一步要一行一行的比对步骤1开始之后变动的数据。
- 旧表有,新表也有,但是不一致。以旧表数据为准。
- 旧表有,新表没有,插入新表。
- 旧表没有,新表有, 删除新表。
4.数据校验不再有不一致数据时,把service A对旧表的访问切换到访问service B。不停机迁移完成
有读者可能会说以旧表为准,可能会导致旧数据覆盖新数据。确实存在这种情况,不过我们的数据校验脚本会一直执行,直到检查不到不一致数据为止,所以 数据最终会一致,而且一致前还是旧库提供服务,所以无伤大雅。
网友评论