Восстановление кластера Galera после сбоя

Кластеры Galera обычно предназначены для непрерывной работы, поэтому выключение всего кластера во время нормальной работы не требуется. Тем не менее, если возникнет необходимость выполнить такую ​​процедуру, вполне вероятно, что она будет происходить под давлением, поэтому важно, чтобы она завершилась безопасно и как можно быстрее, чтобы избежать длительного простоя и потенциальной потери данных. Galera включает два механизма защиты: защиту Safe-to-Bootstrap и восстановление Gcache. В этой статье мы опишем первую особенность.

Перезапуск кластера

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

  • Поскольку старый кластер логически больше не существует, создается новый логический кластер.
  • Первый запускаемый узел должен быть загружен.
  • Важно выбрать узел, на котором зафиксированы последние транзакции, в качестве первого узла в новом кластере.

Защита safe_to_bootstrap

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

Чтобы облегчить это решение и предотвратить небезопасный выбор, Galera, начиная с версии 3.19, будет отслеживать порядок отключения узлов. Узел, который был выключен последним, будет помечен как «Безопасный для начальной загрузки». Все остальные узлы будут помечены как небезопасные для загрузки.

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

It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates.
To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .

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

Выбор мастер-узла

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

В случае штатного завершения работы достаточно следовать рекомендациям функции «Safe-to-Bootstrap». Найдите узел, чей grastate.dat имеет значение Safe_to_bootstrap: 1 :

# GALERA saved state
version: 2.1
uuid:    9acf4d34-acdb-11e6-bcc3-d3e36276629f
seqno:   15
safe_to_bootstrap: 1
и используйте этот узел.

В случае серьезного сбоя все узлы будут иметь значение Safe_to_bootstrap: 0 , поэтому нам нужно будет произвести сверкус механизмом хранения InnoDB, чтобы определить, какой узел зафиксировал последнюю транзакцию в кластере. Это достигается путем запуска mysqld с переменной --wsrep-recover , которая выдает такой результат:

...
2018-10-17 13:12:15 36311 [Note] InnoDB: Database was not shutdown normally!
2018-10-17 13:12:15 36311 [Note] InnoDB: Starting crash recovery.
...
2018-10-17 13:12:16 36311 [Note] WSREP: Recovered position: 37bb872a-ad73-11e6-819f-f3b71d9c5ada:345628
...
2018-10-17 13:12:17 36311 [Note] /usr/sbin/mysqld: Shutdown complete

Число после строки UUID в строке “Восстановленная позиция” — это то, за которым следует следить. Выберите узел с наибольшим таким номером и отредактируйте его grastate.dat , установив Safe_to_bootstrap: 1 :

# GALERA saved state
version: 2.1
uuid:    37bb872a-ad73-11e6-819f-f3b71d9c5ada
seqno:   -1
safe_to_bootstrap: 1

Делая это, вы указываете Galera, что вы намеренно выбрали этот узел, и он позволит вам выполнить загрузку с него.

galera_new_cluster
Далее, проверим. что кластер собрался:

mysql --execute "show status like 'wsprep_cluster_size%'"
В значении “Value ” мы должны увидеть количество узлов кластера, например: 3.

EOF