2013-05-19 73 views
1

我想通過1 Gbps線路將駐留在單個服務器上的100 GB文件傳輸到網絡中的100個其他服務器。什麼是最好的方式來做到這一點?我的解決方案是將文件複製到k個服務器(例如9),然後將其餘(100-9)服務器分配給9個服務器中的每一個。 這是一個更好的解決方案,然後將文件從1臺服務器複製到100臺。我的問題是如何確定k?或者什麼是計算來確定k的最有效值。請建議是否有更好的解決方案。抱歉忘了提及..不能使用溺愛。並非所有公司都允許使用洪流。這是一個面試問題。感謝您的迴應。由於將文件從一個副本複製到100個服務器

+0

你可以在同一時間僅複製到一臺服務器? – bjskishore123

回答

0

如果您使用BitTorrent的文件在你的網絡分發,然後洪流軟件會照顧負載平衡爲你即你不需要預先計算「K」。我建議爲您的客戶使用utorrent,但任何客戶都可以。 Here is a tutorial for setting up the tracker etc

使用的BitTorrent的一個優點是,受援國服務器可以開始分發文件的大塊他們擁有整個文件之前。

+0

對不起忘了提..不能使用洪流。並非所有公司都允許使用洪流。這是一個面試問題。感謝您的迴應。謝謝 –

1

要有到要複製n服務器上的文件。如果可以並行完成複製,則您的方法是正確的,即在第一輪複製之後,將會有k服務器提供該文件的副本。如果從這些k服務器複製到其餘n-k服務器可以並行完成,那麼您的方法是理想的。

可以找到的k值如下,

選擇k使得ķ≤Ñ第(k + 1)>Ñ

+0

應該不是k^2 = n?考慮從1複製到100,k應該是9,k不能是10,如果k是10,那麼爲每k個服務器分配10個服務器,得到服務器總數> 100.謝謝 –

+0

同樣,如果我們可以利用完成第1個k之後,第1個服務器但是如果我們這樣做了,它會變得更加貼近bjskishore123的解決方案。 –

+0

對不起老兄。你是對的。你的公式是正確的。但重新是更有效的方法稱爲treedist。看到他稱之爲謀殺微博的視頻。 。謝謝反正 –

0

下,你可以把它當作一個動態規劃問題簡單化的假設:對於i = 1 ..ķ找到生產K複製的最快方式。在每一步中,考慮在前面的步驟中產生k-t個副本所需的時間,然後添加1個步驟來並行運行t個副本操作,其中t最好不大於k-t。

對於k是2的冪的情況,您可以在1步中產生2份(計數原稿),2步中產生4份...以7個步驟產生128份,這比它需要的更快假設從一臺機器上運行9份拷貝需要複製到單個目的地的時間是9倍,那麼要做第一個階段的9個拷貝。

但是,所有這一切都假定副本所花費的時間僅取決於源的出站帶寬 - 實際上我期望所有的網絡鏈路都靠近在一起並且相同,以便在同一時間風險彼此減慢,或者您的網絡鏈接彼此分開但不同,因此不同鏈接上的副本花費的時間不同。

你也應該考慮sneakernet - 複製到可移動USB或移動硬盤和攜帶設備到其目的地爲另一個本地副本。歷史上,嘗試用網絡鏈接替換sneakernet的親戚,而沒有提供現有sneakernet的有效帶寬,由於沒有提供足夠的網絡帶寬而失敗。

4

假設您一次只能複製到一臺服務器,則可以按如下所示進行操作。

  1. 主服務器複製到服務器S1。
  2. S1拷貝到S2(1份)
  3. S1拷貝到S3和S2拷貝到S4(並聯2個拷貝)
  4. 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(第一個副本後)

+1

我同意它的最佳解決方案。但是你不覺得用rsync來實現它會很困難。我不知道我們該如何實際執行這個。所以我在看DDD的解決方案。請分享你的想法。 –

0

我能想到的鴻溝和征服

100(50,50) - >(25,25) - >(12,13) - >(6,6) - >(3,3) - >(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

1

一種意見是在網絡上多播文件。這樣第一臺服務器將只發送一次文件(並且其他服務器同時接收文件)。它可能變得非常棘手,但我想這將是最快的方法。您可能需要設計自己的自定義協議,當一臺計算機丟失數據包時該怎麼做。

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

+0

謝謝你的回覆。所以你的意思是類似的。爲服務器創建一個多播組。併爲組播IP的所有服務器添加額外的NIC,然後編寫自定義的S/W以偵聽該IP? –

0
  1. 的bZIP文件進行壓縮,儘可能
  2. 它Rsync在所有其他機器
  3. 圍棋對你的堆棧,接下來的事情午餐/工作。

沒有提到時間限制,所以爲什麼要假設一個。它只會讓你自己變得更難。

+0

你是對的。 rsync -z可以做到這一點。比gzipping和rsync更好。謝謝回覆 –

0

兩個步驟:

  1. S00(服務器之一,具有該文件最初的傢伙)分割文件的第100塊,不保存塊磁盤,而是發送塊C01-C99到S01-S99分別。
  2. S00-S99將他們大塊他們的兄弟姐妹,但事業的人發送到S00

期待網絡上相當嚴重飽和!

1

我知道面試可能爲時已晚,但備案也許 你可以考慮這樣的事情:

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

或其他一些組播複製工具。無需爲每個 或某些接收客戶端重複數據包。你只需要發送一個數據包的副本,並且所有其他人都可以同時收聽!


相關問題