将文件传输到1000台服务器的有效方法

时间:2012-07-04 18:26:42

标签: file-transfer scp

我最近在接受采访时被问到这个问题。让我们假设我有2000台服务器。我想从中央服务器将5GB文件传输到所有这些服务器。想出一个有效的算法。

我的回答: 我将使用perl / python将文件从集中式服务器scp到第一个服务器。 与此同时,我也将开始向其他服务器发送文件。我觉得一个接一个地做效率非常低,因此并行做会加快。

有更好的方法吗?

5 个答案:

答案 0 :(得分:11)

当然,您会使用某种脚本,因为您不想手动执行此操作。 但是,您可以开始将文件发送到k服务器,而不是将所有文件从一个服务器发送到所有其他服务器。一旦这些k服务器收到文件(假设在时间t),他们也可以开始分发文件,所以大约在时间2 * t已经k ^ 2服务器在原始解决方案中具有文件而不是2 * k。在时间3 * t之后k ^ 3服务器已经获得了文件...继续该算法,直到每个服务器都获得它的文件。

为了使整个过程更快一些,你还可以将文件分成块,这样服务器就可以在收到整个文件之前重新分配它(你最终会得到像torrent这样的东西)

答案 1 :(得分:4)

在这种情况下,肯定“torrent”是负载均衡的最佳且经过验证的策略。但我认为,当一次采访向我提出这样一个假设的问题时,她可能也在寻找你的假设并期待反问题。

  1. 上传/下载服务器容量。
  2. 网络本地化,即不同机器的跳数。
  3. 可以存档文件并发送
  4. 如何验证完整性(md5哈希)
  5. 由于@Misch,现在我的计划仍然是相同的“洪流”。但是,如果所有服务器都在相同的n / w并且具有相同的容量;

    1. 将文件分成2000个部分,每个服务器获得5GB / 2000~2.5 MB(文件段)到主机,中心充当信标服务器,告诉其他服务器文件所在的位置。

    2. 每个服务器都会从其他服务器以随机顺序下载这些块,如果我们按顺序下载则会导致一台机器出现瓶颈。

    3. 根据机器,我们可以拥有最大活动上传/下载线程,每个线程上/下分开文件段。当服务器为最大主机提供服务时,它可以拒绝文件下载请求。请求主机将简单地拾取另一个随机段进行下载。

      1. 我们可以对单个文件段使用一些校验和&所有文件合并,以验证文件完整性。
      2. 这可确保所有服务器上传/下载接近其上/下行带宽。但显然在现实世界中,我可以拥有一个安全的洪流,而只是使用它。

答案 2 :(得分:1)

如果将文件拆分为微小的块,则每个服务器都可以开始传输在整个文件下载之前收到的块。这基本上是bittorrent使用的算法,并且比服务器仅在收到整个文件后发送文件更快(即渐近)。

事实上,对于无限小的块大小(即纯粹的理论情况),将大小为m的文件分发到n服务器所花费的时间甚至不依赖于值n的 - 仅限于正在分发的文件的大小(即O(m))。当然,在实际情况下,需要考虑一些开销/细节(d1val总结得很好),这使得它在实践中需要稍长的时间。

相反,如果每个服务器只有在收到整个文件后才将文件上传到另一台服务器,那么运行时间为O(m log(n)) - 这是渐近地大于bittorrent方法。

另外,只是添加,通常当面试问这类问题时,他/她会询问算法,而不是实施细节。

答案 3 :(得分:0)

我被问到一个类似的问题,在洪流的做事方式不被接受。 问题是“如果微软必须将软件更新推送到美国的2000台服务器,那么它将如何做到” - 所以这些服务器无法进行基于torrent的文件传输。

我的回答是: 从具有2000个节点列表的主服务器具有批处理过程,批处理的容量将由您跨越这些节点的网络速度确定。

  1. 首先选择100个节点的样本,并在这些节点上进行速度测试。速度测试将指示这100个节点中可用的中间速度是多少,并且可以充当整个网络的样本。

  2. 所以现在你有一个X Mbps的值是你可以转移到这些节点的速度。

  3. 查看您自己的传出数据速度的容量。因此,如果中央服务器的容量为YGbps作为其上传速度

  4. 然后批量大小=您的上传容量(Y)/ X(速度测试找到的速度)。

    根据这个批量大小,您可以分批并行转移到2000服务器。

    任何输入?

答案 4 :(得分:0)

我想您可以将文件放在NFS服务器上,并让主机安装该NFS分区。