我最近在接受采访时被问到这个问题.让我们假设我有2000台服务器.我想从中央服务器将5GB文件传输到所有这些服务器.想出一个有效的算法.
我的回答:我将使用perl/python将文件从集中式服务器scp到第一台服务器.与此同时,我也将开始向其他服务器发送文件.我觉得一个接一个地做效率非常低,因此并行做会加快.
有一个更好的方法吗 ?
Mis*_*sch 12
当然,你会使用某种脚本,因为你不想手动这样做.但是,您可以开始将文件发送到k服务器,而不是将所有文件从一个服务器发送到所有其他服务器.一旦这些k服务器收到文件(假设在时间t),他们也可以开始分发文件,所以在约.时间2*t已经k ^ 2服务器在原始解决方案中具有文件而不是2*k.在时间3*t之后k ^ 3服务器已经获得了文件...继续该算法,直到每个服务器都有它的文件.
为了使整个过程更快一些,您还可以将文件分成块,以便服务器可以在收到整个文件之前开始重新分发(最终会有像torrent这样的东西)
在这种情况下,“洪流”绝对是负载平衡的最佳且经过验证的策略。但我认为,当面试问我这样一个假设性的问题时,她可能也在寻找你的假设并期待反问。
由于@Misch,现在我的计划仍然是相同的“洪流”。但是,如果所有服务器都在相同的 n/w 上并且具有相同的容量,那么;
将文件分成 2000 个部分,每个服务器获得 5GB/2000 ~ 2.5 MB(文件段)给主机,中央充当信标服务器,告诉其他服务器文件在哪里。
每个服务器都会从其他服务器以随机顺序下载这些块,如果我们按顺序下载,则会导致一台机器出现瓶颈。
根据机器,我们可以拥有最大活动上传/下载线程,每个线程上/下单独的文件段。当服务器为最大主机提供服务时,它可以拒绝文件下载请求。请求主机将简单地选取另一个随机段进行下载。
这确保所有服务器都在接近其上行/下行带宽的情况下上传/下载。但很明显,在现实世界中,我可以拥有一个安全的种子文件,然后直接使用它。
| 归档时间: |
|
| 查看次数: |
4117 次 |
| 最近记录: |