memcached в веб-кластере 1С-Битрикс решает две задачи: общий кеш для всех веб-нод и хранилище сессий. Разберём, как собрать пул серверов, как распределяются ключи и что контролировать в продакшене.
Зачем memcached в кластере
В одиночной инсталляции Битрикс кеширует данные на локальном диске (/bitrix/managed_cache/). В кластере это не работает: каждая нода имела бы свой кеш, и данные расходились бы. Общий memcached делает кеш единым для всех нод.
Второй эффект — скорость. memcached держит данные в оперативной памяти и отдаёт их за микросекунды, разгружая базу от повторных запросов. Управляемый кеш Битрикс (теги, зависимости) полностью работает поверх memcached.
Пул серверов и распределение ключей
Кластеризация memcached в Битрикс — это пул из нескольких инстансов. Ключи распределяются между ними алгоритмом хеширования: каждый ключ детерминированно попадает на «свой» сервер. Это даёт горизонтальное масштабирование объёма кеша — добавили инстанс, увеличили суммарную память.
// bitrix/.settings.php
'cache' => array(
'value' => array(
'type' => 'memcache',
'servers' => array(
array('host' => '10.0.0.21', 'port' => 11211, 'weight' => 1),
array('host' => '10.0.0.22', 'port' => 11211, 'weight' => 1),
),
),
),Важно: все веб-ноды должны видеть один и тот же список серверов в одинаковом порядке. Иначе хеширование на разных нодах даст разное распределение, и кеш перестанет быть общим.
Настройка в Битрикс
Подключить memcached можно двумя способами:
- Через административную панель —
Настройки → Веб-кластер → Memcached, где добавляются серверы пула. - Напрямую в
bitrix/.settings.php(секцияcache) — предпочтительно для инфраструктуры-как-код и одинаковой конфигурации нод.
В BitrixVM memcached ставится и конфигурируется через меню bx. Объём памяти под кеш задаётся параметром -m в конфиге memcached и подбирается по рабочему набору данных.
Кеш и сессии на одном пуле
memcached в кластере часто используется и под кеш, и под сессии. Это удобно, но требует осторожности:
| Данные | Что будет при сбросе |
|---|---|
| Управляемый кеш | Перечитается из БД, только рост нагрузки |
| Сессии | Пользователи разлогинятся |
Hit rate и вытеснение
Главная метрика памяти кеша — hit rate (доля попаданий). Низкий hit rate означает, что кеш не успевает прогреться или памяти мало, и данные постоянно вытесняются. Проверить статистику можно так:
echo -e "stats\r\n" | nc 10.0.0.21 11211 | grep -E 'get_hits|get_misses|evictions'get_hits/get_misses— считайте отношение, целитесь в высокий процент попаданий.evictions— рост означает нехватку памяти: увеличьте-mили добавьте инстанс в пул.- Следите за
curr_connections, чтобы не упереться в лимит соединений.
Отказоустойчивость пула
memcached не реплицирует данные между инстансами. Если один сервер пула падает, ключи, которые на него хешировались, становятся недоступны — это кеш-промахи, которые компенсируются чтением из БД. Сайт продолжит работать, но нагрузка на БД скакнёт.
- Не размещайте весь пул на одной физической машине — теряется смысл распределения.
- Под сессии в memcached падение инстанса означает разлогин части пользователей — ещё один аргумент за Redis для сессий.
- Для критичных сценариев рассмотрите Redis с репликацией вместо memcached.
memcached хорош именно как быстрый разделяемый кеш; отказоустойчивость данных — не его задача.
Итог
Кластеризация memcached в 1С-Битрикс — это пул инстансов с хешированием ключей, дающий общий быстрый кеш и, при желании, хранилище сессий. Ключевые правила: одинаковый список серверов на всех нодах, контроль hit rate и evictions, разделение кеша и сессий. memcached не реплицирует данные, поэтому отказоустойчивость закладывают на уровне архитектуры.
Мы настраиваем кеширование под нагрузку: подбираем объём памяти, разносим кеш и сессии, добавляем Redis там, где нужна персистентность, и выстраиваем мониторинг hit rate. Это один из самых дешёвых способов снять нагрузку с базы данных.
Частые вопросы
Реплицирует ли memcached данные между инстансами?
Нет. В пуле каждый ключ хранится только на одном инстансе по хешу. При падении сервера его ключи теряются и перечитываются из БД как кеш-промахи.
Почему список серверов должен быть одинаков на всех нодах?
Ключи распределяются хешированием по списку серверов. Разный список или порядок на нодах даст разное распределение, и кеш перестанет быть общим.
Что произойдёт при очистке кеша memcached?
Управляемый кеш перечитается из базы — вырастет нагрузка на момент прогрева. Если на том же пуле лежат сессии, пользователи разлогинятся.
Как понять, что памяти memcached не хватает?
По растущему счётчику evictions в статистике и снижению hit rate. Это сигнал увеличить память (-m) или добавить инстанс в пул.
Стоит ли хранить сессии в memcached?
Можно, но из-за отсутствия персистентности их лучше выносить в Redis или БД. Если держите в memcached — на отдельном инстансе от кеша.
Где настраивается пул — в панели или в файле?
Оба варианта работают. Для одинаковой конфигурации всех нод и инфраструктуры-как-код удобнее прописывать серверы в bitrix/.settings.php.
Memcache и memcached — это одно и то же в настройках?
Это два разных PHP-расширения с похожим API. Битрикс работает с обоими; важно, чтобы на всех нодах использовалось одно и то же расширение и версия.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.