MariaDB Galera: узел не стартует без bootstrap
После полной остановки кластера Galera ни один узел не запустится обычной командой: каждый ждёт, пока появится кластер, к которому можно присоединиться. Первый узел поднимают особой командой, которая объявляет его начальным.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Кластер остановлен полностью, и некому объявить начало
Узел при старте ищет работающий кластер. Если его нет, он не рискует начать сам, чтобы не разойтись с данными других узлов.
-
В файле состояния указано, что узел не может быть начальным
Значение safe_to_bootstrap равно нулю: узел завершался не последним и может не иметь всех данных.
-
Сетевой обмен между узлами заблокирован
Galera использует несколько портов. Если они закрыты, узел не находит кластер даже при работающих соседях.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Номер последовательности и признак возможности начального запуска.
sudo cat /var/lib/mysql/grastate.datСообщения кластерного слоя о попытках присоединения.
journalctl -u mariadb -n 60 --no-pager | grep -i -E "galera|wsrep"Код завершения и последние строки.
systemctl status mariadb --no-pager -lРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Узел при старте ищет работающий кластер. Если его нет, он не рискует начать сам, чтобы не разойтись с данными других узлов.
- Как проверить
-
Посмотрите состояние узла и сохранённое состояние кластера.
sudo cat /var/lib/mysql/grastate.dat journalctl -u mariadb -n 40 --no-pager | grep -i galera
- Как исправить
-
Определите узел с самыми свежими данными по номеру в файле состояния и запустите его особой командой, затем поднимайте остальные обычным способом.
sudo galera_new_cluster # только на узле с самыми свежими данными
- Почему происходит
- Значение safe_to_bootstrap равно нулю: узел завершался не последним и может не иметь всех данных.
- Как проверить
-
Посмотрите значение в файле состояния на всех узлах.
sudo grep -E "seqno|safe_to_bootstrap" /var/lib/mysql/grastate.dat
- Как исправить
- Выберите узел с наибольшим номером последовательности. Менять значение вручную можно только понимая риск расхождения данных.
- Почему происходит
- Galera использует несколько портов. Если они закрыты, узел не находит кластер даже при работающих соседях.
- Как проверить
-
Проверьте доступность портов до других узлов.
for p in 4567 4568 4444; do timeout 2 bash -c "</dev/tcp/узел2/$p" && echo "$p открыт" || echo "$p закрыт"; done
- Как исправить
- Откройте порты 4567, 4568 и 4444 между узлами кластера.
Пример вывода
Узел не находит кластер и завершается. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
mariadbd[7100]: [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view
mariadbd[7100]: [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():219: Failed to open backend connection: -110
mariadbd[7100]: [ERROR] Aborting
systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- HAProxy: cannot bind socket и плавающий адрес HAProxy не запускается на пассивном узле кластера: адрес не поднят. Параметр ip_nonlocal_bind.
- MongoDB: NotWritablePrimary при записи Запись отклоняется: узел не является основным в наборе репликации. Разбор выборов и состояния узлов.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- Apache: конфликт модулей многопроцессности и PHP Apache не запускается после включения модуля PHP: несовместимость с выбранным модулем многопроцессности.
Где встречается чаще всего
Источники
- Документация MariaDB: восстановление кластера Galera
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Наблюдалось на тестовом кластере из двух узлов после одновременной остановки.