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

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

我有服务器 A,它负责处理作业的一部分并生成文件作为输出。服务器 B 负责处理作业的第二部分,但它需要服务器 A 生成的文件。

将文件从服务器 A 传输到服务器 B 的最佳方法是什么?这会发生多次,并且可能同时发生多次转移。

(这些文件几乎总是小于 50KB,但最大可达 15MB)

我知道我可以使用 rsync 或 scp,但我担心这些传输太频繁会导致效率问题。这种担心合理吗?

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

它并不漂亮,但目前我所做的只是通过 http 将文件放入一个脚本中,然后将其写入文件系统。我的想法是将其重写为一个简单的客户端/服务器,并从中切出 Web 服务器。但我认为一定有一个现有的工具可以做类似的事情。

答案1

这里有两个问题。第一个问题很明显,就是你想在服务器之间共享文件。你应该能够使用 NFS,或者某种集群文件系统,比如格鲁斯特这样做。是的,添加服务器时您必须更改配置。

第二个问题是,当你添加服务器时,如何将配置更改推送到所有相关服务器。这更多是配置管理系统, 喜欢木偶或者厨师有了这样的东西,就可以集中管理各个服务器 A 和服务器 B 之间的 gluster 配置,并且可以更好地进行版本控制等。

或者,您也可以使用外部存储来存储临时文件,例如服务器 A 将这些文件推送到 Amazon S3,服务器 B 从该公共位置提取文件。如果不进一步了解您的情况,很难说这是否是一个可行的选择。

答案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 执行。如果对于管理层来说,快速处理这些文件非常重要,这样在项目审查时就会很容易完成。

相关内容