2013-05-19 1 views
1

Я хочу передать файл размером 100 ГБ, который находится на одном сервере, на 100 других серверах в сети с пропускной способностью более 1 Гбит/с. Каков наилучший способ сделать это? Мое решение - скопировать файл на число серверов (скажем, 9), а затем назначить оставшиеся (100-9) серверы каждому из 9 серверов. Это лучший способ решения, затем копирование файла с 1 сервера на 100 последовательно. Мой вопрос в том, как определить k? или каков расчет для определения наиболее эффективного значения k. Пожалуйста, предложите, есть ли лучшее решение. извините забыл упомянуть .. НЕ МОЖЕТ ИСПОЛЬЗОВАТЬ ТОРРЕНТ. не все компании допускают торрент. Это вопрос интервью. Цените свой ответ. Спасибокопия файла с одного до 100 серверов

+0

вы можете копировать только к одному серверу одновременно? – bjskishore123

ответ

0

Если вы используете bittorrent для распространения файла по вашему lan, то торрент-программное обеспечение позаботится о балансировке нагрузки для вас, то есть вам не нужно предварительно компилировать «k». Я рекомендую использовать для своих клиентов utorrent, но любой клиент сделает это. Here is a tutorial for setting up the tracker etc

Преимущество использования bittorrent в том, что серверы получателей могут начать раздавать куски файла до того, как у них будет весь файл.

+0

извините забыл упомянуть .. не могу использовать торрент. не все компании допускают торрент. Это вопрос интервью. Цените свой ответ. Спасибо –

1

Пусть будут n серверы, на которые будут копироваться файлы. Ваш подход правилен, если копирование может выполняться параллельно, то есть после начального раунда копирования будет k серверов с копией файла. Если копирование с этих серверов k на оставшиеся серверы n-k можно выполнить параллельно, тогда ваш подход будет идеальным.

Вы можете найти значение k следующим образом,

Выберите k таким образом, что к ≤ п и (к + 1) > п.

+0

should'nt это k^2 = n? Рассмотрите возможность копирования от 1 до 100, k должно быть 9, k не может быть 10, если k равно 10, а затем присвоение 10 серверов для каждого k-серверов получает общее количество серверов> 100. Спасибо –

+0

Также было бы неплохо, если бы мы могли использовать 1-й сервер тоже после 1-го k. Но если мы это сделаем, это станет больше из решения bjskishore123. –

+0

извините, чувак. Вы были правы. ваша формула правильная. Но re - более эффективный метод, называемый treedist. см. видео под названием kill hby twitter, где он упоминает об этом немного. , Спасибо Anyways –

0

В упрощенных предположениях вы можете рассматривать это как проблему динамического программирования: для i = 1 .. k найти самый быстрый способ для создания k копий. На каждом шаге рассмотрите время, затраченное на создание k-t-копий на предыдущих шагах, а затем добавьте 1 шаг для параллельной работы t операций копирования, где t лучше не больше k-t.

Для случая, когда k является силой двух, вы можете создать 2 копии (считая оригинал) в 1 шаг, 4 копии в 2 шага ... 128 копий в 7 шагов, что быстрее, чем это потребуется чтобы сделать 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 пау 0, 2 пау 1, 2 и т.д. пау 2

1 + 2 + 4 + 8 + 16 + 32 + 64> 100

Таким образом, число копий S1 должен сделать можно найти с помощью этой формулы

(2 pow k >= 100) and (2 pow (k-1) < 100) 

В этом случае, к оценивает 7 (После того, как первый экземпляр)

+1

Я согласен, что это лучшее решение. Но разве вы не думаете, что его будет сложно реализовать с чем-то вроде rsync. Я не знаю, как мы можем практически реализовать это. Поэтому я рассматривал решение DDD, опубликованное выше. Пожалуйста, поделитесь своими мыслями. –

0

Я могу думать о Divide и Conquer

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, Server 2 на сервер 52 ... 50 сервера к серверу 100

1

Одно мнение является файлом многоадресной рассылки в сети. Таким образом, первый сервер будет отправлять файл только один раз (и другие серверы будут получать файл одновременно). Это может стать очень сложным, но я думаю, что это было бы самым быстрым способом. Вероятно, вам нужно разработать собственный протокол, что делать, когда один компьютер теряет пакет.

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

+0

Спасибо за ответ. Значит, ты имеешь в виду нечто подобное. Создайте многоадресную группу для серверов. И дополнительный сетевой адаптер для всех серверов для IP-адреса многоадресной передачи, а затем написать пользовательские s/w для прослушивания на этом IP-адресе? –

0
  1. BZIP файл сжать его как можно больше
  2. RSync его всем другим машинам
  3. Go на обед/Работа на следующую вещь в вашем стеке.

Не было указано ограничение времени, поэтому предположим один. Это просто усложняет для себя.

+0

Вы правы. rsync -z делает трюк. лучше, чем gzipping, а затем rsync. Спасибо за ответ –

0

два шага:

  1. S00 (сервер один, парень, имеющий файл изначально) разбивает файл на 100 кусков, не экономя на куски на диск, но вместо отправки кусков C01-C99 для S01-S99 соответственно.
  2. S00-S99 посылает свой кусок на своих братьев и сестер, но причины никто не посылает S00

Ожидать сеть насыщенными очень плохо!

1

Я знаю, что для интервью может быть слишком поздно, но и для записи, может быть вы могли бы рассмотреть что-то вроде этого:

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

или какой-либо другой групповой инструмент копирования. Не нужно повторять пакеты для каждого или некоторых принимающих клиентов. Вы просто отправляете одну копию пакета и все остальные слушают одновременно!

Пан