旧数据与新系统 —— 重现数据迁移之旅

news2024/11/27 0:29:20

某天,正做卡呢。突然收到客户通知:不用做了,这系统不要了。

啊? 都搞了好几年,说不要就不要了,客户这么财大气粗?

细问之下,原来变化来源于最新的商业决策——客户收购了一个市场占有率比较大的新公司,打算直接使用新公司已有的系统。那我们是不是可以下项目休息了?曹老大瞟了一眼我:你想得美。客户希望把现有的生产数据迁出到新系统去。不是吧,又迁,咱们不是刚把之前收购的老系统数据迁到新开发的系统吗?

模型分析

前方目标很明确:数据迁移,让数据的价值在新系统中继续发光发热。

新老系统由于只是同一个领域的不同实现,所以模型上很相似。主要的源数据模型都能映射到目标模型,模型上的部分字段甚至也是等价的概念。但是毕竟是两波开发实现的两个不同的系统,很多业务概念叫法完全不同,首先就需要坐下来跟客户一起统一模型语言。另外,还有很多新系统的目标字段不能由源数据直接获得,有的字段甚至无法获得。所以,我们根据不同类型的数据特征,将数据分成了4种类型:

  • 直接映射,源数据模型的字段值直接映射为目标数据模型的字段值。
  • 间接映射,源数据模型的一个或多个字段值经过一定的业务规则转换为目标数据模型的字段值。
  • 默认值,源数据模型没有相关的字段,而目标数据模型又是必填的字段值。
  • 丢弃,源数据模型没有相关的字段,而目标数据模型也不是必填的字段值。

根据这四类规则,在和客户友(lai)好(hui)讨(la)论(che)了多轮之后,我们得到了一个数据映射表,将所有需要迁移的源数据模型映射为目标数据模型。

迁移策略

数据清楚了就开搞吧!等等,客户对迁移又提了几个新需求:

  • 新系统的数据加载部分想复用已经写好的脚本,脚本的输入是json文件,所以希望使用json文件作为介质将老系统的数据传输到新系统。
  • 在数据还没全部迁到新系统之前,两个系统同时都要用,因为客户需要在用户慢慢熟悉新系统的同时,使用老系统保证业务连贯性。

这意味着两件事:老系统在几个月内还会源源不断的产生新数据;新系统需要在一定的时间段内看到老系统新产生的数据。这样的状况可能要持续很久,直到客户喊停才能停。于是,迁移可能会变成这样。

根据数据量的不同,我们把迁移又分成了全量迁移和增量迁移。

全量迁移关注的是如何把大批的数据一次性迁入到新系统,由于数据量较大,文件需要进行分片处理。增量数据则关注的是如何保证数据实时性,在客户能够容忍的时间范围内,将增量数据同步到新系统。客户对实时性要求并不高(一天之内),而且也不希望在新系统上新增API去做实时同步,所以定时任务已经能够满足增量数据同步的要求。

数据实体间存在单向依赖,希望按照依赖关系分批进行迁移,简化的说明图如下:

对于增量数据,也需要考虑根据依赖关系,调整定时任务的实体同步顺序。

实现

其实整个迁移过程看起来就是一个经典的ETL过程,先将源数据从老系统提取(E)出来,根据数据映射表进行转换(T),最后通过生成文件并加载(L)到新系统中。但在实现过程中还是遇到了不少麻烦。

1.AWS to GCP

这是我们在设计阶段遇到的第一个大麻烦,老系统运行在AWS环境,而新系统运行在GCP环境。云迁移的案例在网上搜集相关资料比较少。Spike了几轮之后,处于安全性,效率等因素考虑,我们决定使用GCP的Workload identity federation(WIF)进行云平台间数据迁移。WIF是GCP提供的外部服务访问GCP资源的服务,它旨在消除与服务帐号密钥相关的维护和安全负担。WIF遵循OAuth 2.0 令牌交换规范,令牌交换的主要过程大致为:

  • 获取AWS GetCallerIdentity token
  • 使用AWS GetCallerIdentity token交换GCP federated access token
  • 使用GCP federated access token交换GCP service account access token
  • 使用GCP service account access token访问GCP资源

在我们的项目场景中,由AWS lambda与GCP Security Token Service及Cloud IAM交互完成短期token的获取,并持有短期token执行将S3中的文件存入Cloud storage的过程。

2.数据安全

数据本身全是跟钱相关的东西,文件又需要走公网从AWS传输到GCP,所以数据安全也是需要重点考虑的环节。虽然GCP本身已经提供了一定等级的数据加密,但是客户还是不放心,希望我们在应用程序本身再提供一层数据安全的保障。于是根据数据安全经典过程,我们在AWS发送文件前对文件做了加密及签名,并在GCP收到后文件完成解密及验证。加密为了保证数据不被中间人窃取,签名为了防止恶意传输攻击文件:

3.数据合并

前文提过,由于历史原因,老系统当前的数据其实也是从更老的系统中迁移过来了(更老的系统实际也还在使用中),老系统当前对外提供的API存在着大量的数据合并逻辑。如果以数据库为源头对涉及数据合并的实体进行迁移,那么就需要大量重写这部分业务逻辑,而这将会是个漫长而又复杂的过程。如果直接使用当前系统的API,由于迁移访问的数据量很大,又会对线上业务造成影响。

于是我们采取了一个折中的办法,在生产环境中复制了一个只读实例来规避对数据合并逻辑的重复工作,并且不影响线上环境的实例性能。

4.增量数据统计

对于迁移期间的增量数据,我们采用事件驱动的方式,通过监听源数据库的新增或修改,并触发lambda执行转换过程,将转换后的数据存入中间表并记录修改时间。在每天生成增量数据文件时,通过查询所有比上次迁移时间晚的记录,得到所有增量数据并最终生成本次文件。

5.数据校验

在生成文件的过程中,我们会对实体的各个字段根据业务规则进行校验,对不符合校验规则的数据将其原始数据及错误原因收集到错误日志表中,方便我们后续修数据的环节。我们的测试环境虽然有一部分数据也来自生产环境,但出于安全原因,大部分字段都做过混淆。所以在测试环境无法收集到所有真实数据的错误,很难保证迁移的最终结果。

于是在上线前的一两个迭代内我们做的事情是,在生产环境中进行若干轮预迁移(但不执行加载)。这样每一轮预迁移会收集到一部分数据错误。这些数据错误大部分需要与客户讨论后进行处理,主要处理方式有:

  • 数据本身输入不合法,需要客户确定正确的值并修复
  • 数据本身输入合法,根据新系统的表现形式,重新确定转换逻辑给予合法值
  • 数据无法修复且不重要,丢弃

这样在经过多轮预迁移以后,我们修复了所有生产环境上的错误,从而保证了最终迁移到新系统的数据质量。

6.数据审计与错误追溯

在做完数据迁移之后,我们需要进行数据审计及错误追溯,以保证迁移过程没有丢失数据。在第一批数据迁移完成后,QA同学经常抱怨说现在对数据审计及错误追溯非常不友好。原因是我们对第一批数据迁移的设计是,源数据转换后直接生成目标文件。这导致进行审计以及出错排查的时候,需要对文件直接进行分析。而分析文件有两个非常不方便的点:

  • 生产环境不允许下载文件,只得在生产环境上搭建用于审计及错误排查的脚本运行环境
  • 即使是测试环境允许下载文件,有些实体数据量非常大,文件无法直接打开,还是得写脚本进行分析

为了解决这个痛点,从第二批数据迁移开始,我们首先将转换后的数据存入中间表,这样也就对迁移过程做了一次解耦。事实证明解耦后我们对数据库直接进行计数对及查询,对数据审计及错误排查的效率有非常大的提升。

收获

  • 数据迁移过程涉及在三个系统之间传输数据。以及AWS到GCP的云平台间的迁移,在这个复杂的过程遇到了大大小小数不尽的坑,也顺势学到了很多东西。
  • 迁移并不是一锤子买卖,为了确保用户的无缝过渡,在迁移过程中保证多个系统的可用性及系统间的数据一致性也非常重要。
  • 实体间依赖对迁移计划影响很大。在迁移过程中,需要建立了依赖映射并监控了每个实体的迁移历史,以检查每个记录的实体关系/依赖关系。每当出现错误时,无效数据和依赖于无效数据的数据将被过滤掉,以确保整个迁移过程能够继续进行。
  • 保持数据可追溯性是迁移过程的关键方面。通过确保所有数据都可以追溯到其来源,可以帮助最大限度地减少数据丢失或损坏的风险,并确保在整个迁移过程中数据的准确性和完整性
  • 为确保成功的迁移,需要对复杂的业务逻辑进行彻底分析,并确定在过程中可能出现的任何潜在问题。这包括将所有必要的字段映射到新系统,并解决源数据中可能存在的任何数据质量问题。
  • 为了确保迁移过程中数据的质量,重要的是制定一个测试策略,并由团队中的每个人进行审查和维护。迁移的验证过程需要充分考虑数据完整性和无数据丢失,并确保在迁移后满足所有指定的功能和非功能方面的要求。   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JSP的社区疫情防控管理信息系统

你好,我是专注于计算机技术研究的学姐。如果你对社区疫情防控管理信息系统感兴趣或有相关需求,欢迎私信交流。 开发语言:Java 数据库:MySQL 技术:JSPJavaBeansServlet 工具:MyEclipse, Tomcat 系统展示…

仅12%程序员担心被AI取代 62%开发者在使用AI工具

**根据Stack Overflow近日发布的2024年开发者调查报告,只有12%的开发者认为AI威胁到了他们当前的工作,而高达70%的受访者已经将AI工具整合到了自己的工作流程中。**该调查共有超过6.5万名开发者参与,结果显示,使用AI工具的开发者比…

USBCAN-II/II+使用方法以及qt操作介绍

一.USBCAN-II/II介绍 USBCAN-II/II 是一款常用的 USB-CAN 转换器,广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法: 1. 硬件连接 连接设备:将 USBCAN-II/II 的 USB 接口连接到计算机的 USB 端口。 连接 CAN 网络…

多功能声学气膜馆:解决城市噪音难题的标杆建筑—轻空间

在现代城市中,噪音污染已成为一个普遍存在且难以解决的问题。随着城市人口的增加和交通的繁忙,如何为市民提供一个安静、舒适的活动空间,成为城市规划者和建筑设计师亟待解决的挑战。多功能声学气膜馆,作为一种创新的建筑形式&…

只有IP如何实现https访问

IP也是访问网站的一种方式,现在有很多网站并未绑定域名,而是通过IP直接访问的。 但是域名访问网站的方式会更多一些,主要还是因为域名相较于IP数字要更加好记,所以域名绑定网站的情况会更多。 随着现在网络安全意识的逐渐提升&a…

Android MediaRecorder 视频录制及报错解决

目录 一、start failed: -19 二、使用MediaRecorder录制视频 2.1 申请权限 2.2 布局文件 2.3 MediaRecordActivity 2.4 运行结果 三、拓展 3.1 录制视频模糊(解决) 3.2 阿里云OSS上传文件 3.2.1 权限(刚需) 3.2.2 安装SDK 3.2.3 使用 相关链接 一、start failed…

[每周一更]-(第110期):QT开发最佳实战(php/go/python/javascript)

文章目录 1. 使用 Go 开发 Qt 应用工具:therecipe/qt安装和配置示例代码 2. 使用 Python 开发 Qt 应用工具:PyQt 或 PySide安装和配置示例代码(PyQt5) 3. 使用 PHP 开发 Qt 应用工具:PHP-Qt安装和配置示例代码 4. 使用…

VLL基本原理

VLL的基本架构 VLL技术通过隧道承载CE(Customer Edge)端的各种二层业务,透明传递CE端的二层数据,为用户提供点对点的二层VPN服务。 VLL的基本架构可以分为AC、VC和Tunnel三个部分,而PW这个概念也会经常用到。如图1所…

工控接入网关:实现工业物联网的关键技术

工业控制系统随着科技的发展,逐渐向数字化、智能化的方向发展。工控接入网关作为工业物联网的关键技术之一,具有重要的作用和意义。本文将从工控接入网关的定义、功能、应用、优势等方面进行全面详细地介绍。    一、工控接入网关的定义与功能 工控接…

新零售社交电商系统前景分析

新零售社交电商系统前景分析 新零售社交电商系统作为数字经济的创新趋势之一,展现出强大的市场活力和发展潜力。 以下是对其前景的分析: 市场规模的增长:中国社交电商的交易规模在2021年达到了23785.7亿元,并预计在2023年将增长…

面了拼多多算法岗,被疯狂拷打。。。

暑期实习基本结束了,校招即将开启。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑&…

8-4 循环神经网络

对于 (8.4.2)中的函数 f f f,隐变量模型不是近似值。 毕竟 h t h_{t} ht​是可以仅仅存储到目前为止观察到的所有数据, 然而这样的操作可能会使计算和存储的代价都变得昂贵。 回想一下,我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的…

VS Code安装配置ssh服务结合内网穿透远程连接本地服务器详细步骤

文章目录 前言1. 安装OpenSSH2.VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

Windows系统开机出现Minimal BASH-like line editingis supported解决方法

Minimal BASH-like line editingis supported解决方法 一、问题描述 因为电脑不知道是不是安装了双系统,开机的时候会出现标题中的这个问题,网上查找资料一般说是双系统的问题,引导项缺失,然后Ubuntu进不去。可是我的电脑好像没有…

LR12 在Controller设置脚本并运行

1、当在Generator配置脚本完成后,点击工具-创建Controller场景,输入线程数即Vuser后点击确定。 2、这时会Controller中打开刚才配置的脚本,显示如下图所示, 在全局计划中点击启动Vuser,界面会显示如下弹窗,设置并发用户…

NTP时间服务器的工作原理解析

在当今数字化和信息化高度发展的时代,时间的准确性和同步性对于各种系统和应用程序至关重要。NTP时间服务器作为确保时间精准同步的关键设备,发挥着不可或缺的作用。 NTP 时间服务器的核心目标是为网络中的设备提供准确、一致和可靠的时间信息。它基于一…

RK3576 芯片介绍

RK3576 芯片介绍 RK3576瑞芯微第二代8nm高性能AIOT平台,它集成了独立的6TOPS(Tera Operations Per Second,每秒万亿次操作)NPU(神经网络处理单元),用于处理人工智能相关的任务。此外&#xff0…

7.实时时钟(RTC)

理论 使用时钟晶振:32.768KHz(2{15}) 代码编写 OLED显示实时时间,串口打印 晶体、RTC配置 晶体配置 RTC配置 串口配置参考:链接 Cube IDE代码 mian.c /* USER CODE BEGIN Includes */ #include "string.h" //27行 /* USER CODE EN…

TPAMI 2024 带Token迁移的整体预训练Transformer金字塔网络——Fast-iTPN

Fast-iTPN: Integrally Pre-Trained Transformer Pyramid Network with Token Migration https://github.com/sunsmarterjie/iTPN/blob/main https://arxiv.org/pdf/2211.12735 Introduction 背景 近年来,视觉模型取得了两大进展,一是将Vision Trans…

SAP LE学习笔记03 - 在IM(在库管理)中收货到仓库的流程,关联 WM移动Type与IM移动Type

上一章讲了 LE-WM的 WM和IM之间的关系。 SAP LE学习笔记02 - WM和库存管理(IM)之间的关系,保管Lot(Quant)-CSDN博客 本章继续将LE-WM的知识。 目录 1,在IM(在库管理)中收货到仓库的流程 a)&…