【问题标题】:How can I efficiently move many files to a new server?如何有效地将许多文件移动到新服务器?
【发布时间】:2023-03-08 08:46:01
【问题描述】:

我正在更换托管服务提供商,需要将数百万个上传的文件传输到新服务器。所有文件都在同一个目录中。是的。你没看错。 ;)

过去我是这样做的:

  1. 压缩源服务器中的所有文件
  2. scp 新服务器的压缩包
  3. 解压
  4. 将目录移动到适当的位置
    • 无论出于何种原因,我在第 1 步中的拉链总是将路径与它们一起并要求我进行 mv。

我上次这样做大约需要 4-5 天才能完成,这大约是我现在的 60%。

我希望有更好的方法。你有什么建议?

文件结构是散列的。像这样:AAAAAAAAAA.jpg - ZZZZZZZZZZ.txt

这是我们正在折腾的一个想法:

根据 3 个字母前缀将拉链分成大量迷你拉链。比如:

AAAAAAAAAA.jpg - AAAZZZZZZZ.gif => AAA.zip

理论优点:

  • 可以加快传输速度,允许同时传输多个 zip 文件
  • 可以限制因传输失败而损失的时间。 (等待 2 天转移最终失败是很糟糕的)

理论缺点:

  • 可能会大大减慢初始 zip,因为 zip 必须通过通配符 (AAA*) 查找文件,这可能会通过同时运行多个 zip 线程来抵消,使用所有 CPU 而不是只使用一个。
  • 复杂性?

我们也考虑过 rsync 和 scp,但担心手动传输每个文件的费用。而且由于远程服务器是空的,我不需要担心已经存在的东西。

你怎么看?你会怎么做?

(是的,我最终会将这些移动到 Amazon S3,我将只运送它们一个磁盘,但与此同时,我昨天需要它们!)

【问题讨论】:

  • 在这种情况下,我主要关心的是不要重复传输而不是快速传输。我曾经不得不从相隔 7 个海域的位置传输价值 100GB 的文件。我尝试使用大文件并由于一些随机错误而上传失败,不得不再次完成整个操作。所以我所做的是将文件分成 6gb 的块并一次并行发送(3-4 个)。它更快更可靠。您可以创建一个脚本来自动为您执行此操作。

标签: linux zip gzip tar


【解决方案1】:

您实际上有多种选择,我最喜欢使用rsync

rsync [dir1] [dir2]

这个命令实际上会比较目录,并且只同步它们之间的差异。

有了这个,我最有可能使用以下内容

rsync -z -e ssh user@example.com:/var/www/ /var/www/

-z 拉链
-e 外壳命令

您还可以通过 SSH 使用 SFTP、FTP。

甚至wget

wget -rc ssh://user@example.com:/var/www/

【讨论】:

  • rsync 不需要努力比较每个文件吗?远程目录是空的,那么为什么要增加这笔费用呢?此外,传输数百万个文件是否比一个(甚至 1000 个)压缩文件更有效?
  • 我不确定比较。你最初建议压缩,所以我只是把它扔在这里作为你的一个选项。为什么不只是一个标准的 FTP 连接..?甚至 wget -rc ssh://user@example.com:/var/www/
  • Rsync 的比较是基于diskblocks 的哈希值(对于现有文件) 对于不存在的文件没有什么可比较的(除了可能复制后的最终验证)
  • rsync 绝对是正确的使用方法,不仅没有麻烦,而且不会两次上传相同的文件(或不同文件的相同片段)。它使用的两步算法(快速滚动校验和后跟强校验和)也足够有效。在数以百万计的上传文件中,很有可能有些文件是相同的(例如,不同用户上传的相同盗版软件、歌曲或电影,或相同的文本或源代码的 sn-ps)。
  • 文件传输进行得如何?如果这对您有所帮助,请将其标记为已接受的答案会很有帮助,以便其他人也更容易找到和使用!
【解决方案2】:

我来自 Linux/Unix 世界。我会使用 tar 来制作多个 tar 文件,每个文件都具有一定的大小。例如:

tar -cML $MAXIMUM_FILE_SIZE_IN_KILOBYTES --file=${FILENAME}}_{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}.tar  ${THE_FILES}

除非您的 .txt 文件很大,否则我会跳过重新压缩。重新压缩 .jpeg 文件不会花费太多时间,而且会占用大量 CPU(和实时)时间。

我会研究一下您的流量整形是如何工作的。你可以有多少并发连接?每个连接多少带宽?一共多少钱?

我在 scp 中看到了一些有趣的东西。测试家庭网络,scp 提供的吞吐量远低于通过已挂载的共享 smbfs 文件系统进行复制。我不完全清楚为什么。虽然如果 scp 正在验证副本并请求重传错误,这可能是可取的。 (通过互联网传输的数据包中出现错误的可能性非常小。如果没有某种后续验证阶段,这对于大型数据集来说是一个真正的问题。您可能想要运行 md5 哈希......)

如果这是一个网络服务器,你总是可以只使用 wget。虽然这看起来效率很低……

【讨论】:

  • 同意压缩。我们的大多数文件都是图像并且不压缩。然而,令人担忧的是传输许多文件(10M+)而不是一个(或 1000 个)文件的费用。你认为 scp 能比在前端压缩更好吗?我应该如何衡量 I/O 费用和连接费用?
【解决方案3】:

使用 BitTorrent 怎么样?它可能不那么容易设置,但一旦你开始使用它,它应该完全符合你的要求。 BitTorrent 的开发是为了促进大型文件的传输。您需要源机器上的客户端和目标机器上的客户端。在源计算机上创建元文件。将其复制到目标计算机并将其加载到您的 BitTorrent 客户端中。手动输入源机器的 IP。只要您没有防火墙阻止您,就应该开始传输。或者,您可以先使用无压缩(即 STORED 压缩)压缩所有文件,然后使用 BitTorrent 传输 zip。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2014-02-27
    • 2020-04-08
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多