概念
数据迁移是指将数据从一个计算环境或存储系统移动到另一个计算环境或存储系统。
随着公司业务的发展,出于成本优化、系统升级、分库分表、整合数据等原因。数据迁移工作在日常工作中会陆续出现。
我们可以将数据迁移分成两个部分,第一部分是数据迁移,第二部分是写入数据切换
数据迁移
这一部分我们的目标是把旧数据库的数据同步到新的数据库,并且保证在线系统新产生的数据也会实时的同步到新数据库
这里我们会遇到两种方式的选择
第一种 二阶段迁移
数据会被切分成迁移开始之前和之后两份数据
迁移开始之前的数据我们通常会用批量select和insert的方式同步到新数据库
迁移开始之后的数据,通过读取迁移开始之后binlog的方式同步到新数据库
当同步的数据量特别大的时候,我们需要注意一个问题binlog是会设置保存时长的。当数据量很大的时候,会存在当第一阶段耗时很长,当第二阶段开始时,binlog的数据已经开始出现失效的情况
第二种 实时迁移
在这种方式中数据也会分成迁移开始之前和之后两份数据
不过在迁移中两份数据不会分成先后导入到新数据库,会按照批次将两份数据按照先后进行合并,再导入到新数据库
虽然解决了第一种方式binlog失效的问题,但是由于加了合并的动作,写入的效率并没有第一种方式高
写入数据切换
当数据迁移完成后,我们将进入数据迁移的第二个部分
我们立即会想到的就是找个业务低峰期直接将写入服务从老数据切换到新数据库
即使是单节点的服务,在重启时也是会有可能存在新的数据开始写入新的数据库之后任然有老数据库同步过来的数据,这时自增id就会出现异常。
所以最安全的操作就是服务停机,等待新库确认已经同步了老库的所有数据记录,再重新开启服务,写入新库
由于业务复杂性、业务量的增加,停服对许多业务来说是尽量避免的,那我们就没有不停服写入数据的办法吗
双写
通常我们可以使用双写的方式来实现这个切换
但是这个方式对代码的入侵性和开发复杂度也是巨大的
代理方式
通过设计代理模式,接管新旧数据库的切换工作,在服务内集成了数据比对和切换的工作,保证在不停机的情况下,安全的进行迁移数据切换
总结
考虑到不同服务业务需求。我们觉得如果服务存在停机的可能性,停机迁移肯定是最最安全的方式。如果在不能停服的前提下,少量表的迁移,双写是不错的方式。如果不停服,并且全表迁移,代理方式是更合适的方式。