2009-11-03 2 views
1

Ниже приведен сценарий и некоторые предлагаемые решения. Есть ли лучшие решения?Масштабирование системы, связанной с базой данных?

Существует система A, которая должна «анализировать» множество URL-адресов. Другая система B генерирует эти URL-адреса - в настоящее время их насчитывается около 10 миллионов в базе данных. Пример схемы:

id URL has_extracted 
1 abc.com 0 
2 bit.ly 1 

Мои решения заключаются в следующем:

Наивное решение: Есть Perl скрипт/процесс, который питает URL (из базы данных) в системе B и обновляет has_extracted столбец Проблема с этим подходом заключается в том, что он плохо масштабируется.

Решение 2: Разбить базу данных на пять (или n) таблиц. (Я планирую удалить has_extracted колонки, потому что кажется такой масштабируемостью узкость в этом сценарии.)

Решения 3: Удалите has_extracted колонки Создайте другую таблицу, которая поддерживает/отслеживает последний URL отслеживаемого каждым обработать.

Критические запросы/Предлагаемые решения. Заранее спасибо.

+0

10 миллионов - это арахис. Легко вписывается в ОЗУ. – MSalters

+1

Какие доказательства вы используете, чтобы решить, что база данных является узким местом? – APC

+0

MSalters - Я никогда не говорил, что он не поместится в ОЗУ. Вы предлагаете мне прочитать все эти URL-адреса в памяти. Если да, то каким образом я могу поддерживать состояние данного URL-адреса - что он был проанализирован. –

ответ

1

Почему ваше наивное решение не масштабируется? если вы используете массовые обновления и фиксируете нечасто, вы можете обновлять 1 миллион строк в секунду в любой базе данных без какой-либо настройки.

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

Если у вас есть постоянное количество экземпляров системы A, например. 17, вы можете использовать функцию id%17 как функцию хэша.

+0

Затем мы запускаем только один экземпляр системы A, тогда как ресурсы позволяют намного больше! –

+0

Спасибо, Шачар. Проблема с использованием оператора modulo «%» для разделения задач между процессами заключается в том, что некоторые из URL-адресов должны будут запускаться снова в системе A. Например, я изначально запускаю 10 процессов, а затем добавляю больше аппаратных средств и решаю работать с 20 ... то, не будет ли система A анализировать одни и те же URL снова? –

+0

Нет, если вы отметили, что эти URL уже обработаны, используя столбец has_extracted (или другой выделенный столбец) – Shachar

0

Я думаю, что это может быть следующим:

  1. генератор URL (1шт или много PCS)
  2. стека URL (1шт) процессор
  3. URL (много шт)

URL генератор (ы) генерирует URL-адреса и выталкивает их все в стек, скажем, в базе данных. Или в памяти или где вы хотите.

Обработчики URL-адресов просматривают стек URL-адресов, чтобы дать им следующий URL-адрес для обработки. URL Stack дает им URL-адрес и отмечает его как заданный или удаляет его. Когда обработчик URL-адреса завершает обработку URL-адреса, он снова обращается к стеку URL-адресов и говорит, что он завершил обработку URL1 и хочет обработать URL2. URL Stack может затем пометить/удалить URL1 из своего списка и указать URL2.

Если стек URL-адресов становится узким, вы можете просто кластеризовать базу данных.

+0

Спасибо FractalizeR. Предположим, что есть два URL-процессора X и Y. Если стек URL-адресов предоставляет URL100 для X, который не входит в странное состояние/занимает много времени, и т. Д., Тогда не будет указан тот же URL100 для Y, поскольку URL-адрес процессор X не отметил, что этот URL-адрес завершен. –

+0

это ничем не отличается от использования базы данных в первую очередь, с has_extracted column (может добавить еще один столбец was_picked_up_for_analysis). – Shachar

+0

2Bart J: Это зависит от того, что вы хотите. Отметьте URL-адреса как заданные и дайте их снова через некоторое время, и если они не отмечены как завершенные. –

0

Я как-то чувствую, что моя проблема аналогична той, что была размещена на этом link (приведенная ниже выдержка). Решение в вышеупомянутой ссылке и это link - «Базы данных сосут для обмена сообщениями» дали мне лучшее направление при реализации лучшего решения.

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

Смежные вопросы