2023年马上结束,这一年做了不少事情,有一项我可以吹好几年,忍不住和大家分享一下啊。

需求


去年底收到一项需求,要求2个月内从某云存储迁移100PB数据到微软云存储,包含几百亿个文件。当时听到这个数字我都惊呆了,别说100PB,100TB之前我都没迁移过,心里完全没底。但是老板说部门目前没有开发人员可以干这个项目,希望我能带队参与。没办法,我只能顶着巨大的压力参与项目的推进,核心开发人员就4位,还有售前架构师若干。

第一步就是和客户对接了解业务需求和当前数据现状,分析下来发现有几点要处理:

  1. 客户有很多零碎小文件,这部分带宽利用率不高,肯定无法在规定时间内传完的,需要排除在本次任务范围外。
  2. 存在很多文件有事务性,文件级别传输无法保证业务数据一致性,这部分文件一般是各种数据表,但总量占比低,需要单独处理。
  3. 传输期间数据源不下线,意味着要做增量传输。
  4. 跨云传输带宽上限不确定有多大,一开始以500Gbps为目标,后来发现天真了。

以上只是一小部分问题,实际数个月项目做下来积攒了一堆问题。

这个项目工期太紧,而且数据量巨大,传输一次就要数十万美元的流量费,只能成功不能失败,代价及其巨大!

技术方案及开发


回到开发部分,我们是4人的小型敏捷团队,我担任开发兼项目经理兼架构师。我们只花了2天时间就完成了各种方案和工具调研,并给出了设计的传输方案。

  • 开源数据迁移工具,如 Hadoop 集群 distcp 远程拷贝

Apache DistCp 是一个开源工具,可用于复制大量数据。用户可以将 DistCp 命令作为一个步 骤添加到 Hadoop 集群中。使用 DistCp,用户可以高效地将大量数据从来源云存储复制到目标 HDFS 存储服务中。

DistCp使用MapReduce以分布式方式进行复制。它将文件和目录列表扩展为映射任务的输入,每个任务将复制源列表中指定的文件的分区。它跨多个服务器调度复制、错误处理、恢复和报告结果等任务。因此我们经常在Hadoop集群之间使用DistCp进行大规模分布式数据复制。

该方案优点如下:

    • 开源工具,无任何许可成本
    • 支持Hadoop集群间大规模复制数据
    • 对HDFS支持很完善
    • Apache基金会项目,项目持续被维护更新

缺点:

    • 存在功能使用限制,如不能在预先存在的目标目录下创建父源目录等问题
    • 云端Hadoop集群使用需要适配并集成DistCp驱动
    • 难以定制复制逻辑,拓展性差
    • 无法限制带宽占用
    • 无法处理来源云存储中文件发生版本更新的情况,不满足需求
  • 商用SaaS数据迁移方案,如Azure Data Factory、AWS Glue、GCP Cloud Data Fusion等

以Azure Data Factory为例,它是基于云的ETL和数据集成服务,可让你创建数据驱动型工作流,用于大规模调度数据移动和转换数据。可以使用Azure数据工厂创建和计划数据驱动型工作流(称为管道),以便从不同的数据存储引入数据,同时直观地转换数据到目标存储中。

但该类SaaS产品传输性能有限无法满足当前项目的高性能要求,适合常规数据迁移任务。

因此无论是商用的传输服务还是开源的Apache DistCp,都不能做到在规定时间内完成如此高的传输目标,最终还是决定自己定制化开发传输应用。

对此我们设计了如下关键特性:

  • 采用1 Master Node,N个Work Node模式,实现分布式并行调度任务机制
  • 采用高可用设计,单个复制任务应当能够自动重试
  • 能够限制带宽调用
  • 分布式数据存储
  • 完整的任务记录
  • 高性能。能够吞吐量达到250Gbps

我们对AzCpoy工具做了深度魔改,为此我临时学了Go语言,将其从单机程序修改为可以群集化弹性扩张的分布式并行数据复制应用,运行在复制节点上。针对大规模任务,我们还开发了控制程序,负责管理和派发复制任务给复制节点,并引入了额外的消息队列和Redis缓存,来实现整个分布式系统的调度。

针对并发任务的监控,我们额外引入了Azure CosmosDB作为高性能可弹性扩容的NoSQL数据库,能够承受每秒数万次的查询和写入。此外还针对增量更新文件的场景,开发了事件驱动的应用,用于侦听来源云存储的文件更新事件,异步触发数据复制任务。

整套系统我们只花了1周时间就开发完成第一个版本,额外花了1周进行测试。4个开发每天除了吃饭睡觉就在写代码,投入了巨大的心血,特别敬业。

上线


去年元旦我们的分布式复制系统正式上生产,结果第一天就出bug了,数据迁移数小时后卡住。经过紧急排查发现是调度程序的循环逻辑存在问题,永远跳不出来,这是相当低级的错误。主要原因还是工期太赶,大家各干各的,没有互联交叉审阅代码,因此质量不高。紧急修复后,重新上线。

结果第二天收到迁移来源的云存储厂商投诉,因为我们的复制速度太快,已经挤爆了他们公网400Gbps总带宽,影响其他客户的使用。如果不限制数据迁移任务,将会在平台层面封掉数据流量。

这点我很欣慰,至少证明我们开发的工具性能极高,有多少带宽可以占满多少。因此紧急着手限速工作,最后将传输的吞吐速度限制在200-250Gbps。

上线第一个月,我们就传输了50PB的数据。最终传输了100PB的数据,整个过程中我们的工具总体鲁棒性不错,比较符合设计预期。

总结


那几个月是我8年职业生涯以来压力最大的时间,也是我这些年来做过最具挑战性的项目。当然输出的成果也非常牛,这个牛我可以吹好多年。从来没想到我们可以做到这么超大规模的任务,仅仅流量费就要几十万美元,测试一次就要几千美元,烧掉好多台iPhone。

面对极限的压力,我们程序员总能爆发出超乎想象的能力,完全吹爆!!!

三个月我迁移了100PB数据的更多相关文章

  1. mysql迁移之巨大数据量快速迁移方案

    mysql迁移之巨大数据量快速迁移方案-增量备份及恢复 --chenjianwen 一.前言: 当mysql库的大小达到几十个G或者上百G,迁移起来是一件非常费事的事情,业务中断,导出导入耗费大量的时 ...

  2. 巧用 JuiceFS Sync 命令跨云迁移和同步数据

    近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务 ...

  3. 利用Linode面板Clone克隆搬家迁移不同VPS数据及利用IP Swap迁移IP地址

    在众多海外VPS服务商中,老蒋个人认为Linode提供的VPS方案和性价比还是比较高的,尤其目前基础1GB方案仅需10美元每月且全部是SSD固态硬盘,无论是流量还是硬盘大小,基本上可以满足我们大部分用 ...

  4. [DeeplearningAI笔记]卷积神经网络2.9-2.10迁移学习与数据增强

    4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.9迁移学习 迁移学习的基础知识已经介绍过,本篇博文将介绍提高的部分. 提高迁移学习的速度 可以将迁移学习模型冻结的部分看 ...

  5. Oracle 12C 新特性之在线重命名、迁移活跃的数据文件

    Oracle 数据库 12c 版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤,可以使用 ALTER DATABASE MOVE DATAFILE 这样的 SQL 语句对数据文件进行在线重命名和移 ...

  6. impala 表迁移方式 partquet数据文件移动方法

    1.原表查询:select count(*) from edm.ucard_wxd0123 where stat_dt = '2024-01-09' and id_no = '110101199003 ...

  7. 使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云

    背景信息 阿里云数据库 SQL Server 版导入数据有如下限制: 仅支持导入 SQL Server 2005.SQL Server 2008.SQL Server 2008R2 版本数据 仅支持全 ...

  8. laravel7 数据迁移及填充数据

    1:置迁移数据表,创建生成模型和迁移文件: php artisan make:model Article -m 2:接着,在框架中的database/migrations文件夹中找到刚创建的用户表Ar ...

  9. mysql查询出近一周,三个月,一年的数据

    SELECT * FROM 表名 WHERE 时间字段>DATE_SUB(CURDATE(), INTERVAL YEAR) 一年 SELECT * FROM 表名 WHERE 时间字段> ...

  10. Ubuntu18修改/迁移mysql5.7数据存放路径

    1.停止mysql服务 sudo service mysql stop 2.修改mysql配置文件,一般是 /etc/mysql/my.cnf,或者/etc/mysql/mysql.conf.d/my ...

随机推荐

  1. 【matplotlib基础】--样式表

    Matplotlib库 由于诞生的比较早,所以其默认的显示样式很难符合现在的审美,这也是它经常为人诟病的地方. 不过,经过版本更迭之后,现在 Matplotlib 已经内置了很多样式表,通过使用不同的 ...

  2. 聊聊基于Alink库的推荐系统

    概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤.ALS.FM算法等.对于不同的数据场景, ...

  3. pci p2p

    概述 在2018年,针对pci支持p2pdma的驱动合入主线,没记错的话应该是4.20. 补丁如下: commit 52916982af48d9f9fc01ad825259de1eb3a9b25e A ...

  4. TTS背后的技术原理——前端和后端系统

        就解锁了一个温柔又风趣的「女朋友」萨曼萨.不过,在现实生活中,和语音助手谈恋爱还是一件十分遥远的事情--刨去现阶段的语音助手们双商水平还有限,语音助手的语言表达能力还远远达不到我们理想状态. ...

  5. Elasticsearch 6.8.6

    mac;centos;unix;  下载 wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.6. ...

  6. 学习一下Java的ArrayList和contains函数和扩容机制

    起因 在Leetcode上做题写了两种暴力解法,但是执行效率上不太一样. 时间上差很远,内存虽然差不多但是前者击败30%,后者击败94%.这两种解法区别是用一条ArrayList还是两条来存数据,所以 ...

  7. Ubuntu18.04环境下安装redis 6.2.0,配置文件的部分参数说明

    环境是win11的Linux子系统Ubuntu-18.04,安装方式是源码安装,也可以用apt安装(见本文最后参考资料),用的用户是默认用户(所以一些关键命令要注意用sudo,不用会报错) 安装: j ...

  8. 二叉树、平衡二叉树、红黑树、B树、B+树

    几种树的主要区别: 红黑树为二叉自平衡搜索树,深度大,多用于内存排序: B树为多路(多叉)搜索树,深度低,搜索数据时磁盘IO较少,多用于索引外存数据,只支持随机访问,不支持顺序访问: B+树是对B树的 ...

  9. Spring系列:Spring6简介和基本使用

    一.概述 1.1 特点 Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由"Spring 之父"Rod Johnson 提出并创立,其目的是用于简化 J ...

  10. 开发现代化的.NetCore控制台程序:(3)将nuget包发布到GitHubPackages

    前言 上一篇文章已经把项目模板的nuget包发布到了 nuget 的官方源了,其实还可以发布到其他源,比如 GitHub ,本文记录一下发布到 GitHub Packages 的过程. 注意:本文建立 ...