Восстановление MariaDB Galera Cluster в Docker

Автор George, Окт. 14, 2026, 04:22

« назад - далее »

George

Восстановление MariaDB Galera Cluster в Docker
Cloud-Life • MariaDB 10.11 • 3 узла

[h2]1. Схема кластера[/h2]

Кластер MariaDB Galera состоит из трёх узлов:

УзелIP-адресКонтейнер
web-0110.10.1.41mariadb-galera
web-0210.10.1.45mariadb-galera
isp10.10.1.43mariadb-galera

Рабочий каталог на каждом узле:

Код: bash
/srv/docker/mariadb

Основные файлы:

Код: bash
/srv/docker/mariadb/compose.yml
/srv/docker/mariadb/conf.d/galera.cnf
/srv/docker/mariadb/data/

Используются MariaDB 10.11, Galera и SST методом mariabackup.

[h2]2. Когда применять эту инструкцию[/h2]

Инструкция предназначена для ситуации, когда кластер не может нормально восстановиться после сбоя, узлы не образуют рабочую Primary Component либо состояние Galera повреждено.

Если кластер работает и требуется обычная перезагрузка одного сервера, bootstrap выполнять не нужно.

Важно! Bootstrap создаёт или восстанавливает Primary Component. Если выполнить его на нескольких узлах независимо, можно получить два разных кластера с расходящимися данными.

[h2]3. Остановить все узлы[/h2]

Перед восстановлением необходимо прекратить запись в базы и остановить MariaDB на всех трёх серверах.

На каждом узле выполнить:

Код: bash
cd /srv/docker/mariadb
docker compose stop mariadb-galera

Проверить, что постоянный контейнер остановлен:

Код: bash
docker ps --filter name=mariadb-galera

Не продолжать, пока другие узлы продолжают принимать записи.

[h2]4. Сохранить резервную копию[/h2]

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

Пример проверки уже созданного сжатого дампа:

Код: bash
gzip -t /root/galera-backup/web-01-all-databases.sql.gz

Успешное завершение команды без ошибки подтверждает целостность gzip-потока, но не гарантирует полноту и актуальность содержимого SQL-дампа.

Не удалять каталоги данных и не выполнять docker compose down -v в процессе восстановления.

[h2]5. Выбрать узел для восстановления[/h2]

Нужно выбрать один узел, на котором будут восстанавливать кластер. В нашем случае это был web-01 — 10.10.1.41.

Выполнить на выбранном узле:

Код: bash
cd /srv/docker/mariadb
docker compose run --rm --no-deps mariadb-galera mariadbd --wsrep-new-cluster

Команда запускает временный контейнер с тем же каталогом данных и инициирует bootstrap.

Не запускать второй сервер MariaDB с тем же каталогом данных одновременно.

После успешного старта в логах должны появиться сообщения, аналогичные:

Код: bash
Bootstrapping a new cluster
Server web-01 synced with group
Synchronized with group, ready for connections
mariadbd: ready for connections.

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

[h2]6. Перевести восстановленный узел на постоянный контейнер[/h2]

Временный bootstrap-контейнер не является постоянным сервисом Compose. Поэтому нельзя просто оставить его вместо штатного контейнера.

В нашем случае для web-01 последовательность была следующей.

6.1. Проверить состояние временного контейнера

Код: bash
docker ps --filter status=running --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'

Подключиться к работающему временному контейнеру и проверить список баз:

Код: bash
docker exec -it ИМЯ_ВРЕМЕННОГО_КОНТЕЙНЕРА mariadb -uroot -p -e "SHOW DATABASES;"

6.2. Проверить состояние Galera

Код: bash
docker exec -it ИМЯ_ВРЕМЕННОГО_КОНТЕЙНЕРА mariadb -uroot -p -e "SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_cluster_status','wsrep_cluster_size','wsrep_ready','wsrep_local_state_comment','wsrep_cluster_state_uuid');"

Для одиночного восстановленного узла ожидаются:

Код: bash
wsrep_cluster_status       Primary
wsrep_cluster_size         1
wsrep_ready                ON
wsrep_local_state_comment  Synced

6.3. Остановить временный контейнер

Код: bash
docker stop ИМЯ_ВРЕМЕННОГО_КОНТЕЙНЕРА

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

6.4. Временно изменить адрес Galera

Сохранить конфигурацию:

Код: bash
cd /srv/docker/mariadb
cp -a conf.d/galera.cnf conf.d/galera.cnf.before-bootstrap

Временно установить пустой адрес кластера:

Код: bash
sed -i 's|^wsrep_cluster_address=.*|wsrep_cluster_address=gcomm://|' conf.d/galera.cnf

Затем запустить постоянный контейнер:

Код: bash
docker compose up -d --no-deps mariadb-galera

Проверить состояние:

Код: bash
docker exec -it mariadb-galera mariadb -uroot -p -e "SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_cluster_status','wsrep_cluster_size','wsrep_ready','wsrep_local_state_comment','wsrep_cluster_state_uuid');"

Должны быть Primary, Synced, ON и размер кластера 1.

6.5. Вернуть список всех узлов

После успешного запуска постоянного контейнера вернуть исходный список узлов в конфигурацию:

Код: bash
sed -i 's|^wsrep_cluster_address=.*|wsrep_cluster_address=gcomm://10.10.1.43,10.10.1.41,10.10.1.45|' conf.d/galera.cnf

grep '^wsrep_cluster_address=' conf.d/galera.cnf

Это изменение файла не требует немедленного перезапуска работающего узла. Оно будет использоваться при последующих запусках MariaDB.

[h2]7. Подключить второй узел[/h2]

Только после того, как первый узел работает как Primary и Synced, на web-02 выполнить:

Код: bash
cd /srv/docker/mariadb
docker compose up -d mariadb-galera

Проверить журнал:

Код: bash
docker logs --tail 80 mariadb-galera

Ожидаемые сообщения:

Код: bash
Server web-02 synced with group
Synchronized with group, ready for connections

Затем проверить состояние Galera:

Код: bash
docker exec -it mariadb-galera mariadb -uroot -p -e "SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_cluster_status','wsrep_cluster_size','wsrep_ready','wsrep_local_state_comment','wsrep_cluster_state_uuid');"

Ожидаются Primary, Synced, ON, размер кластера 2 и тот же UUID кластера, что на web-01.

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

[h2]8. Подключить третий узел[/h2]

После успешного подключения web-02 запустить isp:

Код: bash
cd /srv/docker/mariadb
docker compose up -d mariadb-gal
  •  

🡱 🡳

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.