先定义一个迁移场景

众所周知,腾讯跟阿里每年都会投资一批他们看好的公司。另外,国内云服务市场。假设你们的公司恰好被阿里投资了,但是你们公司使用的却是腾讯的产品,那就尴尬了,所以这时候,明白人就知道把数据从腾讯云迁移到阿里云了。那么如何把数据迁移呢?本文以将数据库和接口从OLD云迁移到NEW云为例讲解。

数据迁移的目标

数据不丢失:OLD云的存量数据(双写之前的数据)和增量数据(双写之后的数据)迁移到NEW云的时候不应该丢失。
可回滚:如果NEW云出了问题,数据库和接口可以快速切回原来的OLD云。
数据写入不停机:迁移过程应该平缓的从OLD云到NEW云,迁移过程应该如德芙般丝滑。不过,真的有那么丝滑吗?

数据迁移思路

A.发公告:我们要在凌晨01:00-06:00更新啦,各位用户这个时候不要用,然后这段时间让程序员做数据迁移,然后将服务的数据库配置修改,以及将旧接口修改成新的接口等工作。
B.上面这种方法不够可控,如果期间出了不可解决的bug,很难去很好的fix,为了更平滑的实现数据迁移,我们可以用双写的思想:

1.先将数据库和服务(接口)部署在新的NEW云
2.确定某个时间节点开始双写
3.新产生的数据在OLD云和NEW云都写一份
4.将OLD云之前的数据迁移到NEW云的数据库
5.在满足前面提到的三个目标后彻底转移到NEW云

实现

根据以上思路,具体实现过程为:

1.选定一个确定的时间戳:数据也写入NEW云的时候
2.时间戳之后所有的读是读OLD云,写是同时写入OLD云和NEW云
3.用数据库同步工具将时间戳之前的数据写入NEW云
4.确认第三步写入成功后,读改为读NEW云,写还是写双份
5.运行一段时间发现没问题的时候,全部使用NEW云即可

迁移中需要注意的问题

上面的方案是迁移的框架,实际迁移过程中有很多问题需要思考,这里抛出几个我的思考给大家,欢迎大家在评论区给出解决方案。

1.上面只考虑到读写的情况,那么如果老表的数据有可能更新,时间戳之前的老数据放到新表的时候数据不一致怎么处理?
2.如果数据库采用分库分表的设计,需要因此做什么保证数据的一致性吗?
3.如果数据写入OLD云成功了,写入NEW云失败了,该怎么处理?
4.如果数据写入OLD云失败了,写入NEW云成功了,该怎么处理?