Восстановление MariaDB Galera Cluster в Docker
Cloud-Life • MariaDB 10.11 • 3 узла
[h2]1. Схема кластера[/h2]
Кластер MariaDB Galera состоит из трёх узлов:
| Узел | IP-адрес | Контейнер |
| web-01 | 10.10.1.41 | mariadb-galera |
| web-02 | 10.10.1.45 | mariadb-galera |
| isp | 10.10.1.43 | mariadb-galera |
Рабочий каталог на каждом узле:
/srv/docker/mariadbОсновные файлы:
/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 на всех трёх серверах.
На каждом узле выполнить:
cd /srv/docker/mariadb
docker compose stop mariadb-galeraПроверить, что постоянный контейнер остановлен:
docker ps --filter name=mariadb-galeraНе продолжать, пока другие узлы продолжают принимать записи.
[h2]4. Сохранить резервную копию[/h2]
Перед восстановлением сохранить дамп баз и убедиться, что он читается. Если есть возможность, дополнительно сохранить каталоги данных остановленных узлов.
Пример проверки уже созданного сжатого дампа:
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.
Выполнить на выбранном узле:
cd /srv/docker/mariadb
docker compose run --rm --no-deps mariadb-galera mariadbd --wsrep-new-clusterКоманда запускает временный контейнер с тем же каталогом данных и инициирует bootstrap.
Не запускать второй сервер MariaDB с тем же каталогом данных одновременно.После успешного старта в логах должны появиться сообщения, аналогичные:
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. Проверить состояние временного контейнераdocker ps --filter status=running --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'Подключиться к работающему временному контейнеру и проверить список баз:
docker exec -it ИМЯ_ВРЕМЕННОГО_КОНТЕЙНЕРА mariadb -uroot -p -e "SHOW DATABASES;"6.2. Проверить состояние Galeradocker 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');"Для одиночного восстановленного узла ожидаются:
wsrep_cluster_status Primary
wsrep_cluster_size 1
wsrep_ready ON
wsrep_local_state_comment Synced6.3. Остановить временный контейнерdocker stop ИМЯ_ВРЕМЕННОГО_КОНТЕЙНЕРАУбедиться, что он остановлен. Не запускать постоянный и временный контейнеры одновременно с одним каталогом данных.
6.4. Временно изменить адрес GaleraСохранить конфигурацию:
cd /srv/docker/mariadb
cp -a conf.d/galera.cnf conf.d/galera.cnf.before-bootstrapВременно установить пустой адрес кластера:
sed -i 's|^wsrep_cluster_address=.*|wsrep_cluster_address=gcomm://|' conf.d/galera.cnfЗатем запустить постоянный контейнер:
docker compose up -d --no-deps mariadb-galeraПроверить состояние:
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. Вернуть список всех узловПосле успешного запуска постоянного контейнера вернуть исходный список узлов в конфигурацию:
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 выполнить:
cd /srv/docker/mariadb
docker compose up -d mariadb-galeraПроверить журнал:
docker logs --tail 80 mariadb-galeraОжидаемые сообщения:
Server web-02 synced with group
Synchronized with group, ready for connectionsЗатем проверить состояние Galera:
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:
cd /srv/docker/mariadb
docker compose up -d mariadb-gal