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

IT-копирайтер
Время чтения: 3 минуты
Большая вычислительная нагрузка или наплыв посетителей неизбежно замедляют работу сайта. Работая над различными проектами, мы пробовали решить эту проблему разными путями:
- настройками сервера БД и установкой дублирующих серверов
- организацией механизма кэширования в 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 при разработке вашего веб-проекта.
Комментарии