以下是该方案的基础知识。我有一小块数据(10MB)需要从一个源服务器复制(在我的C#应用程序中)到大约10,000个不同的目标文件夹,这些文件夹驻留在大约25个不同的服务器上(每个服务器400个目标文件夹)。我拥有所有访问权限等,而我唯一的决定权就是决定哪种方法是最快和最有效的。在任何答案中,完成时间是更重要的。不幸的是,我无法接受其他"解决方案"因为它是什么。遗憾。
我的一些选择是:
从逻辑的角度来看,选项2似乎最有意义,但我对输入感到好奇。我不清楚操作系统如何处理非本地复制命令。程序是通过网络通过我的源服务器返回到目的地吗?
感谢。
答案 0 :(得分:2)
直接的解决方案是,使用File.Copy()将一次复制到25台服务器中每台服务器上的根位置。然后,告诉每个服务器通过推送命令将数据从该根位置复制到目标400位置。命令的确切格式取决于它们的服务器类型。
如果它们是unix服务器,请通过SSH或SCP发送命令。
如果它们是FTP服务器,则某些服务器提供远程到远程复制命令,这比重新上传相同数据更有效。
如果它们是Windows服务器,您可以使用.CMD文件或PowerShell或其他内容(有关更多提示,请参阅此处:https://serverfault.com/questions/116166/windows-how-to-start-a-file-copy-job-on-a-remote-server-without-passing-through)
但是,如果您实际上自己控制了25台服务器,只需编写一个监视“drop folder”的命令行程序。只要它在drop文件夹中收到10MB文件,就会自动将文件传播到400个目标位置。
答案 1 :(得分:1)
这是一项非常常见的操作要求。
我过去使用robocopy非常成功地解决了它(它比xcopy更强大)。
如果从一个源复制到10,000个单独的服务器,则会在一个源上使NIC饱和。你最好在每台服务器上都有一个dropoff文件夹,让每个服务器在dropoff文件夹中查找更改并将它们复制到该服务器上的各个目标文件夹。
答案 2 :(得分:0)
网络(除非您在初始分发服务器上使用慢速硬盘驱动器或在服务器之间运行千兆或更高的以太网)将是您最大的问题。要分割带宽,您可能希望实现类似金字塔的方案。
例如,列出需要将数据复制到的所有服务器,删除连接速度最快的N个服务器,并将剩余的列表拆分为N个相同大小的列表。将有效负载以及列表发送到已删除的服务器。然后,服务器将接受数据,以及他们负责将数据传输到的服务器列表。然后,服务器将获取列表并重复该过程,直到所有服务器都具有数据副本。
显然,这一切都取决于您的网络拓扑,您应该尝试使用不同的N值来查看哪些是最快的,但这是优化的P2P分发的工作原理:首先将数据发送给最快的对等体并让它们重新发送出去对其他人。
答案 3 :(得分:0)
即使你实现了Eric J提到的dropoff文件夹的想法(这通常是一个好主意),你仍然会受到磁盘I / O的约束,因此快速相对于目标而言# 39;物理媒介。
以下是一个关键问题:您是否会在10,000个目录中修改此数据?如果答案是否定的,请强烈考虑将10,000个目的地符号链接到每个服务器的dropoff目录。