Увеличиваем отказоустойчивость парсинга/граббинга

Как я уже отмечал ранее, базы данных в последнее время становятся узким местом для приложений, предназначенных для парсинга, граббинга и сбора информации. Это связано с тем, что сейчас практически любой движок построен на основе четырех десятков таблиц и тучи сложных запросов, а когда на одном хостинге таких движков находится штук 100, то многого просить от БД не приходится, даже с учетом того, что MySQL (а чаще всего хостеры используют именно его) – чертовски быстрая штука при правильной настройке.

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

Например, на одном из хостингов клиента при запуске парсера через 20-30 минут MySQL выдавал «MySQL server has gone away» и после этого вся далее собранная информация уходила в трубу. Также не редкими были проблемы, когда MySQL просто умирал от нагрузок (понятное дело, что не со стороны моих парсеров). Я начал искать решение данной проблемы. Пробовал даже разработать систему отложенного выполнения запросов, ставил таймауты, когда не мог выполнить запрос. В общем, думал я над этой проблемой и пришел к выводу, что проще всего всю информацию записывать в CSV или SQL dump файл, а по окончании парсинга одним запросом выгружать это в БД.

У этого решения есть ряд преимуществ:

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

Но также есть и некоторые недостатки у подобного подхода:

  • сложнее ВИЗУАЛЬНО контролировать процесс сбора информации (это проблема для тех, кто привык смотреть как заполняются его базы данных :))
  • невозможно использовать информацию «на лету» - всегда надо дожидаться завершения парсинга

То есть данное решение стоит применять, например, в ночных парсерах для больших массивов данных. Так что советую людям, которые собирают информацию взять данную идею на заметку. Конечно же эти проблемы не касаются тех, у кого стоит с 10 выделенных серверов на гигабитном инете ;)

2 комментариев

  1. ACID Jesus:

    “проще всего всю информацию записывать в CSV или SQL dump файл, а по окончании парсинга одним запросом выгружать это в БД” - главное осталось не положить мускул в этот момент этим одним мегазапросом/пачкой запросов 8-)

  2. admin:

    Об этом вы не должны беспокоиться. Потому что по завершении сбора вы можете выгрузить дамп при помощи команды:
    mysql params < dump_file.sql
    которая сама возмет на себя ответственность по распределению нагрузки. Я выгружая даже дампы по 200-300 метров еще не разу не замечал, чтобы сервак падал.

Оставить комментарий