我有服务器 A,它负责处理作业的一部分并生成文件作为输出。服务器 B 负责处理作业的第二部分,但它需要服务器 A 生成的文件。
将文件从服务器 A 传输到服务器 B 的最佳方法是什么?这会发生多次,并且可能同时发生多次转移。
(这些文件几乎总是小于 50KB,但最大可达 15MB)
我知道我可以使用 rsync 或 scp,但我担心这些传输太频繁会导致效率问题。这种担心合理吗?
我也研究了 NFS 选项,但我需要能够轻松指定不同的服务器,而且每次需要定义新服务器时都挂载新的 nfs 似乎并不明智。
它并不漂亮,但目前我所做的只是通过 http 将文件放入一个脚本中,然后将其写入文件系统。我的想法是将其重写为一个简单的客户端/服务器,并从中切出 Web 服务器。但我认为一定有一个现有的工具可以做类似的事情。
答案1
答案2
这最好的方式完全是主观的。
对我来说,最好的方法是,使用我最熟悉/最容易支持的工具,以可靠且可验证的方式将文件从服务器 A 传输到服务器 B。
因此,我会发送文件(就您而言,可能使用 rsync)和相关哈希文件(MD5、SHA1 等),然后将其放入您的 ServerA 作业中以自动执行此操作。然后,我会将其放入您的 ServerB 作业中,使用哈希文件验证数据文件并继续该过程。
我可能还想确保 ServerB 不会开始处理部分传输的文件,因此我可能会采取复制到 ServerB 上的“暂存”目录,然后移动到“就绪”目录 - 仅选择轮询或通知“就绪”目录。
一旦完成,您的眼前工作就完成了,您可以继续完成项目的主要里程碑,稍后再回来加快运输速度。
在早期阶段,我可能要做的最多的就是构建 ServerA 上的目录,这样我就可以知道 ServerA 上正在生成什么以及正在将什么复制到 ServerB;可能有一个“待处理”目录供 ServerA 写入,一个“复制”目录供 ServerA 将完成的文件移动到其中,哈希/rsync 进程从中获取文件,还有一个“存档”目录供 ServerA 在将文件复制到 ServerB 后将文件移动到其中。这样,我就可以通过检查“复制”文件夹中的文件数量来大致了解延迟/队列长度。
如果您确实发现必须缩短传输时间,那么优化网络堆栈可能是最佳方法。服务器之间的管道应更宽(例如,将 100Mb/s 升级到 1Gb/s 甚至 10Gb/s)。您可能想尝试绑定多个网络接口,但如果这样做,请确保您的绑定算法不会每次都根据源和目标 IP 地址选择相同的接口(或其他不会改变的标准 - 即使是源 IP+端口到目标 IP+端口也不会提供更高的吞吐量,除非您可以从不同的源端口打开多个同时连接并并行复制过程)。
如果您仍然发现传输是一个令人望而却步的瓶颈,请尝试在升级路径中消除它。尝试重构,以便 ServerA 和 ServerB 上的作业最终都可以由更新、更强大的 ServerC 执行。如果那对于管理层来说,快速处理这些文件非常重要,这样在项目审查时就会很容易完成。