数据迁移-如何快速迁移

stonefang stonefang     2023-03-18     443

关键词:

摘要

在上一篇中我们介绍了数据迁移的套路,但是没有介绍具体的方案,这篇着重介绍下具体的数据迁移方案

一. 设计目标

设计一个数据迁移的方案,需要实现以下目标

  1. 迁移速度
    qps 需要达到1k,这样能保证1亿的数据能够在1~2天内跑完

  2. 迁移qps可控
    迁移有可能对线上服务有影响,需要可动态调整qps

  3. 数据完整,不丢失
    不能遗漏数据,虽然事后我们有数据校验的过程,但是设计数据迁移方案时,需要尽可能的包装数据不丢失。

  4. 进度可控
    迁移过程可中断,可重试。比如先迁移10分之一的数据,再继续来

二. 架构设计

数据迁移任务大致分为3个步骤,如下图所示
技术图片

因为有迁移速度的要求,我们将每个步骤进行分解,确保每个部分可以异步化,并发处理。这样可以提升速度。

遍历数据

完整遍历老的数据库。不同的数据库有不同的方法,比如对于mysql,可以利用现成的binlog,其中就有全量的数据。

对于其他数据库,通常有两种方案

  1. 单线程游标遍历
    单向遍历,这样不用进行线程之间的数据同步管理,实现比较简单。为什么不直接查数据记录呢,因为相比较于游标,查数据记录数据量比较大,网络开销大。游标一次可以拉取1000个数,而只占用很小的数据大小,然后在内存中分配。单个值获取耗时远小于1ms,所以即使是单线程,遍历数据这块的qps也能轻松达到1k以上。

同时因为是顺序遍历,所以可以保证数据不会丢。 可以可以将成功遍历完,写入到任务队列的数据记录到某个存储,比如redis中,这样可以保证游标中断,或者服务重启后,可以从这个key中继续遍历,这样就实现了迁移的可中断
2. 多线程分块遍历
需要提前对数据进行分片,保证每块不冲突。比如所有的数据是按照A~Z来分布的。那可以开26的线程,分别负责遍历A,Z。 因为不同的数据

任务队列

任务队列的要求就是高并发的写,能够支持较长时间的存储。kafka,rocketmq等消息队列都能满足,
qps都能达到万级别以上,都能满足当前方案的性能要求。

同时可以使用批量提交,来进一步提升写入速度。

写入新库

写入新库的操作不要求有顺序性,所以只要支持水平扩展即可无限提升速度。

三. 具体实现

需要结合具体的业务场景和公司已有的基础设施来选用具体的实现方案。

场景一: 数据量很少,1千万以内

杀鸡焉用牛刀,使用本地线程池来实现即可,不需要额外的任务队列。简单高效

场景二: 数据量比较大,公司里已经有离线数据处理基础设施

数据库 to kafka 组件,将数据写入到kafka,然后写处理job扔到flink中跑。

场景三: 数据量比较大,公司无基础设施

遍历老数据库, 写入到消息队列中,然后监听消息,查询数据,写入到新库中。也很容易实现。

hdfs如何实现退役节点快速下线(也就是退役节点上的数据块快速迁移)(代码片段)

/***Parsethedata-nodestheblockbelongstoandchooseone,*whichwillbethereplicationsource.**WeprefernodesthatareinDECOMMISSION_INPROGRESSstatetoothernodes*sincetheformerdonothavewritetrafficandhenceareless 查看详情

快速核心数据迁移以更改属性类型

】快速核心数据迁移以更改属性类型【英文标题】:swiftcoredatamigrationtochangeattributetype【发布时间】:2020-01-0421:34:23【问题描述】:我有一个iOS应用程序,它有一个用于新闻的核心数据数据库。每个新闻实体都有一个ID属性,它应... 查看详情

mysql数据库快速导出和导入迁移(代码片段)

数据库快速导出和导入在公司中,如果运营或者产品手里有几千万甚至几亿条数据,要求你将其导入数据中,请问如何做?如果你依据运营或产品交给你的数据文件直接使用insert语句,一行一行地批量插入ÿ... 查看详情

如何完成redis数据迁移?

如何进行Redis数据迁移?如何完成Redis数据迁移?使用keys+move命令实现数据迁移使用keys+migrate命令实现数据迁移MIGRATE命令说明如何使用MIGRATE命令实现Redis数据迁移其他方案实现数据迁移(待续。。。)如何完... 查看详情

如何将mysql数据库迁移到oracle数据库

参考技术A【赛迪网-IT技术报道】Mysql数据库迁移Oracle数据库具体程:需要准备工具:1.连接Mysqljdbc驱mysql-connector-java-5.0.4-bin.jar2.Oracle公司发SQLDeveloper1.2面配置SQLDeveloper1.2配置环境:选择Tools-Preferences-Database-ThirdPartyJDBCDriver点击AddEntry添... 查看详情

云小课|云小课带你快速掌握云数据迁移cdm

...为云。更多精彩内容请单击此处。摘要:欢迎来到云数据迁移CDM的世界,跟着云小课一起学习云数据迁移。本课主要介绍云数据迁移的基本概念、功能、应用场景及使用过程,帮助您更好的了解云数据迁移。本文分享... 查看详情

如何将 WordPress 从现场迁移到本地?

...?我有一个实时网站,我想在XAMPP中运行它,我如何下载数据库然后在本地上传?非常感谢!【问题讨论】:【参考方案1】:这是一个宽泛的问题,我相信通过谷歌搜索可以快速回答, 查看详情

迁移如何应用于数据库? [关闭]

】迁移如何应用于数据库?[关闭]【英文标题】:HowMigrationsareappliedtothedatabase?[closed]【发布时间】:2021-02-2507:03:51【问题描述】:我想了解迁移在实体框架中是如何工作的,ef如何知道应该将哪个迁移应用于数据库?我看到在每... 查看详情

将 SQLite3 迁移到 MySQL 的快速简便方法? [关闭]

...时间】:2010-09-0607:53:50【问题描述】:有人知道将SQLite3数据库迁移到MySQL的快速简便方法吗?【问题讨论】:【参考方案1】:每个人似乎都是从一些grep和perl表达式开始的,你有点得到适用于你的特定数据集的东西,但你不知道... 查看详情

Laravel - 如何使用工匠迁移将数据迁移到实时数据库中?

】Laravel-如何使用工匠迁移将数据迁移到实时数据库中?【英文标题】:Laravel-HowdoImigratedataintoalivedatabaseusingartisanmigration?【发布时间】:2019-10-1008:21:07【问题描述】:我已使用工匠迁移成功创建了一个数据库“翻译”表。当这个... 查看详情

快速云原生化,从数据中心到云原生的迁移实践

简介:本文将介绍在帮助用户快速完成迁云中的解决方案、最佳实践以及迁云工具。云原生的时代已经到来,云原生技术正在重塑整个软件生命周期,阿里巴巴是国内最早布局云原生技术的公司之一。容器服务团队在... 查看详情

如何编辑数据库迁移?

】如何编辑数据库迁移?【英文标题】:Howdoyoueditadatabasemigration?【发布时间】:2020-11-1417:21:13【问题描述】:我重命名了一些表和一些列。当我运行Add-Migration命令时,迁移会生成删除旧表和列并添加新名称的代码。这会导致它... 查看详情

laravel中如何做数据库迁移

总的来说,做一次独立数据库迁移只需要三步,分别是创建迁移文件、修改迁移文件、运行迁移1.创建数据库迁移文件phpartisanmake:migrationcreate_articles_table1然后在database/migrations目录下就会多出一个迁移文件,不过Laravel会在前面自... 查看详情

django 1.7 迁移——如何清除所有迁移并从头开始?

】django1.7迁移——如何清除所有迁移并从头开始?【英文标题】:django1.7migrations--howdoIclearallmigrationsandstartoverfromscratch?【发布时间】:2014-12-0415:55:19【问题描述】:因此,我目前正在快速迭代django应用程序,并且不断调整models.py... 查看详情

关于mongodb与sqlserver通过本身自带工具实现数据快速迁移及注意事项的探究

...业务的发展、需求的变化,促使我们追求使用不同类型的数据库,充分发挥其各自特性。如果决定采用新类型的数据库,就需要将既有的数据迁移到新的数据库中。在这类需求中,将SQLServer中的数据导入到MongoDB中显得尤为突出... 查看详情

redis技术探索「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移redis数据实战指南(scan模式迁移)(代码片段)

在线数据迁移方式对于大多数场景下的Redis的数据迁移,还是比较推荐大家参考我之前的前两篇文章。【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据&#x... 查看详情

如何将oracle数据迁移到greenplum数据库

】如何将oracle数据迁移到greenplum数据库【英文标题】:howtomigrateoracledatatogreenplumdatabase【发布时间】:2019-05-0118:14:44【问题描述】:如何将Oracle数据迁移到Greenplum数据库有什么方法可以将数据从Oracle迁移到Greenplum数据库,比如一... 查看详情

数据迁移的套路

数据迁移的类型随着业务的发展,存储也会经常性的需要迁移。以下场景是我们开发过程中经常遇到的业务、团队在快速扩张,需要适当时机进行微服务的拆分,需要独立的数据库,将数据从源数据库迁移到新的... 查看详情