如何做好大型遗留系统的数据迁移 - Thoughtworks洞见

标签: | 发表时间:2021-08-20 23:03 | 作者:
出处:https://insights.thoughtworks.cn

历史悠久的大型企业,都会存在遗留系统。这些系统运转着重要的业务,但使用到的技术已经跟不上时代潮流。因此有着维护成本高、难以扩展、用户体验差等缺陷。最终,企业一定会下决心开发一套全新的系统来替代遗留系统。除了完成新系统的开发,还有一项重要的工作,是将老系统中存留的数据迁移进新系统,也就是我们常说的数据迁移。

如果你没有数据迁移的经验,很容易低估其难度。数据迁移看起来只是把数据从一个 DB 转移到另外一个 DB,select + insert + 转换逻辑就可以轻松搞定。如果带着这个想法开始数据迁移项目,你的团队很快就会坠入深渊,举步维艰。

数据迁移是一项看似简单,实而复杂且繁琐的工作,想要做好并不容易。

为什么数据迁移项目难做

不久前,我刚刚完成一次数据迁移项目。虽然项目结果很成功,但过程中遇到很多开始之初没有想到的问题,导致项目过程非常痛苦。如果在项目开始时就把这些问题考虑进来,过程会轻松很多,风险也会小很多。下面我们来看看数据迁移项目所面临的挑战有哪些。

陌生的遗留系统 DB 设计

作为新系统的开发方,你一定熟知新系统的 DB 设计。但是遗留系统的 DB 设计想必你一定不甚了解。作为要被替换的遗留系统,其开发方肯定也不会提供技术支持。在这个情况下,如何写好迁移规则就成为了一个难题。

古老的遗留系统数据库

新系统一般都会采用当前主流的数据库,例如 MySQL、Oracle 等。但遗留系统可能采用的是几十年前古老的技术,数据库的名字你可能听都没听过。这时候不会有任何 ETL 工具可以使用,甚至于没有主流语言的客户端类库可以使用。如何连接老系统的 DB,查询出里面的数据都会是一个难题。

迁移海量数据量

遗留系统经过几年甚至几十年的使用,累积了海量的数据。业务一般不会轻易放弃这些数据。同时,在上线的窗口期内,留给数据迁移的时间也就短短几个小时。如何在短时间内导入海量的数据,将会是很大的挑战!

错误数据如何处理

新老系统在业务处理上肯定会有差异,此外老系统的数据也会有质量问题。这会导致有一部分数据无法进入新系统。业务人员总是希望能够导入更多的数据到新系统。一个选择是放松校验,但低质量的数据进入新系统会造成很多问题。另外一个选择是让业务人员在老系统中修复数据。但很多问题数据无法通过界面修改。如何权衡数据的迁移准入标准也将是一个挑战。否则迁移成功率上来了,但上线后会陷入无止境的修数据工作中。

业务部门过高的预期

业务部门往往对数据迁移抱有不切实际的幻想,例如非常高的导入成功率及导入速度。如何采用有效的策略让业务部门降低预期,是数据迁移项目组要认真思考的问题。否则团队的辛苦付出不被认可,对团队伤害极大。

数据迁移程序如何兼容业务系统的改动

迫于上线时间点的压力,往往数据迁移程序开发的同时,业务系统也还在开发中。如何做到兼容业务系统的变化,是一个难题。处理不好这个问题,会导致数据按照错误的逻辑导入,甚至可能遗漏新的字段。

要开发的远不止数据迁移程序

数据迁移项目中除了开发迁移的主程序,还需要开发很多辅助的工具。比如成功率报表工具、错误日志分析工具、数据删除工具、环境检查工具等。这些工具都是数据迁移过程中必不可少的。如果项目估算时忽略了这些工作量,会造成严重的资源紧张。

较高的技术和工具门槛

数据迁移使用的技术和工具不同于业务开发,均有一定门槛。如果项目中期遇到进度吃紧,需要增加资源,往往很难短时间找到合适的资源。最终可能妥协让没有经验的工程师上项目。这些工程师如何快速掌握所需技能,加速融入团队是项目组需要提前考虑的事情。如果处理不好,会造成新人没有产出,只能依赖项目已有人员加班赶工,使得整个团队陷入疲惫不堪的状态。

做好数据迁移,就这些事

看完上面数据迁移过程中的各种问题,是不是觉得很头疼?没关系,办法总比困难多。根据经验,我提炼出如下几件数据迁移要关注的事情。

Mapping rule(映射规则) 管理

Mapping rule是数据迁移的需求。写好 mapping rule 需要既熟悉新系统,又熟悉老系统。并且还要熟悉数据库设计。一个人能同时做到新老系统都熟悉几乎不可能。一般来说需要新老系统各出一位熟悉系统的成员,一起讨论 mapping rule。
建议参与 mapping rule 讨论和制定的是开发成员。因为此人不仅需要熟悉业务,还需要熟悉数据如何存储。
Mapping rule 还需要明确迁移的数据范围。哪些业务数据需要迁移,迁移多久的数据都需要明确。
Mapping rule 制定完成后,要和业务部门澄清确认。并且告知成功率不可能100%,尽量降低业务的预期。
对 Mapping rule 的变更要格外小心,尤其在开发的收尾阶段,原因如下:

  1. 为了让几条报错数据进入系统而改了 mapping rule,有可能导致更多数据进不来。
  2. Mapping rule的修改很可能影响系统的性能。
    如果 mapping rule 是错误的,必须要改,那么一定注意上面的两个问题。千万不要仅仅关注 mapping rule 变更的工作量。

工具、技术培训

数据迁移一般会使用 ETL 工具,当然也可能自开发程序。迁移程序的关注点在如何高效快速的处理数据,这和业务开发关注点完全不同。因此采用的技术栈也区别很大。由于数据迁移所使用的技术在业务开发中较少使用,所以需要提前投入时间学习。并且需要制定长期的学习计划,项目开始后也要保持团队的学习和技术交流。

注意留存学习和分享的资料,未来有新人加入时,能够直接拿来学习,加速融入团队的速度。

程序设计

架构师需要先行设计好代码框架,定义好开发规范和流程,并写好样例代码。这样可以确保开发集中进项目时快速产出。程序设计要考虑如下事项:

  1. 迁移任务的记录、解耦以及依赖管理。
  2. log 设计。需要包含任务名称,错误数据业务主键子段等关键信息。总之需要方便统计和定位错误。
  3. 通过程序设计,让开发只关注业务逻辑的实现。不需要过多关注任务记录、异常处理等非功能性需求。
  4. 能够方便调节并发数等性能相关参数。
  5. 成功率统计程序设计。
  6. 错误日志分析程序设计。
  7. 其他辅助工具。
  8. 如何兼容业务系统的新变更。

重点说一下最后一点,很多时候在迁移程序开发阶段,业务系统还未开发结束。如果解决业务逻辑的改动和表变更改动对数据迁移的影响是个难题。首先业务逻辑的改动我们可以通过调业务API完成数据迁移的方式来屏蔽掉。由于不是表对表转换后直接sql写入,而是通过业务的API写入。那么当API输入有变化时,迁移程序就会报错。此外如果逻辑有调整,数据自然也会按照最新的逻辑进入的数据库。

对于新的字段和新的表,我们可以通过工具对比现有 mapping rule 的表和字段,识别出变化点,再分析是否需要增加 mapping rule 来迁移这些数据。

一定要在开发高峰到来前做好程序设计和框架代码开发。否则会让开发团队陷入泥沼,有力气使不上。
性能调优

大数量级的数据迁移,肯定会有性能的问题。数据迁移时,新老系统都不可用。因此,业务部门肯定希望数据迁移时间越短越好。这对性能是极大的挑战。关于性能优化,我有如下建议:

  1. 一定要有 APM 工具。还要有虚机、DB 等资源的监控工具。有了工具才能将性能状况透明出来。性能瓶颈在哪里一目了然,否则就是胡乱抓药。
  2. 性能要全局考虑,不要只考虑某个运算单点的性能。很多时候,性能是相互制约的。
  3. 减少网络IO的次数,让单次请求传输更多数据。但并不是越多越好,需要找到性能的平衡点。
  4. 数据量太大的话,可以分几个批次迁移,分批上线。
  5. 变化不大的非交易数据可以提前上线。甚至交易数据也可以考虑提前上线,真正上线时再做增量迁移。这种方式需要额外开发增量迁移程序。
  6. 在高并发的迁移过程中,任何关于性能的参数调整都可能有想不到的影响。要不断试验,不能想当然。

成功率及错误分析报告

没有数据迁移经验的团队很可能在项目初期遗漏掉这两部分的开发工作。数据迁移的核心关注点是迁移没错,但是业务最关心的是成功率。

这两种报告要提前设计好。迁移程序的设计和开发要考虑报表的需求来记录任务成功率和日志。否则等到程序开发完再去思考报告程序的开发,很可能会对原有迁移程序的造成比较大的返工。

这两份报告要和业务部门澄清,确定错误数据如何处理。错误数据处理一般分为如下三类:

  1. 数据问题,业务可以改数据。让业务自行修改。
  2. 数据问题,业务不能直接修改。通知业务数据无法导入,自行备份。
  3. Mapping rule 未考虑的场景。修改 Mapping rule 来适配这些数据。

除了这两个报告,迁移过程中需要开发很多小工具,比如数据清理、环境状态检查工具等等。对这些工具的开发工作量要有预期。

上线演练

上线前如果有条件,一定要使用真实环境和数据进行演练。演练的时间和执行步骤也尽量和上线计划一致。

上线演练的不能过早进行,否则会造成演练的数据和上线时差异过大,减弱了演练的效果。但演练的时间也不能过晚,否则发现问题没有时间解决。我的经验是上线前两周进行演练。

由于演练的时间点已经比较接近上线时间,除非发现严重 bug 才做修改。小问题宁可带着上线,以后再修数。此时千万不要轻易修改代码,因为很可能会引起其它 bug 或者性能问题。

上线失败方案

虽然你经历的上线可能从来没有失败过,但不要以为这一次也一定会成功。如果出现问题,全部回滚还是部分回滚,都要提前计划好。先上线后面再补历史数据是一种方案。直接终止上线,再次开启老系统也是一种方案。不管什么方案,都需要提前和业务沟通好。因为上线期间的时间十分宝贵。一定避免临时定方案,这会造成决策困难,甚至无人拍板。

上线

经过数轮测试和演练,终于迎来了上线,关于上线我有如下建议:

  1. 分配好资源。如果晚上通宵上线,不要全部开发都来支持上线。一定留有人手第二天线上支持。
  2. 根据上线计划,一步步小心执行,确保每个操作至少两个同事 pair 完成。
  3. 每一步操作完成都要做相应的检查。
  4. 上线前预测可能出现的异常,准备好处理方案。如果出现预料之外的错误也不要惊慌,冷静思考解决方案。

上线后的支持

我向你保证,迁移进来的数据一定会有各种各样的问题。一般来说修复数据有如下几种方式:

  1. SQL 脚本修复。适用于修复问题数据涉及的表,在同一个 DB 中,逻辑也不复杂的情况。
  2. 存储过程修复。适用于修复问题数据涉及的表,在同一个 DB 中,逻辑比较复杂的情况。存储过程的优点是不需要发布程序。缺点是不好调试和维护。
  3. 程序修复。修复问题数据需要跨 DB 时,只能通过开发程序来修复。这种场景也是最复杂的。
    无论采用哪种方式,都需要经过充分的测试。数据修复是很危险的操作,一旦程序有问题,可能会把没问题的数据修坏。此外还要测试修复程序的性能,对执行时长要有预估。最后切记修复前一定要好做数据备份。

总结

美国管理学家 哈罗德·孔茨 曾经说过:虽然计划不能完全准确地预测将来,但如果没有计划,组织地工作往往陷入盲目,或者碰运气。千万不要低估数据迁移项目的难度,参考本文内容提前做好规划,会让你的数据迁移项目有一个好的开始。

相关 [系统 数据 thoughtworks] 推荐:

如何做好大型遗留系统的数据迁移 - Thoughtworks洞见

- -
历史悠久的大型企业,都会存在遗留系统. 这些系统运转着重要的业务,但使用到的技术已经跟不上时代潮流. 因此有着维护成本高、难以扩展、用户体验差等缺陷. 最终,企业一定会下决心开发一套全新的系统来替代遗留系统. 除了完成新系统的开发,还有一项重要的工作,是将老系统中存留的数据迁移进新系统,也就是我们常说的数据迁移.

Serverless实战:打造个人阅读追踪系统 – ThoughtWorks洞见

- -
阅读习惯和个人知识管理体系. 进入互联网时代,知识的获取成本变得前所未有的低廉,但是无论再好的知识,若是没有对个人产生价值的话,那也只不过是一种信息噪音而已. 我在《个人知识管理:知识的三种形态》这篇文章中使用“材料 -> 资料 -> 知识”这样的路径来诠释信息的流通,如何方便快捷并且有效地收集材料,再将其整理转化为有价值的个人知识体系结构,在这个信息极度碎片化的时代变得尤为重要.

再见ThoughtWorks!

- lnsoso - Happy Hacking
最近的几个月时间里我的工作和生活都发生了较大的变化:因为家庭原因,我离开了生活了六年之久的北京,来到了上海和妻子团聚;同时,我也因此而离开了 ThoughtWorks ,加入了设计软件公司 Autodesk. 回首过去的几年时间,我能很清晰地感觉到自己对软件开发的认识不断地发生着有趣的变化:. 眼中只有C#/.NET/Windows,“外面"的世界.

数据仓库项目中的数据建模和ETL日志体系 - ThoughtWorks洞见

- -
对于一个软件来说,分为功能需求和跨功能需求(Cross-Functional Requirements, CFR). 功能需求,一般是我们可以看见的,就是实现了什么功能,提供了什么服务. 而跨功能需求,是隐性的,容易被忽略,通常被称为非功能需求(Non-Functional Requirements, NFR).

聊聊ThoughtWorks面试

- - 梦想风暴
最近有几篇关于科技公司面试的新闻,这篇格外受瞩目,因为竟然有公司力压Google,成了面试最难的公司,而这个公司居然是ThoughtWorks. 这个结果真的让我有些惊讶,作为一个面试过许多人的ThoughtWorker,我之前还真没想过我们的面试到底有多难. 既然有人关心ThoughtWorks面试,我就不妨在此分享一下我的“面经”.

ThoughtWorks读书雷达-编码实践篇

- - 简单文本
期望通过四分之一的读书雷达图就能将与编码实践有关的优秀书籍一网打尽,自然是不现实的打算. 因此,我们希望就我们的侧重点来推荐书籍. 对于编码实践而言,我们共同认为培养良好的编码习惯,编写整洁简单而又合理的代码,是一名好程序员的基本要求. 因此,这里我们更强调与程序员基本编码技能相关的知识. 我们并没有给出与算法直接有关的书籍,虽然我们认为算法知识同样属于编码实践的范畴,虽然我们认为诸如《计算机程序设计的艺术》、《编程珠玑》、《算法导论》之类的书籍同样很重要很优秀;然而,我们取舍再三,仍然将它们划出了读书雷达的范围.

如何快速读Paper – ThoughtWorks洞见

- -
去哪里找paper之后,大家问我的问题就常常变成了:. 如何快速阅读一篇paper并准确的提取其中有用的信息. 在本文中,我将试图为大家简要解答这个问题,争取告诉大家如何在短时间内通过阅读文献的方式了解一个新的领域. 阅读一篇paper通常见的目的有四种:. 面对一个新的领域,我要快速把握这个领域的研究方向和state-of-the-art方法,来给自己或者团队设计一个大致的技术方案.

再谈敏捷和ThoughtWorks中国咨询师

- lishali - 酷壳 - CoolShell.cn
之所以用了“再”,是因为之前的两篇文章——. 我在《那些炒作过度的技术和概念》中批评了ThoughtWorks中国咨询师的咨询方法是以一种接近于教条、炒作、洗脑和电视购物的方法(虽然我心底觉得有时候有时候更像传销),当然,批评是没有意义的,所以我也给了中国ThoughtWorks那些年轻的咨询师们一些我认为有建设性的建议.

2013年的技术趋势 — ThoughtWorks技术雷达阅读笔记

- - I am Hu Kai
边界正在变的更加模糊,传统上办公室是工作发生的地方,我们需要内部网络来登陆邮件系统,访问公司的知识库,利用电话会议系统和处于世界各地的同事交流. 随着移动设备的普及,网络速度的提升以及越来越多的内部系统被迁移到同时提供外部访问的云平台上,工作正在从办公室扩展到生活的每一处,在出租车上,我们用手机阅读和回复邮件;在机场,我们使用Goto Meeting来和各地的同事举行电话会议;在客户现场,我们用手机访问Jive.

ThoughtWorks读书雷达方法学篇-张逸

- - 人月神话的BLOG
原文: http://agiledon.github.io/blog/2013/08/06/methodologies-of-reading-radar/. 方法学(Methodology)看似与开发技能无关,常为程序员忽略. 忽略意味着未曾察觉,却不等于它的无关紧要. 我们每时每刻呼吸的空气同样会被我们忽略,但空气不重要么.