Повышаем скорость загрузки сайтов на Drupal с MongoDB

автор Константин Медведев

14 Янв 2013

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

  • настройками сервера БД и установкой дублирующих серверов
  • организацией механизма кэширования в Memcached
  • частичным снятием нагрузки с MySQL за счет хранения «подогретых» данных в MongoDB

Сегодняшний пост — для веб-разработчиков, которые хотят повысить стабильность и скорость загрузки сайта. Инструмент — MongoDB.

«Узким» местом Drupal является организация хранения сущностей или нод. Если нод много и разные типы нод переплетены друг с другом, то запросы к реляционной БД будут слишком тяжелыми. Проведи мы анализ запросов, станет понятно, что больше всего ресурсов уходит на то, чтобы «подтянуть» полную информацию о ноде и связанных с ней сущностях. Данные в MongoDB нужно загружать по следующей схеме:

 

Таким образом, если сервер MongoDB недоступен, то мы подгружаем данные из MySQL. Это принцип отказоустойчивости — работать система будет медленно, зато будет доступна для использования. Другой важный момент — мы не делаем разделение на то, какие данные храним только в  MongoDB, а какие только в MySQL. Все данные Drupal по-прежнему сохраняются в MySQL, а в  MongoDB мы складываем только то, что нам нужно по следующей схеме:

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

  • Не доставайте всю информацию о ноде из MySQL, только nid, тогда запрос станет намного легче
  • Для подгрузки ноды используйте функцию mongo_node_load ($nid)
  • Для views используйте views row style plugin, т.е. вытягивайте nid'ы посредством MySQL, а остальные данные подтягивайте из MongoDB, и уже тогда делайте темизацию в нужном build mode

Использовать такой подход можно в любых высоконагруженных проектах, не обязательно Drupal и PHP, главное, понять логику: реляционную БД используем для получения идентификаторов документов (нод), а MongoDB — для получения самого документа. Более того, MongoDB имеет много встроенных функций, которые вы можете использовать в зависимости от архитектуры вашей системы.

Использование MongoDB лучше закладывать в самом начале проекта. Например, если сайт предполагает большое количество информации, а требование по времени генерации страницы составляет 0,5 секунды, то, скорее всего, вы столкнетесь с проблемой производительности на этапе нагрузочного тестирования, и лучше предусмотреть использование MongoDB.

Пост получился довольно обзорным, поэтому с удовольствием отвечу на вопросы по использованию MongoDB при разработке конкретно вашего веб-проекта.

  • 0 Репосты

Комментарии

Фильтр

Закрыть

Технологии

Индустрии