Настройка MariaDB Galera Cluster для синхронной репликации

Кластер теряет синхронность под нагрузкой — и записи расходятся по узлам. Мы настраиваем MariaDB Galera Cluster под ключ: проектируем схему кворума, проверяем поведение под нагрузкой и передаём регламенты переключения вашей команде. Отказ одного узла перестаёт быть аварийным событием.
Часто задаваемые вопросы

Почему MariaDB Galera Cluster теряет синхронность под нагрузкой

MariaDB Galera Cluster подтверждает запись не на одном узле, а после того, как транзакцию сертифицировали все участники. Пока узлы успевают одинаково, подтверждение записи и репликация неразделимы: потери данных при отказе одного сервера нет. Схема ломается ровно тогда, когда один узел перестаёт успевать — механизм регулирования потока притормаживает весь кластер до скорости самого медленного участника.

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

Опаснее обратный сценарий: пока кластер разделён, меньшая часть успевает принять и подтвердить транзакции клиенту, а после восстановления связи они не проходят сертификацию и отбрасываются. Так подтверждённая транзакция не доезжает до остальных узлов — это уже не отказоустойчивость базы данных, а расхождение, которое приходится сверять вручную.

На пике такой сбой вероятнее: растут очереди сертификации, дольше удерживаются блокировки записи, а всплеск на одном узле через регулирование потока разгоняет задержки на всех. Любой перезапуск или передача состояния на горячем кластере выбивает кворум особенно легко.

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

Что даёт синхронная репликация с подтверждением записи

Запись считается подтверждённой только тогда, когда её принял кворум узлов, а не один ведущий сервер. Клиент получает ответ уже после фиксации на большинстве — поэтому класс отказов «потеря подтверждённых данных» уходит: если узел выпадает сразу после ответа, транзакция всё равно остаётся на остальных. MariaDB Galera Cluster закрывает это на уровне самой репликации, без доработок в приложении.

При отказе узла кворум пересобирается сам, а маршрутизация трафика за секунды уводит клиентов на живые узлы. Время переключения измеряется единицами секунд и не зависит от объёма базы — переключение не ждёт применения журналов. Приложение видит короткий разрыв соединений, а не простой на минуты.

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

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

Режимы репликации MariaDB: сравнение вариантов

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

Вариант Когда подходит Ограничения режима
Асинхронная репликация отчётные копии, разнесённые площадки, где потеря последних изменений допустима основной узел подтверждает фиксацию, не дождавшись копии: при сбое до передачи журнала разница теряется безвозвратно
Полусинхронная репликация нужен баланс между скоростью записи и гарантией, что копия приняла журнал подтверждение приходит до применения на копии, поэтому при переключении часть изменений ещё догоняет; поведение при недоступности копии задаётся политикой таймаута
Синхронное подтверждение (Galera) критичные данные, где расхождение узлов недопустимо, а узлы стоят в одной сети с малой задержкой фиксация проходит только на большинстве узлов: потеря кворума останавливает запись, а рост числа узлов увеличивает время отклика на запись
Копия с задержкой применения защита от ошибочного массового изменения переключение не ускоряет, требует отдельного узла и запаса места под журналы

Выбор не бинарный: в одной инсталляции синхронный кластер обычно несёт критичные базы, а асинхронная копия — отчётность и аналитику. Так нагрузка чтения уходит с основного контура, а требования к задержке между площадками остаются выполнимыми.

Внедрение отказоустойчивого кластера: этапы работ

Кластер синхронной репликации на MariaDB Galera не собирают «на живую»: порядок работ определяет, будет переключение при отказе предсказуемым или превратится в ручные операции под давлением. Каждый этап заканчиваем артефактом, который проверяем до перехода к следующему.

  1. Аудит текущей схемы. Топология, размер горячих данных, задержки между узлами, изменения структуры вне регламента, поведение приложения при ошибке записи. Результат — карта узких мест и перечень запросов, недопустимых в кластере: долгие блокирующие транзакции, массовые вставки без разбиения.
  2. Проектирование топологии. Число узлов, кворум, отдельный арбитр вне основной зоны отказа, режим подтверждения транзакции записью на кворум. Здесь же фиксируем поведение при потере кворума: остановка записи автоматически или по решению дежурного.
  3. Настройка синхронной записи. Параметры потока репликации, ограничение размера транзакции для догона изменений, поведение узла при отставании, перевод узла в режим без записи. Проверяем, как приложение переживает откат транзакции и переподключение к другому узлу.
  4. Тесты отказа. Плановый вывод узла, резкая остановка, разрыв сети между зонами, потеря кворума, полная пересборка узла с донора. Фиксируем время восстановления записи и число потерянных подтверждённых транзакций — цель ноль.
  5. Резервное копирование и восстановление. Снимок с узла-донора, проверка восстановления на отдельном контуре, регламент полной синхронизации, когда догон изменений невозможен.
  6. Передача в эксплуатацию. Мониторинг состояния узлов и отставания, инструкции дежурному, порядок замены узла и обновления структуры в окно. Дальше — сопровождение, пока команда не проведёт замену узла сама.

Конфигурации, схемы кворума и регламенты переключения

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

  • Файлы конфигурации узлов. Полный набор параметров синхронной репликации: имя кластера, режим подтверждения записи, поведение узла при потере связи с группой, лимиты на поток изменений. Разложены по машинам и продублированы в системе контроля версий.
  • Схема размещения узлов. Сколько узлов, в каких зонах доступности, как распределён кворум, какие задержки между площадками закладывали и почему именно такой состав голосующих.
  • Регламент переключения. Пошаговый порядок управляемого вывода узла, действия при потере кворума, точка, в которой принимается решение о переводе трафика на резервную площадку.
  • Правила доступов. Роли для приложения, служебной диагностики и восстановления, откуда разрешены подключения, кто имеет право менять параметры кластера и как это фиксируется.
  • Документация по восстановлению. Сценарии холодного старта группы, подъём одного отставшего узла, порядок работы с резервной копией и сверка состояния после возврата.
  • Чек-листы. Проверки перед изменением конфигурации, после аварийного переключения и регулярный контроль расхождения данных между узлами.
  • Карта метрик и оповещений. Какие показатели узла и кластера считаются нормой, какие требуют вмешательства дежурного, кому уходит сигнал.

Кейс: кластер интернет-магазина без простоя при отказе узла

Как было до

Магазин работал на одной основной базе и асинхронной реплике. Когда узел уходил, реплика отставала, и часть заказов, оформленных в момент сбоя, пропадала — доля потерянных транзакций доходила до 0.3% суточного потока. О расхождениях узнавали по жалобам покупателей, то есть уже после того, как клиент не получил подтверждение заказа.

Переключение делали руками: дежурный инженер поднимал реплику, менял точку подключения в конфигурации приложения и только потом снимал режим обслуживания. Простой составлял от 4 до 11 минут, а каждый четвёртый отказ заканчивался ручной пересборкой узла из резервной копии.

Что изменили и что стало

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

Время переключения сократилось с минут до 3-8 секунд, доля потерянных транзакций — с 0.3% до нуля, доля ручных восстановлений — с четверти отказов до одного из десяти, и только когда диск узла недоступен совсем. Разбор инцидента занимает около 20 минут: в журнале видно, какой узел выпал, почему и когда вернулся в строй, — раньше на сверку логов уходили часы.

Настройки мы сверяли с двумя независимыми источниками — документация Galera Cluster и отчёты сообщества по кворуму: они подтверждают, что выбранный режим даёт предсказуемый отказ, а не тихую потерю данных.

Что делать, если уже развёрнут асинхронный кластер?

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

Перед этим проверяем текущую конфигурацию. Все таблицы должны быть InnoDB и с первичным ключом: без ключа синхронное применение строк работает неэффективно. Смотрим, не растёт ли лаг реплики, совпадают ли схемы на узлах, нет ли прямых подключений к репликам на чтение — после переключения это уже равноправные участники кластера. Отдельно — длинные транзакции и смена структуры таблиц: они согласуются между узлами и на большой таблице могут затормозить запись.

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

План миграции: фиксируем настройки, поднимаем новый узел рядом с репликой и переносим данные физической копией — перелив дампом создаёт то самое длинное окно. Затем переводим приложение, добавляем остальные узлы и следим за кворумом. Само окно недоступности — минуты на смену точки подключения и проверку записи с чтением. Откат простой: вернуть приложение на прежний мастер, он остаётся холодным резервом, пока кластер не отработает под нагрузкой.

Частые технические вопросы перед внедрением кластера

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

Сколько узлов нужно для кворума?

Три — минимальный состав, при котором кластер переживает отказ одного узла и сохраняет кворум. Два узла отказоустойчивы, но без запаса: потеря одного оставляет один голос, и кластер уходит в режим только для чтения. Для двух площадок добавляем лёгкий арбитр без копии данных.

Что происходит при разделении сети?

Меньшая часть теряет кворум и переходит в режим только для чтения — запись на ней останавливается, чтобы версии данных не разошлись. Большая часть продолжает обслуживать транзакции, а после восстановления связи отставшие узлы догоняют состояние сами.

Можно ли добавить узел на ходу?

Да, остановка сервиса не нужна. Новый узел получает копию данных и включается в голосование только после догонки. На время полной передачи копии донором выступает один узел — его нагрузку заранее распределяем, чтобы не просадить отклик.

Замедляет ли синхронная репликация запись?

Отклик записи определяет задержка сети между узлами, а не диск. В пределах площадки это доли миллисекунд, между регионами — заметнее. Групповая фиксация объединяет параллельные транзакции в один раунд согласования, поэтому пропускная способность при массовой нагрузке не проседает.

Как узел восстанавливается после сбоя?

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

Обсудим задачу и вернёмся с оценкой и планом

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

  • Схему текущей топологии: сколько узлов, как разнесены по площадкам, где сейчас точки отказа.
  • Объёмы и характер нагрузки: размер баз, соотношение чтения и записи, пиковые периоды.
  • Требования к доступности: допустимое время простоя при переключении и нужен ли автоматический переход при отказе узла.
  • Требования к согласованности: какие транзакции обязаны подтверждаться на большинстве узлов, а где достаточно асинхронной репликации.
  • Как устроены резервное копирование и восстановление — чтобы план работ не сломал действующие процедуры.
  • Ограничения по окну работ: когда конфигурацию можно менять без влияния на пользователей.

Взамен вернёмся с планом работ по внедрению: поэтапный перевод узлов, состав кластера, порядок проверок и порядок приёмки с измеримыми критериями. Заранее фиксируем, какой отказ кластер обязан переживать и за какое время возвращается в норму после сбоя. Опишите задачу — обсудим детали и вернёмся с оценкой и планом.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1141