在作业处理服务器之间传输许多文件

我有服务器A工作的一部分工作,并生成一个文件作为输出。 服务器B在作业的第二部分工作,但需要服务A生成的文件。

从服务器A到服务器B的最佳方式是什么? 这将会发生很多次,并且可能同时发生多次转账。

(这些文件几乎总是<50KB,但可以是15MB大)

我知道我可以使用rsync或scp,但是我担心这些转换经常发生的效率。 这是一个有效的担心?

我也研究了NFS的选项,但是我需要能够轻松地指定不同的服务器,而且每次需要定义一个新的服务器时,挂载一个新的nfs似乎并不明智。

这并不漂亮,但现在我所做的只是将文件通过http传递给脚本,将脚本写入文件系统。 这个想法是把它改写成一个简单的客户机/服务器,并将其切断。 但是我认为必须有一个现有的工具来做类似的事情。

这里有两个问题。 第一个是显而易见的,你想在服务器之间共享文件。 你应该可以使用NFS,或者像gluster这样的集群文件系统。 是的,您将不得不在服务器中添加configuration。

第二个问题是如何将这个configuration更改推送到服务器中添加的所有服务器。 这更像configurationpipe理系统的领域,像木偶或厨师 。 有了这样的事情,pipe理各种服务器和服务器之间的glusterconfiguration可以集中进行,更多的版本控制等等。

或者,您也可以使用外部存储来存储临时文件,例如服务器A将这些文件推送到Amazon S3,并将服务器B从该公共位置提取。 不知道更多关于你的情况,这很难说这是否是一个可行的select。

最好的方法是完全主观的。

对我来说,最好的办法是,无论是可靠和可validation地从ServerA到ServerB的文件,使用我最熟悉/最能支持的工具。

因此,我会发送文件(在你的情况下,可能与rsync)和相关的哈希文件(MD5,SHA1等),然后将其工作到您的ServerA工作自动做到这一点。 然后,我会将其join到您的ServerB作业中,以使用散列文件validation数据文件并继续该过程。

我可能也想确保ServerB不会开始在部分传输的文件上工作,所以我可能会复制到ServerB上的“暂存”目录,然后移动到“就绪”目录 – 只select轮询或inotify'准备好'的目录。

一旦到位,您的直接工作就完成了,您可以继续执行项目的主要里程碑,并可以稍后再加快运输速度。

我可能在早期阶段做的最多的是构造ServerA上的目录,所以我可以告诉ServerA上正在生成什么以及正在复制到ServerB上的内容。 可能带有ServerA写入的“待处理”目录,ServerA移动完成文件的目录以及哈希/ rsync进程从中读取文件的“复制”目录,以及ServerA在移动文件时的“归档”目录它完成复制到ServerB。 这样,我可以通过检查“复制”文件夹中的文件数量,大致了解延迟/队列长度。

如果你发现你必须提高传输时间,你可能会发现优化你的networking堆栈是最好的方法。 服务器之间的胖pipe道将是有序的(例如,升级100Mb / s到1Gb / s甚至10Gb / s)。 您可能会尝试绑定多个networking接口,但是,如果这样做,请确保您的绑定algorithm不会每次都根据源IP地址和目标IP地址(或者其他一些不会改变的标准 – 即使是源 – 除非您可以打开来自不同源端口的多个同时连接并且平行复制过程,否则IP +端口到目标IP +端口将不会提供增加的吞吐量。

如果您仍然认为交通工具是一个令人望而却步的瓶颈,那么请在升级途径中消除这种情况。 尝试重新分解,以便ServerA和ServerB上的作业最终都可以由更新,更强大的ServerC执行。 如果pipe理层对这些文件进行快速处理非常重要,这将是一个简单的销售来审查项目的时间。