Linux 上快速可靠的网络传输

Linux 上快速可靠的网络传输

最近我不得不通过互联网在 Linux 机器之间进行大量文件系统备份和其他大型文件传输,而使用默认工具的整体体验简直令人失望。

一端的 ISP 会定期出现短暂的服务中断,但大多数情况下无法察觉。SSH 除外,它会断开连接以及通过它传输的任何数据流。这当然使得任何相当大的子卷的 BTRFS 备份几乎不可能,因为目前没有官方支持恢复中断的发送/接收。

Rsync 传输并没有好多少,不仅在第一次连接问题时丢失了文件传输备份,而且每个文件的开销也很大,并且在峰值时只能提供最大带宽的约 50%。

当然,有一些方法可以解决这些问题,比如使用 --partial 重新启动并使用 GNU parallel 来饱和带宽,但必须检查并手动重新启动失败的备份,这会使自动化失效。此外,编写脚本来弥补缺失的功能不仅容易出错且耗时,而且最终它只是对永久问题的临时解决方案,而这个问题本来就不应该存在。

另一方面,我一直在使用 MOSH 来保持终端处于活动状态,并使用 autossh/systemd 服务来保持机器之间的 SSH 隧道畅通,因此至少从表面上看,应该有一些或一些用于文件传输的工具:

  1. 在不稳定的网络上抽象出一条稳定的隧道。

  2. 可以在出现网络故障时(甚至是用户愿意的情况下)暂停流,并在服务器/网络恢复在线后立即恢复传输。

  3. 在可用时使用整个网络带宽。

所有这些都是浏览器和 P2P 程序中的常见现象。我认为在当今时代,备份几 TB 的数据并不像火箭科学那样困难。网络故障不仅并不罕见,而且几乎肯定会在一天的时间内发生。

有什么好的工具/管道可以通过互联网在 *nix 系统之间传输大量数据,并且能够足够灵活地应对网络错误,以便在完成之前无人值守运行?

答案1

如果您正在处理不可靠的网络(我们许多人都这样),那么您需要在网络上构建一个可靠的传输机制。

  1. 基于 UDP 的 VPN。例如,OpenVPN 可以配置为点对点传输,即使 IP 地址发生变化也具有弹性。

    为了保持效率,您可以在不加密的情况下运行此操作,并依靠rsync/ssh传输层提供加密。或者(更好的是)您可以反转这一点,让您的 VPN 层提供加密,然后通过rsync尽可能简单的传输运行 -ssh使用空密码,或使用rsync在服务器端使用守护进程,这两种方式都不提供加密。(使用 VPN 加密没有坏处 ssh传输加密(除了增加的处理和潜在的相应吞吐量降低之外)。

  2. 继续rsyncssh使用retry命令重复尝试多次:

    retry rsync -av --partial remoteHost:/path/to/source /path/to/target
    

    有多种选项retry允许您提供备选退出条件(--times 5例如)。请参阅man retry以了解详情。

从专业角度来说,我会根据具体情况采用这两种方法。

请注意,这rsync不一定是通过 WAN 链路传输大型数据集的最快方法。它在计算上相对昂贵,并且设计上与预期的慢速网络连接进行权衡。随着数据链路速度的提高,它带来的好处rsync可能会减少 - 至少在您拥有“基本不变”的数据集需要更新之前。

相关内容