2012-07-04 1 views
0

Мне недавно задали этот вопрос в интервью. Предположим, у меня 2000 серверов. Я хочу передать файл на 5 ГБ на все эти серверы с централизованного сервера. Придумайте эффективный алгоритм.Эффективный способ передачи файлов на 1000 серверов

Мой ответ: Я буду использовать perl/python для архивирования файла с централизованного сервера на первый сервер. Параллельно я также отправлю файлы на другие серверы. Я чувствую, что делать один за другим очень неэффективно, поэтому параллельные операции ускоряются.

Есть ли лучший способ сделать это?

+2

Эффективность не всегда эффективна для ЦП. Параллельно это происходит, так как пропускная способность неэффективна, так как делает это последовательно. –

+0

Все, что я знаю, это то, что интервьюер хотел услышать что-то более продвинутое, чем отправить их параллельно ... – Ixx

+0

Должны ли мы предполагать, что все машины связаны с центральным коммутатором/маршрутизатором и имеют равную полосу пропускания? – jweyrich

ответ

10

Конечно, вы использовали бы какой-то скрипт, поскольку вы не хотите делать это вручную. Но вместо того, чтобы отправлять все файлы с одного сервера на все остальные, вы должны начать отправку файла на сервер k. Как только эти k-серверы получат файл (скажем, в момент времени t), они также могут начать распространять файл, поэтому после прибл. время 2 * t уже k^2 серверов имеют файл вместо 2 * k в исходном решении. После времени 3 * t уже k^3 Серверы получили файл ... Вы продолжаете с этим алгоритмом, пока каждый сервер не получит свой файл.

Чтобы сделать весь процесс еще немного быстрее, вы можете также разделить файл на куски, так что сервер может начать перераспределяя его, прежде чем он получил весь файл (вы будете в конечном итоге с чем-то вроде торрента)

+0

+1. Следует отметить, однако, что ускорение, которое вы можете достичь, делая это (или любой другой трюк с распараллеливанием), зависит от топологии сети (способ подключения серверов друг к другу). Кстати, общий термин для описываемого вами подхода - _scatter_. –

+3

Возможно, не то, что хотел услышать интервьюер, но вы также можете использовать многоадресную рассылку. Многоадресная рассылка пока не широко распространена по сегодняшний день, но некоторые провайдеры используют ее в своей собственной сети для предоставления IPTV своим клиентам. – Misch

4

Определенно «торрент» - лучшая и проверенная стратегия балансировки нагрузки в этом сценарии. Но я думаю, что когда интервью задает мне такой гипотетический вопрос, она, вероятно, также ищет ваши предположения и ожидает встречных вопросов.

  1. загрузить/загрузить емкость серверов.
  2. локализация сети, т. Е. Сколько хмелей - разные машины.
  3. может файл в архив и отправить
  4. как проверить целостность (md5 хэш)

Теперь моя схема остается той же «торрентов» благодаря @Misch. Но если все серверы находятся на одном и том же n/w и имеют такую ​​же емкость;

  1. Разделить файл на 2000 частей, каждый сервер получает 5GB/2000 ~ 2.5 MB (сегмент файла) для размещения и центральных выступает в качестве сервера радиомаяка сказать другому серверу, где файлы.

  2. Каждый сервер будет загружать эти куски в случайный порядок с другого сервера, если мы загружаем последовательно, то это вызывает узкое место на одной машине.

В зависимости от машины мы можем иметь максимальную активную загрузку/загрузку потоков, каждый поток вверх/вниз по отдельному сегменту файла. когда сервер обслуживает максимальные хосты, он может отклонить запрос загрузки файла. Запрос хоста будет простой выбор другого случайного сегмента для загрузки.

  1. Мы можем использовать контрольную сумму для отдельного сегмента файла & все файлы, объединенные для проверки целостности файла.

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

+0

После прочтения ответа @Mansoor Siddiqui, я думаю, что разделение на n (= 2000) серверов будет не очень хорошим, вместо этого файл следует разделить на бесконечно маленькие куски. – d1val

+0

Лучший ответ, если вы спросите меня! – laike9m

1

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

В самом деле, с бесконечно малым размером куска (то есть чисто теоретический случай), то время, которое требуется, чтобы распространять файл размером m на n серверов даже не зависит от значения n - только на размер распространяемого файла (т.е. O (m)). Разумеется, в практическом случае есть некоторые накладные расходы/детали, которые необходимо рассмотреть (что хорошо видно из d1val), что на практике делает его более продолжительным.

И наоборот, если у вас есть каждый сервер загрузить файл на другой сервер только после того, как он получил весь файл, то время работы составляет O (m журнала (n)) - асимптотический больше битторрента подхода.

Также, чтобы добавить, обычно, когда интервью задает такой вопрос, он/она спрашивает об этом алгоритме, а не о деталях реализации.

0

Мне задавали аналогичный вопрос, где торренты дела не принимаются. Вопрос состоял в том, «Если Microsoft будет вынуждена обновлять программное обеспечение до 2000 серверов, которые у нее есть в США, то как бы это сделать». Таким образом, эти серверы не способны выполнять передачу файлов на основе торрентов.

Мой ответ был: На главном сервере, имеющем список из 2000 узлов, есть процесс пакетной обработки, емкость партии будет определяться скоростью сети, которую вы имеете на этих узлах.

  1. Итак, сначала выберите образец из 100 узлов и выполните проверку скорости через этот узел. Тест скорости даст указание на то, что средняя скорость, которая доступна на этих 100 узлах, и может быть, что действует как образец для всей сети.

  2. Итак, теперь у вас есть значение X Мбит/с - это скорость, с которой вы можете совершить переход к этим узлам.

  3. Посмотрите на свою собственную скорость исходящих данных. Таким образом, если центральный сервер имеет емкость YGbps как его скорость загрузки

тогда размер пакетирования = Загруженная Производительность (Y)/X (скорость найденной SpeedTest).

В соответствии с этим размером партии вы перемещаетесь вперед в параллельном переносе на сервер 2000 партий.

Любые входы?