Архитектура - Как эффективно сканировать Интернет с 10 000 машин? - PullRequest
5 голосов
/ 31 октября 2011

Давайте представим, что у меня сеть из 10000 машин.Я хочу использовать все эти машины для максимально быстрого сканирования Интернета.Все страницы должны быть загружены только один раз.Кроме того, не должно быть единой точки отказа, и мы должны минимизировать количество коммуникаций, необходимых между машинами.Как бы вы достигли этого?

Есть ли что-нибудь более эффективное, чем использование согласованного хеширования для распределения нагрузки по всем машинам и минимизации связи между ними?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012
  1. Используйте распределенную систему Map Reduction , такую ​​как Hadoop , чтобы разделить рабочее пространство.
  2. Если вы хотите быть умным или делать это в академическом контексте, попробуйте Нелинейное уменьшение размера .
  3. Простейшая реализация, вероятно, заключалась бы в использовании хеширующей функции для клавиши пространства имен , например. доменное имя или URL. Используйте Chord , чтобы назначить каждой машине подмножество значений хеш-функции для обработки.
0 голосов
/ 31 октября 2011

Одной из идей было бы использование рабочих очередей (каталогов или БД), при условии, что вы будете использовать хранилище таким образом, чтобы оно соответствовало вашим критериям избыточности.

\ retrieve

\ retrieve \server1

\ retrieve \ server ...

\ retrieve \ server10000

\ in-process

\ complete

1.) Все страницы, которые будут семенами, будут хэшироваться и помещаться в очередь с использованием хэша в качестве корневого файла.

2.) Перед помещением в очередь вы проверяете полные и незавершенные очереди, чтобы убедиться, что выне ставить в очередь

3.) Каждый сервер извлекает случайные пакетные файлы (1-N) из очереди извлечения и пытается переместить их в личную очередь

4.) Файлыесли произошел сбой процесса переименования, предполагается, что он «запрошен» другим процессом

5.) Файлы, которые можно переместить, должны быть обработаны, поместите маркер в каталог в процессе, чтобы предотвратить повторную очередь.

6.) Загрузите файл и поместите его в очередь \ Complete

7.)Очистите файл из каталогов внутри процесса и сервера

8.) Каждые 1000 прогонов проверяют самые старые 10 файлов внутри процесса, пытаясь переместить их из своих очередей на сервер обратно в общую очередь извлечения.Это поможет, если сервер зависает, а также должен балансировать нагрузку на медленных серверах.

Для извлечения, внутрипроцессных и полных серверов большинство файловых систем ненавидят миллионы файлов в одном каталоге, разделите хранилище на сегменты по символамхэша \ abc \ def \ 123 \ будет каталогом файла abcdef123FFFFFF….Если бы вы масштабировали до миллиардов загрузок.

Если вы используете базу данных mongo вместо обычного файлового хранилища, многих из этих проблем можно избежать, и вы сможете извлечь выгоду из шардинга и т. Д. *

...