背景:
业务系统切换,历史数据需要迁移到会计引擎。让用户平滑的新系统,并保证用户操作的流畅性及业务数据的完整性。
目标:
将系统相应历史数据完整迁移到新系统,并按新的数据模型建立数据之间的关系,保证用户操作的流畅性及业务数据的完整性。
过程:
两边系统表结构不同,多个表之间的数据关联关系有变化。如何实现迁移业务数据,并保证数据准确,数据之间关联关系能够准确对应上。
数据迁移方案调研:
2.1 停服迁移
停服迁移方案指的是停机变更方案,因为需要一段时间停止服务,因此对于业务是有损的;可以按照如下步骤执行:
(1)研发通过观察历史的用户流量监控,选择流量较小的时间段执行变更来尽可能减小业务影响,如凌晨4点开始运维;产品/运营同学前一天在网站或者 APP挂个公告,说次日4点到早上6点进行系统升级,无法访问;
(2)接着到凌晨4点停机,系统停掉,关闭用户流量入口,此时老数据库表不再有变更产生,属于临时静态数据;然后通过提前得写好的一个数据导出导入工具,将老数据库表的数据按序读出来,写到分库分表里面去;当然,为了提升数据导出速度,可以使用多线程分段读写数据,甚至可以联系DBA直接物理复制数据库表,然后再执行rename;
(3)数据导出之后,通过修改系统的数据库连接配置,重启服务,连到新的分库分表上去;模拟用户请求验证一下对数据的读写,这时发现如预期一样,这时打开用户流量,再观察一段时间,确认无误后,伸个懒腰回家调休;
说到停机迁移这种方案,可能有些同学觉得很low,但是实际上目前存在相当一部分迁移方案都是使用凌晨停机迁移的方式(例如有时候会看到停机维护公告),因为这种方式成本低简单粗暴、无需考虑新老库数据临界情况不一致的问题、整个迁移周期非常短不存在灰度放量与多次修改代码发布的情况,缺点就是短暂业务有损,需要DBA、研发值班。
2.2 平滑迁移
平滑迁移也叫无损迁移,服务在迁移过程中不需要停机,最多只需要短暂的重启时间,对于业务几乎没有任何影响的;双写方案,就是平滑迁移方案,简单来说,就是修改线上代码,之在前所有写老库(增删改操作)的地方,都加上对新库的增删改,这就是所谓的双写;
然后系统部署之后,由于我们只处理了某个时间节点之后的增量数据,新库数据整体数据差太远,用之前说的数据导出导入工具,跑起来读老库数据写新库,写的时候要根据类似gmt_modified字段判断这条数据最后修改的时间,除非是读出来的数据在新库里没有,或者是比新库的数据新才会写,简单来说,就是不允许用老数据覆盖新数据,新库的数据总是最新的;
导完一轮之后,有可能数据还是存在不一致,保险起见,通过定时任务做多轮新老库的数据校验,比对新老库每个表的每条数据,接着如果有不一样的,按照以最新数据为准的原则,重新从老库读数据再次写新库,直到两个库的数据追平,完全一致为止;
接着当数据完全一致了,切换为仅读写新库的代码,重新部署服务,重新部署后,数据的读写全部都落在新库中;求稳起见,这一阶段往往建议通过灰度策略,把用户的流量(仅读写新库)慢慢的切换到新库里,注意灰度的用户放量只能逐渐加大,不能回滚,因为灰度命中的用户数据都落在了新库,而老库没有;最终放量100%,迁移完成;
相对有损迁移方案,这种平滑迁移方案无需长达几个小时的停机时间,对业务的影响几乎没有,对停服非常敏感的业务建议采用这种方案。
2.3 实施落地
综合考虑财务业务特性和两种方案实施成本,最终选择第一种,停服迁移方案。理由如下:
一、目前财务系统使用高峰在月底与月初,财务同学月结算时,平时流量较小;
二、双写平滑迁移迁移方案成本大大高于停服迁移方案,需要EBS系统改造。
具体方案
会计引擎迁移服务业务
迁移代码UML示意
迁移过程踩坑
- 与外部服务连接不可靠
与EBS系统oracle数据库连接、与mongDB数据库连接在数据迁移中,在大数据量,高并发场景下,时常会有连接失败情况发生;
- 数据处理并发与可重试
基于1:与外部服务连接不可靠,系统本身需要支持可重试;迁移数据处理过程中包含有金额的计算逻辑,某些业务需要考虑计算的并发问题;
- 迁移数据精准快速删除
基于2,或某些预料之外的因素,需要重新迁移数据。因为引擎系统还包含对公数据之外的其他业务数据,根据情况选择重试或者删除对公业务数据,重新迁移。
结果:
经过在pre环境多次测试,以及在prd环境演练一次之后,在11月7日顺利完成数据迁移以及系统切换。数据对比之后,确认数据迁移完整准确。
复盘:
做的好的
-
在pre环境多次测试演练发现问题,迭代迁移方案细节
-
利用现有业务报表比对数据,提高了数据比对效率
不好的
- 数据迁移功能未实现工具化
改进及拓展
数据迁移工具化
数据迁移工作在很多业务的发展中,都会遇到,数据迁移的框架都是大同小异。所以,将数据迁移功能工具化,可以提高整体的工作效率,让业务更专注于业务正确性,可以减少数据迁移过程中出错的概率,减少业务损失。
参考文章