背景
数据需要从一个库迁移到另外一个库,比如客户新买一个软件,使用的旧服务数据需要迁移到新软件内。
或者数据压力较大,需要分库分表, 数据需要迁移到新的库
方案1 双写
- 开启双写 可以在服务内增加配置,是否写新库、旧库。 迁移期间, 开启配置 当天的数据同时写入新库和旧库。历史数据不会变走迁移程序。 如果双写性能 有影响,可以通过发消息的形式,把对新库的写入改为异步操作,即使消费失败,后续也可以根据检测逻辑进行修复。
- **迁移数据 ** 编写程序 对之前加入的数据进行迁移。 (数据结构发生变化时,需要考虑转化逻辑)
- **执行检测 ** 迁移完成后,执行检测逻辑, 对比 两端数据 是否一致。 可以通过版本号对比。 对不一致的数据再次执行迁移逻辑
- 灰度验证 整体迁移完成后,提供一定数量的白名单,进行灰度验证, 一段时间后再全量放开,白名单内的人读取新库,读取步到的话转为读旧库,并记录日志,排查不一致原因。逐步解决。这个过程会消耗较长的一段时间。
- 关闭旧库读写 等灰度验证完成关闭对旧库的读写,清理旧库数据即可
方案2 主从同步 (适用于简单的迁移,数据结构不发生变化)
- 给主库挂一个从节点,通过处理日志,把数据同步到从节点,再停机,把从节点切换为主节点。
方案3 停机迁移
- 停机
- 写程序 多线程批量全部处理。
- 修改配置 读写新库即可。
- 存在问题可以回滚