1 台のサーバーにある 100 GB のファイルを、ネットワーク内の 100 台の他のサーバーに 1 Gbps 回線で転送したいと考えています。それを行う最良の方法は何ですか?私の解決策は、ファイルをk台のサーバー(たとえば9台)にコピーし、残りの(100-9)台のサーバーを9台のサーバーのそれぞれに割り当てることです。これは、ファイルを 1 つのサーバーから 100 のサーバーに順番にコピーするよりも優れたソリューションです。私の質問は、 k を決定する方法ですか?またはkの最も効率的な値を決定するための計算は何ですか. より良い解決策があれば提案してください。申し訳ありませんが言及するのを忘れていました..トレントは使用できません。すべての企業が torrent を許可しているわけではありません。これはインタビューの質問です。あなたの応答に感謝します。ありがとう
9 に答える
一度に 1 つのサーバーにしかコピーできないと仮定すると、次のようになります。
- メイン サーバーがサーバー 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 に評価されます (最初のコピーの後)。
1 つの意見は、ネットワーク上でファイルをマルチキャストすることです。この方法では、最初のサーバーはファイルを 1 回だけ送信します (他のサーバーはファイルを同時に受信します)。非常にトリッキーになる可能性がありますが、これが最速の方法だと思います。おそらく、1 台のコンピューターがパケットを失ったときにどうするか、独自のカスタム プロトコルを考案する必要があります。
n
ファイルがコピーされるサーバーがあるとします。コピーを並行して実行できる場合、つまり、コピーの最初のラウンドの後、k
ファイルのコピーを持つサーバーが存在する場合、あなたのアプローチは正しいです。k
これらのサーバーから残りのサーバーへのコピーをn-k
並行して実行できる場合、このアプローチは理想的です。
の値はk
次のように求めることができます。
k 2 ≤ nおよび(k+1) 2 > nk
となるように選択します。
Divide and Conquer について考えることができます
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 を使用して LAN 経由でファイルを配布する場合、torrent ソフトウェアが負荷分散を処理します。つまり、「k」を事前に計算する必要はありません。クライアントにはutorrentを使用することをお勧めしますが、どのクライアントでも使用できます。 トラッカーなどの設定のチュートリアルはこちら
bittorrent を使用する利点は、受信サーバーがファイル全体を取得する前に、ファイルのチャンクの配布を開始できることです。
- ファイルを bzip して、可能な限り圧縮します
- 他のすべてのマシンに再同期します
- ランチに行き、スタックの次の作業に取り掛かります。
時間制限は言及されていないので、なぜそれを想定するのですか。それは自分にとって物事を難しくするだけです。
単純な仮定の下では、これを動的計画法の問題として扱うことができます。i = 1.. k の場合、k 個のコピーを生成する最速の方法を見つけます。各ステップで、前のステップで kt 個のコピーを生成するのにかかった時間を考慮してから、t 個のコピー操作を並行して実行するために 1 つのステップを追加します。ここで、t は k - t より大きくないほうがよいです。
k が 2 の累乗の場合、1 ステップで 2 部 (オリジナルを数えて)、2 部で 4 部... 7 部で 128 部作成できます。これは 9 部よりも高速です。 1 台のマシンで 9 つのコピーを実行すると、1 つの宛先にコピーする場合の 9 倍の時間がかかると仮定します。
ただし、これはすべて、コピーにかかる時間がソースの発信帯域幅のみに依存することを前提としています-実際には、すべてのネットワークリンクが互いに近く、同じであるため、同時に複数のコピーを実行すると速度が低下するリスクがあると予想されますまたは、ネットワーク リンクが大きく離れているが異なるため、異なるリンクを介したコピーにかかる時間が異なります。
また、sneakernet を検討する必要があります。リムーバブル USB またはリムーバブル ハード ドライブにコピーし、別のローカル コピーのためにデバイスを目的の場所に移動します。歴史的に、既存のスニーカーネットの有効な帯域幅を計算せずに、スニーカーネットの親戚をネットワーク リンクに置き換えようとすると、十分なネットワーク帯域幅が提供されずに失敗しました。