热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

数据迁移_数据迁移如何快速迁移

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数据迁移-如何快速迁移相关的知识,希望对你有一定的参考价值。摘要在上一篇中

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数据迁移 - 如何快速迁移相关的知识,希望对你有一定的参考价值。



摘要

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


一. 设计目标

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



  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中跑。


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

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


推荐阅读
  • 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路 ... [详细]
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • 数据库异常智能分析与诊断
    数据库,异常, ... [详细]
  • (10)redis mysql 数据同步
    update之后,写MySql,再写入Redis,替旧数据(可在MySql端定义CRUD触发器,触发后写数据到Redis,也可Redis端解析binlog) ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 讨伐Java多线程与高并发——MQ篇
    本文是学习Java多线程与高并发知识时做的笔记。这部分内容比较多,按照内容分为5个部分:多线程基础篇JUC篇同步容器和并发容器篇线程池篇MQ篇本篇 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 设计完成后,将所完成的作品交由老师检查。管理进程接收申请进入的信号,在消息队列中取下申请进入队列的用户进程的信息,针对当前临界区状态,写一个回馈信息 ... [详细]
  • 消息中间件RabbitMQ 高级特性之消费端ACK与重回队列
    什么是消费端的ACK和重回队列?消费端的手工ACK和NACK消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕机等严重问题 ... [详细]
  • celery 爬虫使用
    简介celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它由三部分组成,消息中间件, ... [详细]
  • 大家好,这是一个为了梦想而保持学习的博客。这个专题会记录我对于KAFKA的学习和实战经验,希望对大家有所帮助,目录形式依旧为问答的方式,相当于是模拟面试。一、概述在对kafka有了 ... [详细]
  • LinkedHashMap如何保证有序
    我们常说linkedHashMap是有序的,这个有序也是分为两种的,分别是:插入顺序和访问顺序,我们可以通俗的认为ÿ ... [详细]
author-avatar
agree_6398026768
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有