Веб-кластер 1С-Битрикс - репликация, memcached, сессии
Когда одного сервера перестаёт хватать, в дело вступает модуль веб-кластера: репликация базы с балансировкой чтения, распределённый кеш, централизованные сессии. Разберём, из чего собирается кластер и какие ошибки в нём стоят дороже всего.
Как это работает
Что даёт модуль. Распределение одного сайта на несколько серверов, вертикальный шардинг, репликацию базы с балансировкой, распределённый кеш memcached, хранение сессий в базе и кластеризацию веб-сервера. Доступен в старших редакциях; полноценная репликация master-master - в «Энтерпрайз».
Репликация master-slave. Запись идёт в master, чтение - со slave. Начиная с версии главного модуля 24.0.0 на slave может уходить вся нагрузка чтения: платформа отслеживает изменённые таблицы и, если они не менялись, продолжает читать со slave. После записи последующие чтения в том же процессе идут с master, потому что у репликации есть задержка.
Проектирование идёт от вида нагрузки. Упирается процессор - добавляют веб-ноды за балансировщиком, локальный memcached на каждой и синхронизацию контента. Упирается база - настраивают master-slave. Интенсивно используется кеш - memcached на каждой ноде.
Типовые архитектуры три: полные ноды (минимум две, базовая отказоустойчивость), раздельные ноды (минимум четыре, веб и база отдельно, гибкое масштабирование) и гео-кластер для максимальной отказоустойчивости.
Сессии в кластере нельзя хранить в файлах. Запросы одного пользователя попадают на разные ноды, и авторизация теряется. Варианты: хранение в базе, хранение в памяти или привязка клиента к ноде на балансировщике.
Шардинг подробно разобран в статье о базе данных. Веб-кластер поддерживает только вертикальный шардинг базы - вынос таблиц веб-аналитики и поиска на отдельный сервер, без горизонтального распределения данных.
Примеры
1. Локальные изменения без срыва балансировки
// D7$connection = \Bitrix\Main\Application::getConnection();$connection->useMasterOnly(true);
// операции записи
$connection->useMasterOnly(false);// легаси$DB->StartUsingMasterOnly();// операции записи$DB->StopUsingMasterOnly();Смысл в следующем: любой запрос на изменение переключает текущий хит на master и фактически выключает балансировку до конца запроса. Явное обёртывание локальных изменений помогает этого избежать. Но помните: сразу после записи читать со slave нельзя - он может быть ещё не синхронизирован.
Провоцируют срыв балансировки и служебные файлы, которые выполняют изменяющие запросы в начале каждого хита.
2. Настройка memcached
memcache.hash_strategy = consistentПараметр по умолчанию выключен, а без него отказ одного сервера memcached перетасовывает все ключи между оставшимися - кеш массово промахивается, и вся нагрузка мгновенно уходит в базу. Согласованное хеширование этого не допускает.
Память наращивают шагами по 32 мегабайта, начиная со 128, и следят за долей попаданий - она должна стремиться к сотне процентов.
3. Подключение к базе
В файле настроек на всех серверах указывают прямой адрес master-базы, а не локальный хост. Между серверами нужен быстрый канал.
Отдельно задают порог отставания slave: при превышении он автоматически отключается, чтобы пользователи не читали устаревшие данные.
Справочник
| Элемент | Назначение | Особенности |
|---|---|---|
| Модуль «Веб-кластер» | распределение сайта на несколько серверов | доступен в старших редакциях |
| master-slave репликация | запись в master, чтение со slave | после записи чтение идёт с master |
| Порог отставания slave | защита от рассинхронизации | при превышении slave отключается |
useMasterOnly() | явное указание писать в master | легаси-аналог - методы старого ядра |
| memcached на нодах | распределённый кеш | обязательно согласованное хеширование |
| Сессии в базе | централизованное хранение | снижает скорость генерации на несколько процентов |
ip_hash на балансировщике | привязка клиента к ноде | альтернатива централизованным сессиям |
auto_increment_increment / offset | разнесение генерации идентификаторов | обязательно для master-master |
Частые ошибки
Сессии остались в файлах. Авторизация на одной ноде теряется на другой. Централизуйте хранение или привязывайте клиента к ноде.
Забыли согласованное хеширование memcached. Отказ одного сервера кеша приводит к массовому промаху и лавинообразной нагрузке на базу.
Срыв балансировки на каждом хите. Изменяющий запрос в начале запроса переключает всё чтение на master. Ищите служебные файлы с изменяющими запросами и оборачивайте локальные изменения явно.
Slave добавили к большой базе без подготовки. Проект встаёт. Правильный порядок - предварительный дамп, ручное добавление в репликацию и только потом регистрация узла.
Сессии в базе на одиночном сервере. Это лишняя нагрузка: централизация нужна кластеру, а на одном сервере сессии держат в памяти.
Master-master без разнесения идентификаторов. Два узла начнут выдавать одинаковые значения автоинкремента. Настраивают шаг и смещение: один узел выдаёт чётные, другой нечётные.
Служебные порты открыты наружу. Публично на балансировщике оставляют только веб-порты, доступ к кешу и синхронизации закрывают файерволом.
Частые вопросы
Когда пора собирать кластер?
Когда исчерпаны более дешёвые варианты: код без запросов в цикле, кеширование, композитный сайт, настроенные акселератор и база. Кластер решает две задачи - масштабирование за пределы одного сервера и отказоустойчивость, - но добавляет сложность: репликацию, синхронизацию контента, централизованные сессии. Если сайт тормозит из-за некешированного компонента, кластер это не вылечит.
Где хранить сессии при нескольких веб-серверах?
Не в файловой системе - иначе запросы одного пользователя попадут на разные ноды и авторизация потеряется. Варианты: централизованное хранение в базе (просто, но добавляет нагрузку и немного замедляет генерацию), хранение в памяти через memcached или Redis (быстрее) либо привязка клиента к ноде на балансировщике. На одиночном сервере переносить сессии в базу не нужно.
Что такое срыв балансировки и как его избежать?
Любой изменяющий запрос переключает текущий хит на master, и до конца обработки чтение идёт мимо slave. Если такой запрос выполняется в начале каждого хита - например, из служебного файла подключения, - балансировка не работает вообще. Локальные изменения оборачивают явным указанием писать в master, а после записи не читают данные сразу: репликация имеет задержку.
Связанные темы
- Производительность - что сделать до кластера
- Кеширование - уровни кеша
- База данных - альтернативные бэкенды
- Окружение - BitrixVM и роли серверов
- Раздел Производительность
- Вынос базы и кэша на отдельные машины: когда и как - первый шаг к разнесённой площадке