Вынос базы и кэша на отдельные машины - когда и как
Разносим сайт по нескольким машинам: разбираем, что выносить первым, чем за это платят и что перестаёт работать сразу после переезда.
Решение
Измеряем, во что упирается площадка:
iostat -x 2 3 | tail -20 # диск: очередь и время ожиданияmysqladmin extended-status | grep -E 'Threads_running|Slow_queries'free -m # память: своп означает нехватку# выносят то, что действительно мешает, а не то, что проще вынестиПеренос без предварительного замера обычно ухудшает картину. Вынос базы на соседнюю машину при упоре в процессы PHP добавляет задержку сети и не даёт ничего, кроме нового места для сбоев.
Переводим кэш в память:
'cache' => ['value' => [ 'type' => ['class_name' => '\\Bitrix\\Main\\Data\\CacheEngineMemcache'], 'memcache' => ['host' => '127.0.0.1', 'port' => '11211'],]],Кэш в памяти снимает нагрузку с диска и заметно ускоряет страницы с большим числом закэшированных блоков. Ограничение объёма при этом задают явно: полная память вытесняет старые записи в самый неподходящий момент.
Выносим базу на отдельный узел:
'connections' => ['value' => ['default' => [ 'className' => '\\Bitrix\\Main\\DB\\MysqliConnection', 'host' => '10.0.0.5', // адрес во внутренней сети 'database' => 'bitrix',]]],База на отдельной машине даёт ей всю память, но добавляет задержку сети к каждому запросу. Страница с тремя сотнями запросов почувствует это сразу, поэтому вынос базы идёт вместе с сокращением числа запросов, а не вместо него.
Проверяем то, что ломается после переноса:
grep -r 'session.save_handler' /etc/php.d/ | head -3ls -l /home/bitrix/www/bitrix/backup/# сессии на файлах и копии на локальном диске рассчитаны на один узел# при переносе кэша в память сессии обычно переносят туда же, вместе с нимСессии на файлах и резервные копии на локальном диске рассчитаны на одну машину. После разделения узлов сессии переносят в общее хранилище, а копии - на отдельный диск или во внешнее хранилище.
Разделение узлов почти удваивает ежедневную работу по обслуживанию всей площадки. Обновления, сертификаты и наблюдение теперь нужны в двух местах, и это плата за запас по нагрузке, а не бесплатное улучшение.
Порядок шагов при разделении площадки заметно важнее скорости самого переезда. Сначала копия площадки и проверка на ней, потом переключение в тихие часы, и только потом снос старого узла - иначе откат превращается в новый переезд.
Внутреннюю сеть между узлами площадки закрывают от внешнего мира полностью. База, доступная снаружи по адресу с паролем, - самая частая причина утечки данных на разнесённых площадках.
Типичные проблемы
После выноса базы сайт стал медленнее.
К каждому запросу к базе данных добавилась задержка сети между узлами. Вынос базы делают вместе с сокращением числа запросов на страницу.
Посетителей выкидывает при переходах.
Сессии посетителей хранятся в файлах на каждом узле сайта по отдельности. При нескольких узлах сайта их переносят в общее внешнее хранилище.
Кэш работает нестабильно.
Память под кэш рано или поздно кончается, и старые записи вытесняются новыми. Объём хранилища в памяти задают исходя из реального размера кэша сайта.
Резервные копии исчезли после переезда.
Они лежали на локальном диске прежнего единственного узла площадки. Хранение резервных копий настраивают заново сразу после разделения площадки.
База доступна из интернета.
Порт базы данных открыт наружу вместо закрытой внутренней сети. Узлы площадки связывают закрытой внутренней сетью, а не публичными адресами.
Частые вопросы
Что выносить первым?
Кэш в память: это дёшево и почти всегда полезно. База на отдельном узле - следующий шаг, и он уже требует замеров.
Когда одной машины перестаёт хватать?
Когда упор в диск или память не лечится настройками, а нагрузка растёт. До этого дешевле оптимизировать код и кэш.
Нужен ли балансировщик сразу?
Нет, он нужен при нескольких веб-узлах. Вынос базы и кэша обходится без него.
Как проверить, что стало лучше?
Теми же замерами, что снимали до переноса. Ощущения после переезда обычно расходятся с числами.
Смежное
- BitrixVM и веб-окружение - оглавление подтемы
- Веб-кластер: репликация, чтение со слейва, сессии и кэш - следующий шаг после разделения узлов
- Кэш и сессии в памяти: memcached, Redis, проверка и отказ - как это описывается в настройках сайта
- Could not start session by PHP: сессия не стартует - падение хранилища сессий роняет сайт
- Проверка сайта перед акцией: нагрузка, узкие места, план дня - замеры до переноса
- База данных в веб-окружении: запуск, настройки, доступ снаружи - настройки самой базы
- Кластер и масштабирование - устройство разнесённой площадки
- Инфраструктура и хостинг - устройство площадки целиком
- Сайт на нескольких веб-узлах: балансировщик и общие файлы - когда узлов веб-сервера становится несколько