我想通过 1 Gbps 线路将驻留在单个服务器上的 100 GB 文件传输到网络中的 100 台其他服务器。最好的方法是什么?我的解决方案是将文件复制到 k 台服务器(比如 9 台),然后将剩余的(100-9)台服务器分配给 9 台服务器中的每台。这是一种更好的解决方案,然后将文件从 1 个服务器顺序复制到 100 个。我的问题是如何确定 k ?或者确定k的最有效值的计算是什么。请建议是否还有更好的解决方案。抱歉忘了提.. 不能使用种子。并非所有公司都允许洪流。这是一道面试题。感谢您的回复。谢谢
9 回答
假设您一次只能复制到一台服务器,则可以如下所示。
- 主服务器复制到服务器 S1。
- S1 复制到 S2(1 份)
- S1 复制到 S3 和 S2 复制到 S4(并行 2 份)
- S1 复制到 S5,S2 复制到 S6,S3 复制到 S7,S4 复制到 S8(并行 4 份)
等等..
因此,副本数量的模式如下:2 pow 0、2 pow 1、2 pow 2 等
1 + 2 + 4 + 8 + 16 + 32 + 64 > 100
所以,S1要做的副本数可以用这个公式找到
(2 pow k >= 100) and (2 pow (k-1) < 100)
在这种情况下,k 计算结果为 7(在第一次复制之后)
一种意见是在网络上多播文件。这样第一台服务器只会发送一次文件(其他服务器同时接收文件)。它可能会变得非常棘手,但我想这将是最快的方法。您可能需要设计自己的自定义协议,当一台计算机丢失数据包时该怎么办。
我知道面试可能为时已晚,但为了记录,也许你可以考虑这样的事情:
https://code.google.com/p/castcopy/
或其他一些多播复制工具。无需为每个或部分接收客户端重复数据包。您只需发送数据包的一份副本,所有其他人同时收听!
平底锅
假设有要n
复制文件的服务器。如果可以并行进行复制,则您的方法是正确的,即在第一轮复制之后,将有k
服务器带有文件的副本。如果从这些服务器复制k
到其余n-k
服务器可以并行完成,那么您的方法是理想的。
你可以找到k
如下的值,
选择k
使得k 2 ≤ n和(k+1) 2 > n。
- bzip 文件以尽可能地压缩它
- rsync 到所有其他机器
- 去吃午饭/做你堆栈中的下一件事。
没有提到时间限制,所以为什么要假设一个。它只会让你自己的事情变得更难。
在简单的假设下,您可以将其视为动态规划问题:对于 i = 1.. k 找到产生 k 个副本的最快方法。在每个步骤中,考虑在前面的步骤中生成 kt 个副本所花费的时间,然后添加 1 个步骤以并行运行 t 个复制操作,其中 t 最好不大于 k - t。
对于 k 是 2 的幂的情况,您可以在 1 步中生成 2 个副本(计算原始副本),在 2 步中生成 4 个副本……在 7 步中生成 128 个副本,这比执行 9 更快副本是您的第一阶段,假设在一台机器上运行 9 个副本所需的时间是复制到单个目标的 9 倍。
但是所有这一切都假设副本所花费的时间仅取决于源的传出带宽-实际上,我希望您的所有网络链接都靠近且相同,因此多个副本同时存在变慢的风险彼此关闭,或者您的网络链接相距甚远但又不同,因此不同链接上的副本需要不同的时间。
您还应该考虑使用sneakernet - 复制到可移动USB 或可移动硬盘驱动器并将设备带到其目的地以获取另一个本地副本。从历史上看,在没有计算出现有sneakernet的有效带宽的情况下,试图用网络链接替换sneakernet的亲戚,但由于没有提供足够的网络带宽而失败了。
我能想到分而治之
100 (50,50) -> (25, 25) -> (12, 13) -> (6, 6) -> (3,3) -> (1, 2) ..停止
我假设复制功能将尝试使用本地资源(例如服务器 1 到服务器 2) 将使用服务器 1 资源。
所以从服务器 1 到服务器 2 和 3(总共 3 个服务器)现在服务器 1 到 4、2 到 5、3 到 6(总共 6 个服务器)现在服务器 1 到 7、2 到 8、3 到 9....6至 12(共 12 个服务器)
所以假设一个线程管理器将复制 Server 1 到 Server 51 , Server 2 到 Server 52 ... Server 50 到 Server 100
如果您使用 bittorrent 通过您的局域网分发文件,那么 torrent 软件将为您处理负载平衡,即您不需要预先计算“k”。我建议为您的客户使用utorrent,但任何客户都可以。 这是设置跟踪器等的教程
使用 bittorrent 的一个优点是接收服务器可以在拥有整个文件之前开始分发文件的块。
两步:
- S00(服务器一,最初拥有文件的人)将文件分成 100 个块,不将块保存到磁盘,而是分别将块 C01-C99 发送到 S01-S99。
- S00-S99 将他们的块发送给他们的兄弟姐妹,但没有人发送给 S00
预计网络将严重饱和!