Перейти к содержимому

Вынос базы и кэша на отдельные машины - когда и как

Разносим сайт по нескольким машинам: разбираем, что выносить первым, чем за это платят и что перестаёт работать сразу после переезда.

Решение

Измеряем, во что упирается площадка:

Окно терминала
iostat -x 2 3 | tail -20 # диск: очередь и время ожидания
mysqladmin extended-status | grep -E 'Threads_running|Slow_queries'
free -m # память: своп означает нехватку
# выносят то, что действительно мешает, а не то, что проще вынести

Перенос без предварительного замера обычно ухудшает картину. Вынос базы на соседнюю машину при упоре в процессы PHP добавляет задержку сети и не даёт ничего, кроме нового места для сбоев.

Переводим кэш в память:

/bitrix/.settings.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 -3
ls -l /home/bitrix/www/bitrix/backup/
# сессии на файлах и копии на локальном диске рассчитаны на один узел
# при переносе кэша в память сессии обычно переносят туда же, вместе с ним

Сессии на файлах и резервные копии на локальном диске рассчитаны на одну машину. После разделения узлов сессии переносят в общее хранилище, а копии - на отдельный диск или во внешнее хранилище.

Разделение узлов почти удваивает ежедневную работу по обслуживанию всей площадки. Обновления, сертификаты и наблюдение теперь нужны в двух местах, и это плата за запас по нагрузке, а не бесплатное улучшение.

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

Внутреннюю сеть между узлами площадки закрывают от внешнего мира полностью. База, доступная снаружи по адресу с паролем, - самая частая причина утечки данных на разнесённых площадках.

Типичные проблемы

После выноса базы сайт стал медленнее.

К каждому запросу к базе данных добавилась задержка сети между узлами. Вынос базы делают вместе с сокращением числа запросов на страницу.

Посетителей выкидывает при переходах.

Сессии посетителей хранятся в файлах на каждом узле сайта по отдельности. При нескольких узлах сайта их переносят в общее внешнее хранилище.

Кэш работает нестабильно.

Память под кэш рано или поздно кончается, и старые записи вытесняются новыми. Объём хранилища в памяти задают исходя из реального размера кэша сайта.

Резервные копии исчезли после переезда.

Они лежали на локальном диске прежнего единственного узла площадки. Хранение резервных копий настраивают заново сразу после разделения площадки.

База доступна из интернета.

Порт базы данных открыт наружу вместо закрытой внутренней сети. Узлы площадки связывают закрытой внутренней сетью, а не публичными адресами.

Частые вопросы

Что выносить первым?

Кэш в память: это дёшево и почти всегда полезно. База на отдельном узле - следующий шаг, и он уже требует замеров.

Когда одной машины перестаёт хватать?

Когда упор в диск или память не лечится настройками, а нагрузка растёт. До этого дешевле оптимизировать код и кэш.

Нужен ли балансировщик сразу?

Нет, он нужен при нескольких веб-узлах. Вынос базы и кэша обходится без него.

Как проверить, что стало лучше?

Теми же замерами, что снимали до переноса. Ощущения после переезда обычно расходятся с числами.

Смежное

Первоисточник