背景
为了满足业务快速发展,基于业务特性需选择合适的数据库,就诞生了数据库迁移需求,为了不重复造轮子,小编查阅了阿里云数据传输服务DTS,但不满足小编的需求源为SQLServer目标为Mysql不同类型数据库之间迁移,于是小编就要自己设计来满足需求。
需求设计目标
1、大表数据迁移要有足够高的效率;
2、数据变更同步的实时性;
3、保证对业务的无侵入性;
4、拒绝业务停机维护且用户使用过程中无感知;
方案
1、为了保证数据变更同步实时性及业务无侵入性,就要基于数据库操作日志进行数据同步,通过SQLServer的cdc进行操作日志抓取,开启cdc的源表在插入、更新和删除活动时会插入数据到日志表中,cdc通过捕获进程将变更数据捕获到变更表中,通过cdc提供的查询函数,可以捕获这部分数据;
当数据库使用内存表时,无法使用cdc;
开启CDC时为了保证业务无影响,建议对操作数据库做集群处理,主库开启cdc,从库对数据进行抽取;
2、数据表变更操作数据捕获到之后,将数据实时推送到kafka,消费者订阅对应的topic,对消息日志进行解析,识别相应的操作命令还原到对应目标库;
3、针对大表数据迁移效率问题,基于kafka启动多个消费者对进行日志解析,基于业务Id进行hash取模操作,每个消费者只对自己取模可处理的业务进行操作处理,否则进行丢弃,提高吞吐量的同时保证了同一数据的多个变更操作始终落在同一个消费者上顺序执行;
实践方案
1、业务系统低峰期,基于业务表特性选择迁移方式为全量抽取还是增量抽取;
2、如果主键Id是自增,获取源表最大主键Id,基于业务特性设置目标表的主键Id开始值,解决迁移过程中发布时间差问题,导致数据同步时主键冲突问题;
3、数据迁移完毕切应用数据源全部切换到目标库时核对数据正确性,注意,要仔细核对迁移过程发生的数据变更数据尤为重要核对;
总结
该数据迁移方法,不仅能解决数据实时变更同步问题,还可对大数据表快速迁移,迁移过程中用户无感知,系统无需停机。
目前数据迁移的实践只是解决了数据简单的单向同步,对于迁移过程中如果要对数据进行回滚操作,数据对源表数据回滚就尤为困难,后续目标可对数据进行双写同步,源、目标库可随时切换数据高度吻合。