如何使远程服务器中约 2M 文件的 rsync 能够进行定期备份

如何使远程服务器中约 2M 文件的 rsync 能够进行定期备份

我们在远程服务器上有大量文件,我想设置定期备份到本地系统以获得额外的冗余。一些细节:

  • 远程系统不在我的控制范围内。我只有 SSH/rsync 或 FTP 访问权限
  • 远程系统运行 rsync 2.6.6 并且无法升级
  • 远程系统最多允许 25 个并发连接,其中 5 个保留用于生产需要(因此,可用 20 个)
  • 远程系统包含 2M 文件 - 其中大多数大小为 100-200K
  • 文件按层次结构存储

如同:

0123456789/
        0123456
            abc/
                1.fff
                2.fff
                3.fff
            xyz/
                9.fff
                8.fff
                7.fff
9877656578/
        5674563
            abc/
                1.fff
                2.fff
                3.fff
            xyz/
                9.fff
                8.fff
                7.fff

其中数万个根文件夹仅包含少数内部文件夹/文件结构 - 但所有根文件夹都仅是数字(0-9)。

我第一次直接运行它rsync -aP,花了3196m20.040s。这部分是由于远程服务器使用的是rsync2.6.6,我无法使用 3.xx 中的增量文件功能。编译文件列表需要将近 12 个小时 - 每 10 秒运行大约 500 个文件。我不认为后续运行会花这么长时间,因为初始运行必须重新下载所有内容 - 但是即使只是为了文件列表而花 12 个小时也太长了。

文件夹命名如下:

$ ls | grep "^[^67]" | wc -l
295
$ ls | grep "^6" | wc -l
14167
$ ls | grep "^7" | wc -l
14414

我已经测试过rsync -aWP --delete-during如何将其分解,--include="/0*/" --exclude="/*/"其中我同时运行 8 个,0* 1* 2* 3* 4* 5* 8* 9*对于 6 和 7 我使用60*-69*因为70*-79*层次结构中的文件夹大部分以6或开头(每个或7大约 1400 个)。6?*7?*

一切这不是 6 或 7,总共需要大约 5 分钟。6/7 个目录(按 1/10 细分)每个需要 15 分钟。

这是相当高性能的,除了运行这个作业我必须运行 28 个并发rsync并且这会使可用的连接数饱和 - 更不用说可能使网络饱和。

是否有人推荐另一种变体rsync或一些我可以添加的附加选项,以防止同时使用如此多的连接,而不必在rsync一端在 2.6.6 的范围内按顺序进行?

编辑#1:我们确实为这个外部提供商的带宽付费,所以理想情况下,我们只会通过网络发送需要发送的内容,仅此而已。

答案1

经过 40 小时的初始同步时间下载和同步所有数据后,后续扫描和同步相同数据(仅用于提取更新)仅花费 6.5 小时。运行的命令是rsync

rsync -a --quiet USER@REMOTE_SERVER:ROOT/FOLDER/PATH/ /LOCAL/DESTINATION

我认为我最初下载花费的时间很长有两个原因:

  1. 初始数据集为 270GB 和 ~2M 个文件,这对于通过互联网进行扫描和下载来说是一个很大的量(在我们的例子中,我们有一个 100mbit 同步连接,并且连接到一个大型 CDN 提供商)

  2. 我在初始同步时启用了 -P 选项和 -v 选项,这导致大量本地控制台聊天显示正在同步的每个文件和进度信息。

因此,这里的答案是:只需使用rsync不是那么多的详细程度选项(--quiet理想情况下)并且它非常有效 - 即使对于庞大的数据集也是如此。

答案2

这是我个人会做的事情——解决方案有两种。

变体 1-简单的强力选项:

2M * 200KB 大约是 400GB,因此每次都进行完整快照可能不太现实。如果可以的话,简单的解决方案是执行:

ssh <remote host> 'tar -c /directory/to/backup | <gzip/xz/lz4>' > backup.tar.<gz/xz/lz4>

它的工作原理是将所有这些文件转换成通过管道推送的单个流,而不是 Rsync/SFTP 枚举数百万个文件。

从那里开始,我将使用 borg 对 tar 球进行重复数据删除,以便您可以高效地存储多个版本。这是快速传输大量小文件的常用技巧。缺点是您无法执行 RSync 执行的重复数据删除。

如果每个间隔 400GB 太大,我会考虑以下几点:

变体 2——聪明的选择。

您可以执行以下操作,但您需要为每个顶级目录创建一个 tarball,并将哈希值与备份服务器上的现有文件进行比较。如果不同,则传输它,否则,不执行任何操作。

答案3

2M 文件意味着很多元数据,因此rsync由于本地和远程端都需要遍历所有元数据,因此运行速度会很慢。

您应该最大化两端的 RAM,并且最好运行rsync版本 > 3.x。然而,您无法在远程端进行更新的事实rsync让我认为您无法更新 RAM。

最后一次尝试是优先考虑两个都本地和远程端,元数据缓存。您可以尝试设置,至少vfs_cache_pressure=10重新运行rsync两次并比较修改上述参数后的第二次运行性能。

相关内容