最近我不得不通过互联网在 Linux 机器之间进行大量文件系统备份和其他大型文件传输,而使用默认工具的整体体验简直令人失望。
一端的 ISP 会定期出现短暂的服务中断,但大多数情况下无法察觉。SSH 除外,它会断开连接以及通过它传输的任何数据流。这当然使得任何相当大的子卷的 BTRFS 备份几乎不可能,因为目前没有官方支持恢复中断的发送/接收。
Rsync 传输并没有好多少,不仅在第一次连接问题时丢失了文件传输备份,而且每个文件的开销也很大,并且在峰值时只能提供最大带宽的约 50%。
当然,有一些方法可以解决这些问题,比如使用 --partial 重新启动并使用 GNU parallel 来饱和带宽,但必须检查并手动重新启动失败的备份,这会使自动化失效。此外,编写脚本来弥补缺失的功能不仅容易出错且耗时,而且最终它只是对永久问题的临时解决方案,而这个问题本来就不应该存在。
另一方面,我一直在使用 MOSH 来保持终端处于活动状态,并使用 autossh/systemd 服务来保持机器之间的 SSH 隧道畅通,因此至少从表面上看,应该有一些或一些用于文件传输的工具:
在不稳定的网络上抽象出一条稳定的隧道。
可以在出现网络故障时(甚至是用户愿意的情况下)暂停流,并在服务器/网络恢复在线后立即恢复传输。
在可用时使用整个网络带宽。
所有这些都是浏览器和 P2P 程序中的常见现象。我认为在当今时代,备份几 TB 的数据并不像火箭科学那样困难。网络故障不仅并不罕见,而且几乎肯定会在一天的时间内发生。
有什么好的工具/管道可以通过互联网在 *nix 系统之间传输大量数据,并且能够足够灵活地应对网络错误,以便在完成之前无人值守运行?
答案1
如果您正在处理不可靠的网络(我们许多人都这样),那么您需要在网络上构建一个可靠的传输机制。
基于 UDP 的 VPN。例如,OpenVPN 可以配置为点对点传输,即使 IP 地址发生变化也具有弹性。
为了保持效率,您可以在不加密的情况下运行此操作,并依靠
rsync/ssh
传输层提供加密。或者(更好的是)您可以反转这一点,让您的 VPN 层提供加密,然后通过rsync
尽可能简单的传输运行 -ssh
使用空密码,或使用rsync
在服务器端使用守护进程,这两种方式都不提供加密。(使用 VPN 加密没有坏处和ssh
传输加密(除了增加的处理和潜在的相应吞吐量降低之外)。继续
rsync
但ssh
使用retry
命令重复尝试多次:retry rsync -av --partial remoteHost:/path/to/source /path/to/target
有多种选项
retry
允许您提供备选退出条件(--times 5
例如)。请参阅man retry
以了解详情。
从专业角度来说,我会根据具体情况采用这两种方法。
请注意,这rsync
不一定是通过 WAN 链路传输大型数据集的最快方法。它在计算上相对昂贵,并且设计上与预期的慢速网络连接进行权衡。随着数据链路速度的提高,它带来的好处rsync
可能会减少 - 至少在您拥有“基本不变”的数据集需要更新之前。