7.8.3 Перезапуск кластера после серьёзного сбоя
Если ваш кластер полностью вышел из строя, вы можете переконфигурировать его, используя dba.rebootClusterFromCompleteOutage(). Эта операция позволяет вам подключиться к одному из экземпляров MySQL в кластере и использовать его метаданные для восстановления кластера.
Полный сбой означает, что групповая репликация прекращена на всех экземплярах-членах.
Убедитесь, что все члены кластера запущены перед выполнением dba.rebootClusterFromCompleteOutage(). Команда завершится неудачно, если какой-либо из членов кластера недоступен.
Эта проверка игнорируется, если кластер помечен как НЕВАЛИДНЫЙ и является членом набора кластеров.
Подключитесь к самому последнему экземпляру и выполните следующую команду:
JS> var cluster = dba.rebootClusterFromCompleteOutage()
Если у всех членов установлено одинаковое множество GTID, член, к которому вы в настоящее время подключены, становится первичным. См. Выбор первичного члена с помощью rebootClusterFromCompleteOutage.
Операция dba.rebootClusterFromCompleteOutage() выполняется в следующей последовательности, чтобы обеспечить правильную переконфигурацию кластера:
Метаданные кластера и топология кластера извлекаются из текущего экземпляра.
Если член кластера находится в состоянии ВОССТАНОВЛЕНИЯ или ОШИБКА, а все остальные члены — в состоянии ОФФЛАЙН или ОШИБКА,
dba.rebootClusterFromCompleteOutage()пытается остановить групповую репликацию на этом члене. Если групповая репликация не может быть остановлена, команда прерывается и отображается ошибка.-
Проверяются метаданные InnoDB Cluster, обнаруженные в экземпляре, к которому в настоящее время подключена MySQL Shell, чтобы определить, содержит ли он супермножество GTID. Если текущий подключенный экземпляр не содержит супермножества GTID, операция прерывается с соответствующей информацией.
См. Супермножество GTID.
Если экземпляр содержит супермножество GTID, кластер восстанавливается на основе метаданных, хранящихся в этом экземпляре.
-
MySQL Shell проверяет, какие экземпляры кластера в настоящее время доступны, и прерывается, если какой-либо член в настоящее время недоступен.
ПримечаниеЭту проверку можно обойти с помощью опции
force. Это перезапускает кластер, используя оставшиеся доступные члены.См. Опция принуждения.
Аналогично, MySQL Shell обнаруживает экземпляры, которые в настоящее время недоступны. Добавить или удалить бывших членов в кластер в рамках команды
dba.rebootClusterFromCompleteOutage()невозможно, если они в настоящее время недоступны.Если включено на первичном экземпляре кластера, когда кластер находится в режиме с одним первичным, оно выключается.
Супермножество GTID
Для перезапуска кластера необходимо подключиться к члену с супермножеством GTID, что означает экземпляр, который применил наибольшее количество транзакций до сбоя.
Чтобы определить, какой член имеет супермножество GTID, выполните одно из следующих действий:
-
Подключитесь к экземпляру и выполните
dba.rebootClusterFromCompleteOutage()сdryRun: true. Сгенерированный отчёт вернёт информацию, аналогичную следующей:.Switching over to instance '127.0.0.1:4001' to be used as seed.Это указывает на члена с супермножеством GTID.
Выполнение
dba.rebootClusterFromCompleteOutage()на члене с меньшим набором GTID приводит к ошибке. -
Подключайтесь к каждому экземпляру по очереди и выполняйте следующее в режиме
SQL:SHOW VARIABLES LIKE 'gtid_executed';
Экземпляр, который применил наибольшее количество транзакций, содержит супермножество GTID.
Возможно переопределить это поведение и использовать экземпляр с меньшим набором GTID, выполнив dba.rebootClusterFromCompleteOutage() с опцией force.
Это делает выбранный член первичным и отбрасывает все транзакции, не включённые в набор GTID выбранного члена.
Если этот процесс завершится неудачно и метаданные кластера станут сильно повреждены, вам может потребоваться удалить метаданные и создать кластер заново. Вы можете удалить метаданные кластера, используя dba.dropMetadataSchema().
Метод dba.dropMetadataSchema() следует использовать только в крайнем случае, когда невозможно восстановить кластер. Он не может быть отменён.
Если вы используете MySQL Router с кластером, при удалении метаданных все текущие соединения закрываются, и новые подключения запрещаются. Это приводит к полному отключению.
Опции
dba.rebootClusterFromCompleteOutage() имеет следующие опции:
force: true | false (default): Если истинно, операция должна быть выполнена, даже если некоторые члены кластера недоступны, или выбранный первичный экземпляр имеет расходящийся или меньший набор GTID_SET. См. Опцию принужденияdryRun: true | false (default): выполняет все проверки и шаги команды, но никаких изменений не вносит. По завершении отображается отчёт. См. Тестирование rebootClusterFromCompleteOutage.primary: Определение экземпляра, который должен быть выбран в качестве первичного. См. Выбор первичного члена с помощью rebootClusterFromCompleteOutage.switchCommunicationStack: mysql | xcom: Стек протоколов групповой репликации, который будет использоваться кластером после перезапуска. См. Раздел 7.5.9, «Настройка стека протоколов групповой репликации».ipAllowList: Список хостов, разрешённых для подключения к экземпляру для трафика групповой репликации при использовании стека протоколовXCOM.localAddress: Строковое значение локального адреса групповой репликации для использования вместо автоматически сгенерированного, при использовании стека протоколовXCOM.
Опция принуждения
Опция force позволяет игнорировать доступность членов кластера или расхождения в наборе GTID выбранного члена и перезапустить кластер.
Например, перезапуск кластера myCluster:
JS> var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{force: true})
Опция force недоступна в следующих ситуациях:
Если кластер принадлежит к набору кластеров и помечен как НЕВАЛИДНЫЙ, или первичный кластер не находится в глобальном состоянии OK,
Кластер принадлежит к набору кластеров, является первичным кластером и помечен как НЕВАЛИДНЫЙ.
Добавить или повторно присоединить экземпляры с помощью rebootClusterFromCompleteOutage невозможно. Если вы использовали force для игнорирования недоступных членов и перезапуска своего кластера, вы должны использовать для добавления недоступных членов в кластер.cluster.rejoinInstance()
Выбор первичного члена с помощью rebootClusterFromCompleteOutage
Вы можете определить первичный член кластера несколькими способами:
-
Определите опцию
primaryв командеdba.rebootClusterFromCompleteOutage().Например, перезапуск кластера
myClusterи установка члена, работающего на локальной машине на порту 4001, в качестве первичного:var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{primary: "127.0.0.1:4001"}) Используя опцию
primaryс опциейforceна члене кластера с меньшим набором GTID, чем у другого члена.
Тестирование rebootClusterFromCompleteOutage
Вы можете протестировать изменения, используя опцию dryRun. Эта опция проверяет команду и её опции, генерирует протокол результатов. Если есть проблемы с предложенными изменениями, генерируется исключение.
Следующий пример демонстрирует сухую проверку перезапуска кластера, myCluster, установку первичного члена на локальный член, работающий на порту 4001, и возвращаемое сообщение протокола:
JS > var cluster = dba.rebootClusterFromCompleteOutage("myCluster",{primary: "127.0.0.1:4001", dryRun: true})
NOTE: dryRun option was specified. Validations will be executed, but no changes will be applied.
Cluster instances: '127.0.0.1:4000' (OFFLINE), '127.0.0.1:4001' (OFFLINE), '127.0.0.1:4002' (OFFLINE)
Switching over to instance '127.0.0.1:4001' to be used as seed.
dryRun finished.
Учёт наборов кластеров и реплик
rebootClusterFromCompleteOutage выполняет следующие проверки и генерирует предупреждение, если кластер не соответствует требованиям:
Подтверждает, что реплицирующий кластер не был насильно удалён из набора кластеров.
Подтверждает, что первичный кластер набора кластеров доступен.
Проверяет кластер на наличие ошибочных транзакций, которые не являются событиями журнала изменения представления (VCLE). См. .
Подтверждает, что набор выполненных транзакций кластера () не пустой.
Команда автоматически повторно подключается к реплицирующему кластеру к набору кластеров, гарантируя, что канал репликации набора кластеров настроен для всех членов кластера.
Переключение стека коммуникаций
Вы можете переключить стек коммуникаций во время операции dba.rebootClusterFromCompleteOutage().
Например:
js> dba.rebootClusterFromCompleteOutage("testcluster", {switchCommunicationStack: "mysql"})
Переключение с протокола MYSQL на XCOM требует дополнительного сетевого адреса для localAddress и, возможно, также потребует определения значений ipAllowList.
© 2025 Oracle
Licensed under the GPLv2 License.