Траблшутинг рассинхронизации Galera: Split-Brain и pc.bootstrap
- Все ноды кластера возвращают ошибку
ERROR 1047 (08S01): WSREP has not yet prepared node for application use. - Статус
wsrep_cluster_statusпереходит в состояниеnon-Primary. - Кластер распался на изолированные сегменты после сетевой аварии и потерял кворум.
1. Остановка всех оставшихся процессов mysqld
systemctl stop mysqld2. Определение наиболее актуального узла (поиск Last Sequence Number - seqno)
На каждом узле выполните команду поиска последней транзакции:
cat /var/lib/mysql/grastate.datЕсли параметр seqno равен -1, запустите временное сканирование позиции в Redo Log:
mysqld --wsrep-recover
grep "Recovered GComm position" /var/log/mysql/error.logПример вывода: Recovered GComm position: 12345678-1234-1234-1234-123456789abc:945820 (узел с максимальным числом в конце — самый актуальный).
3. Принудительное назначение узла Мастером через grastate.dat
На узле с наибольшим seqno отредактируйте /var/lib/mysql/grastate.dat:
# Установите safe_to_bootstrap: 1
safe_to_bootstrap: 14. Перезапуск первичной компоненты кластера
# На самом актуальном узле:
galera_new_cluster
# Проверьте статус
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_status';" # Должно быть: Primary5. Запуск остальных узлов и отслеживание SST/IST
systemctl start mysqld Частые вопросы (FAQ)
Как восстановить кворум на лету без перезапуска демона?
Если одна живая нода изолирована и перешла в non-Primary, выполните: SET GLOBAL wsrep_provider_options='pc.bootstrap=YES'; Узел мгновенно объявит себя первичным компонентом.
В чем разница между IST и SST при повторном подключении узла?
IST (Incremental State Transfer) передает только недостающие транзакции из кэша gcache. SST (State Snapshot Transfer) полностью перезаписывает базу через xtrabackup, если узел отставал слишком долго.