memcache

УрокОтдаём кэш анонимов без поднятия бэкэнда. Drupal 7 + nginx + memcached.

Помните статью о снижении нагрузки с помощью Memcache Storage? Там Drupal отдавал анонимам кэш на второй фазе бустрапа, что существенно снижало нагрузку на сайт, особенно его посещали преимущественно анонимные пользователи. Там отдача страницы происходила за 50-70мс. Однако я решил этим не ограничиваться, и отдавать кэш вообще без поднятия бэкэнда (на большинстве хостингов это apache). Таким образом мало того, что отдача страницы происходит в десятки раз быстрее, так ещё и не расходуется память на новые процессы апача (или любого другого бэкэнда).

Чтобы понимать, что происходило раньше при отдаче страниц анонимам (по материалам этой статьи), я накидал небольшую схему:

БлогКэш страниц. Снижение нагрузки на сервер с помощью Memcache Storage Page Cache

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

Page Cache в Drupal 7

Эту часть я разобью на 3 небольших ступени, каждую из которых необходимо полностью понимать.

Ступень первая. Ядро Друпала содержит механизм кэширования отображаемых html страниц для анонимных пользователей. Вполне разумно - какой смысл создавать каждый раз одну и ту же страницу, если можно сгенерировать её для одного анонима, а остальным отдавать уже готовый результат. В таком случае Друпал не будет каждый раз вызывать функцию для генерации и рендера страницы, а лишь заберёт страницу из кэша и сразу отдаст её пользователю.

БлогПеренос кэшированых данных в оперативную память. Memcache Storage.

Memcache Storage

Не так давно я писал про изменение места хранения кэша. В этой статье основной пример основывался на использовании модуля Memcache, который позволяет перенести хранимый кэш из базы данных в оперативную память. На момент написания статьи я достаточно давно и активно им пользовался, и в целом, был доволен результатом. Однако было три основных и достаточно неприятных момента, с которыми я постоянно сталкивался:

Инвалидация кэша

Основная проблема кроется в плохой обработке временного кэша. При хранении в базе данных такие данные помечались флагом -1 (CACHE_TEMPORARY) и обрабатываются обычными sql запросами. Однако мемкэш не предполагает сохранения кэша с отрицательным ключём. Он умеет хранить данные либо вечно (пока оперативная память не будет очищена, или данные не будут удалены явным образом), либо какое-то определённое время. Данные с временным сроком истечения кэша приходилось обрабатывать отдельно, и модуль Memcache справлялся с этим не самым лучшим образом.

УрокСистема кэширования Drupal 7. Часть третья: ускоряемся за счёт изменения места хранения кэша.

По умолчанию Друпал хранит весь кэш в базе данных (см. сегменты кэша). Однако для высоконагруженного проекта чем меньше вы нагружаете базу данных - тем быстрее будет отдаваться контент и, соответственно, вы минимизуете риск образования бутылочного горлышка на вашем сайте. Сегодня я хотел бы рассказать каким образом можно вынести хранение кэша в другое место, а так же спалить достаточно простой способ тюнинга сайта, чтобы он смог выдержать большую нагрузку для анонимных посетителей.

Меняем хранилище кэша

Чтобы несколько разгрузить базу данных, хорошей практикой считается вынос кэша вне базы данных. Например, в оперативную память. Логика здесь простая - зачем нам обращаться к жёсткому диску, если можно получить данные быстрее из оперативной памяти, которая, собственно, для этого и предназначена? Одной из библиотек, позволяющих это реализовать, является Memcache Storage. На его примере я и объясню как это работает.