将数据中心单个分区上的数十亿个文件迁移到 s3 的最佳方法?

best way to migrate billions of files on a single partition in a data center to s3?

我们有一个带有 10G 直接连接到 AWS 的数据中心。在数据中心,我们有一个带有 GPFS 文件系统的 IBM XIV 存储基础设施,在单个顶级目录中包含 15 亿个图像(每个图像约 50k)。我们可以整天争论这有多愚蠢,但我宁愿为我的任务寻求建议,即将所有这些文件移动到 s3 存储桶中。

我不能使用任何物理传输解决方案,因为数据中心被物理锁定并且获得本地物理许可需要 6 个月的过程。

执行此文件迁移的最佳方法是什么?

目前我的最佳想法是在 AWS 中构建一个 EC2 linux 服务器,使用 s3fs-fuse (https://github.com/s3fs-fuse/s3fs-fuse/wiki/Fuse-Over-Amazon) 作为文件系统在 EC2 服务器上安装 s3 目标存储桶,以及然后 运行 一些 netcat + tar 在持有 GPFS 挂载的数据中心服务器和 EC2 服务器之间的命令。我在另一个 post 上发现了这个建议: 目标框:nc -l -p 2342 | tar -C /target/dir -xzf - 源框:tar -cz /source/dir |数控 Target_Box 2342

在开始一项可能需要一个月的任务之前,我想看看这里是否有人有更好的方法来完成这项工作?

如果你一个月的时间还不错,你正在考虑的事情可能会奏效......但这条道路上存在陷阱。

为了解释这些,我需要有点哲学。

当面对您想要优化的资源密集型作业时,通常最好弄清楚几种有限资源中的哪一种最适合发挥其极限,然后确定所有这些资源其他资源将足以实现这一目标。有时,您实际上最终将一种资源推到了一个人为的和不必要的限制。

在1毫秒内,一个10Gbit/slink可以传输10Mbits。您浪费 而不是 传输数据的每一毫秒都会增加作业的 运行 时间。因此,您需要保持数据流动……而您的解决方案无法实现这一点。

S3 可以轻松 处理每秒 100 次上传,如果按顺序上传,则每 10 毫秒上传 1 次...而 s3fs 不太可能跟得上,并且每 10 毫秒你就可以在你的 link 上传输 100 Mbits...但你没有。您只管理了 1 个 50k 或更少的对象。虽然 s3fs 无疑非常酷——我在一个用于生产后端系统的应用程序中使用它——但它也是一种理论上最不正确的使用 S3 的方式,但实际上是有效的,因为它试图将 S3 视为文件系统......并使用文件系统语义将其暴露给操作系统...而 S3 是对象存储,而不是文件系统,两者之间有一个 "impedance gap"。

这里的人为阻塞点是 s3fs,它只允许 tar 在任何给定时刻提取一个文件。 tar 的输出将重复阻塞一些微秒或毫秒等待每个对象上的 s3fs,这将阻塞 tar 来自网络的输入,这将阻塞 TCP 连接,这将阻止源tar...意味着您实际上不会最大限度地利用任何实际资源,因为您达到了不必要的限制。

没关系,如果 s3fs 遇到错误会发生什么。取决于错误的性质...

tar: broken pipe

哦哦。

你真正需要的是并发。将这些文件并行推送到 S3 与 S3 接收它们的速度一样快。

对此最好的选择是在私有数据中心中编码 运行ning。将文件列表分成几个块。生成多个独立进程(或线程)来处理一大块文件,从磁盘读取并上传到 S3。

如果我这样做(事实上我已经这样做了),我会编写自己的代码。

但是,您可以使用 aws CLI 的 aws s3 cp 命令结合 gnu parallel 相当轻松地完成此操作,可以将其配置为以类似于 xargs 的方式运行-- aws s3 cp 的每个 "n" 并行调用都被定向到复制 parallel 从标准输入构建并在命令行中传入的文件列表。

未经测试,但在正确的轨道上...cd进入文件目录,然后:

  $ ls -1 -f | parallel --eta -m aws s3 cp {} s3://bucket-name

ls -1 -f 列出目录中的文件,每行 1 个,仅名称,未排序,输出管道到 parallel.

--eta 根据目前的进度估计剩余 运行 时间。

-m 表示用尽可能多的输入参数替换 {},同时不超过 shell 的命令行长度限制

查看 gnu 的文档 parallel 了解其他选项,例如日志文件、错误处理和控制要生成的并行进程的数量(这应该默认为您机器中的核心数量这里是 运行ning)。只要您有可用的处理器容量和内存,您可能希望 运行 2x、3x、4x 的并行作业数量,因为有内核,因为处理器会浪费大量时间等待网络 I/O否则。

或者,您可以使用具有 50TB 存储空间的 Snowball 设备通过 UPS 送货卡车上传数据。 http://aws.amazon.com/importexport/