0

以下是该场景的基础知识。我有一小块数据(10MB)需要(在我的 C# 应用程序中)从一个源服务器复制到大约 10,000 个不同的目标文件夹,这些目标文件夹可能位于 25 台不同的服务器上(每台服务器 400 个目标文件夹)。我拥有所有的访问权限等,我唯一的挂断是决定哪种方法最快、最有效。完成时间是任何答案中更大的优先级。不幸的是,我不能接受其他“解决方案”,因为它就是这样。对不起。

我的一些选择是:

  1. 使用异步复制命令将数据从源复制到 10,000 个目标。
  2. 将数据从源复制到 25 台服务器中的每台,然后从服务器上的每个位置异步复制到各自服务器上的最终 10,000 个目标文件夹。
  3. 其他选择??

从逻辑的角度来看,选项 2 似乎最有意义,但我很好奇输入。我不清楚操作系统如何处理非本地复制命令。程序是否通过网络返回通过我的源服务器然后到达目的地?

谢谢。

4

4 回答 4

2

The straightforward solution is, yes, copy once to a root location on each of the 25 servers using File.Copy(). Then, tell each server to copy the data from that root location to the target 400 locations by pushing them commands. The exact format of the command depends on what type of servers they are.

If they are unix servers, send the command via SSH or SCP.

If they are FTP servers, some servers provide a remote-to-remote copy command that is more efficient than re-uploading the same data.

If they are Windows servers, you can use a .CMD file, or PowerShell or something else (see here for more ideas: https://serverfault.com/questions/116166/windows-how-to-start-a-file-copy-job-on-a-remote-server-without-passing-through)

However, if you actually control the 25 servers yourself, just write a command line program that monitors a "drop folder". Anytime it receives the 10MB file in the drop folder, automatically propagate the file to the 400 target locations.

于 2012-07-18T17:34:08.737 回答
1

这是一个非常常见的操作要求。

我过去使用robocopy非常成功地解决了这个问题(它比 xcopy 强大得多)。

如果您从一个源复制到 10,000 台单独的服务器,您将使一个源上的 NIC 饱和。您最好在每台服务器上都有一个 dropoff 文件夹,并让每台服务器在 dropoff 文件夹中查找更改并将它们复制到该服务器上的各个目标文件夹中。

于 2012-07-18T17:24:06.523 回答
0

网络(除非您在初始分配器上的硬盘驱动器速度较慢,或者在服务器之间运行千兆位或更高的以太网)将是您最大的问题。要分割带宽,您可能需要实施类似金字塔的方案。

例如,列出您需要将数据复制到的所有服务器的列表,删除连接速度最快的 N 个服务器,然后将剩余的列表拆分为 N 个大小相等的列表。将有效负载与列表一起发送到已删除的服务器。然后,服务器将接受数据,以及它们负责将数据传输到的服务器列表。然后,服务器将获取该列表并重复该过程,直到所有服务器都拥有数据的副本。

显然,这完全取决于您的网络拓扑,您应该尝试使用不同的 N 值来查看哪些是最快的,但这就是优化的 P2P 分发的工作原理:首先将数据发送给最快的对等点,然后让它们重新发送给其他点。

于 2012-07-18T17:32:25.113 回答
0

Even if you implement the dropoff folder idea mentioned by Eric J, (which is generally a good idea), you'll still be bound by disk I/O, so fast is going to be relative to the destination's physical medium.

Here is a key question for you: Are you going to be modifying this data once its in your 10,000 directories? If the answer is no, strongly consider symlinking your 10,000 destinations to each server's dropoff directory.

于 2012-07-18T17:32:54.850 回答