文件从一台服务器复制到100台服务器

时间:2013-05-19 03:18:16

标签: linux algorithm file-transfer scp

我想通过1 Gbps线路将位于单个服务器上的100 GB文件传输到网络中的100个其他服务器。最好的方法是什么?我的解决方案是将文件复制到k个服务器(例如9个),然后将剩余的(100-9个)服务器分配给9个服务器中的每个服务器。 这是一种更好的解决方案,然后将文件从1台服务器顺序复制到100台。我的问题是如何确定k?或者是什么计算来确定k的最有效值。请建议是否有更好的解决方案。抱歉忘记提及..不能使用TORRENT。并非所有公司都允许使用洪流。这是一个面试问题。感谢您的回复。感谢

9 个答案:

答案 0 :(得分:4)

假设您一次只能复制到一台服务器,它可以如下所示。

  1. 主服务器复制到服务器S1。
  2. S1复制到S2(1份)
  3. S1复制到S3,S2复制到S4(并行2份)
  4. S1复制到S5,S2复制到S6,S3复制到S7,S4复制到S8(4个并行复制)
  5. 等等..

    所以,副本的模式如下:2 pow 0,2 pow 1,2 Power 2等

    1 + 2 + 4 + 8 + 16 + 32 + 64> 100

    因此,可以使用此公式找到S1必须执行的份数

    (2 pow k >= 100)  and (2 pow (k-1) < 100)
    

    在这种情况下,k的计算结果为7(第一次复制后)

答案 1 :(得分:1)

让那些要复制文件的n服务器。如果可以并行完成复制,那么您的方法是正确的,即在第一轮复制之后,将有k个服务器包含该文件的副本。如果从这些k服务器复制到剩余的n-k服务器可以并行完成,那么您的方法是理想的。

您可以按以下方式找到k的值,

选择k,使 k 2 ≤n(k + 1) 2 &gt; Ñ

答案 2 :(得分:1)

一种观点是在网络上组播文件。这样第一台服务器只发送一次文件(其他服务器同时接收文件)。它可能变得非常棘手,但我想这将是最快的方式。您可能需要设计自己的自定义协议,当一台计算机丢失数据包时该怎么做。

https://github.com/windsurfer/C-Sharp-Multicast

答案 3 :(得分:1)

我知道在采访中可能为时已晚,但也许是为了纪录 你可以考虑这样的事情:

https://code.google.com/p/castcopy/

或其他一些多播复制工具。无需重复每个数据包 或某些接收客户端。您只需发送一份数据包即可 所有其他人同时听!


答案 4 :(得分:0)

如果你使用bittorrent在你的局域网上分发文件,那么torrent软件将负责你的负载平衡,即你不需要预先计算“k”。我建议您为客户使用utorrent,但任何客户都可以。 Here is a tutorial for setting up the tracker etc

使用bittorrent的一个优点是收件人服务器可以在拥有整个文件之前开始分发文件块。

答案 5 :(得分:0)

在简单假设下,您可以将其视为动态编程问题:对于i = 1 ... k,找到生成k个副本的最快方法。在每个步骤中考虑在先前步骤中生成k-t副本所花费的时间,然后添加1步以并行运行t复制操作,其中t最好不大于k-t。

对于k为2的幂的情况,您可以1步生成2份(计算原件),2份4份拷贝... 7个步骤生成128份拷贝,比以前更快做第一个阶段的9个副本,假设从一台机器运行9个副本所需的时间是复制到单个目的地的9倍。

但是所有这些都假定副本所花费的时间仅取决于源的传出带宽 - 实际上我希望您的所有网络链接都在一起并且相同,因此同一个多个副本时间风险相互减慢,或者您的网络链接分开但不同,因此不同链接上的副本需要不同的时间。

您还应该考虑使用sneakernet - 复制到可移动USB或可移动硬盘驱动器,并将设备带到目的地以获取另一个本地副本。从历史上看,试图用网络链接取代sneakernet的亲属,而没有计算现有sneakernet的有效带宽,但由于没有提供足够的网络带宽而失败了。

答案 6 :(得分:0)

我能想到分而治之

100(50,50) - &gt; (25,25) - &gt; (12,13) - &gt; (6,6) - &gt; (3,3) - &gt; (1,2)..STOP

我假设复制功能将尝试使用本地资源(例如服务器1到服务器2)将使用服务器1资源。

所以从服务器1到服务器2和3(共3台服务器) 现在服务器1到4,2到5,3到6(共6个服务器) 现在服务器1到7,2到8,3到9 .... 6到12(共12个服务器)

让我们假设一个线程管理器将服务器1复制到服务器51,服务器2复制到服务器52 ...服务器50复制到服务器100

答案 7 :(得分:0)

  1. bzip文件尽可能地压缩它
  2. 将其同步到所有其他计算机
  3. 去吃午餐/处理堆栈中的下一件事。
  4. 没有提到时间限制,所以为什么假设一个。它只会让你自己变得更难。

答案 8 :(得分:0)

两个步骤:

  1. S00(服务器1,最初拥有该文件的人)将文件分成100个块,而不是将块保存到磁盘,而是分别将块C01-C99发送到S01-S99。
  2. S00-S99将他们的大块发送给他们的兄弟姐妹,但因为没有人发送给S00
  3. 预计网络会非常饱和!