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

use*_*021 0 scp file-transfer

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

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

有一个更好的方法吗 ?

Mis*_*sch 12

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

为了使整个过程更快一些,您还可以将文件分成块,以便服务器可以在收到整个文件之前开始重新分发(最终会有像torrent这样的东西)

  • 可能不是面试官想听到的,但你也可以使用多播.多播目前尚未普及,但有些提供商在自己的网络中使用它来为其客户提供IPTV. (5认同)

d1v*_*val 7

在这种情况下,“洪流”绝对是负载平衡的最佳且经过验证的策略。但我认为,当面试问我这样一个假设性的问题时,她可能也在寻找你的假设并期待反问。

  1. 服务器的上传/下载能力。
  2. 网络定位,即不同机器有多少跳。
  3. 文件可以存档和发送吗
  4. 如何验证完整性(md5 哈希)

由于@Misch,现在我的计划仍然是相同的“洪流”。但是,如果所有服务器都在相同的 n/w 上并且具有相同的容量,那么;

  1. 将文件分成 2000 个部分,每个服务器获得 5GB/2000 ~ 2.5 MB(文件段)给主机,中央充当信标服务器,告诉其他服务器文件在哪里。

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

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

  1. 我们可以对单个文件段和所有文件组合使用一些校验和,以验证文件完整性。

这确保所有服务器都在接近其上行/下行带宽的情况下上传/下载。但很明显,在现实世界中,我可以拥有一个安全的种子文件,然后直接使用它。