我们在远程服务器上有大量文件,我想设置定期备份到本地系统以获得额外的冗余。一些细节:
- 远程系统不在我的控制范围内。我只有 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
。这部分是由于远程服务器使用的是rsync
2.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
我认为我最初下载花费的时间很长有两个原因:
初始数据集为 270GB 和 ~2M 个文件,这对于通过互联网进行扫描和下载来说是一个很大的量(在我们的例子中,我们有一个 100mbit 同步连接,并且连接到一个大型 CDN 提供商)
我在初始同步时启用了 -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
两次并比较修改上述参数后的第二次运行性能。