9.9 Аварийный failover InnoDB ClusterSet
Аварийный failover переводит выбранный репликативный кластер в основной кластер InnoDB для развертывания InnoDB ClusterSet. Данная процедура может быть использована в случае, когда текущий основной кластер не работает или недоступен. Во время процесса аварийного failover согласованность данных не гарантируется, поэтому для безопасности исходный основной кластер помечается как недействительный в процессе failover. Если исходный основной кластер остаётся активным, его следует выключить как можно скорее после того, как он станет доступен. После этого можно восстановить и повторно подключить недействительный основной кластер к топологии InnoDB ClusterSet, при условии, что вы можете исправить проблемы.
Когда у основного InnoDB Cluster в развертывании InnoDB ClusterSet возникают проблемы или к нему невозможно получить доступ, не следует сразу же выполнять аварийный failover на репликативный кластер. Вместо этого всегда следует начать с попытки исправить текущий активный основной кластер.
Почему не просто выполнить failover? Репликативные кластеры в топологии InnoDB ClusterSet делают всё возможное, чтобы оставаться синхронизированными с основным кластером. Однако в зависимости от объёма транзакций, скорости и ёмкости сетевых подключений между основным кластером и репликативными кластерами, репликативные кластеры могут отставать от основного кластера в получении транзакций и применении изменений к своим данным. Это называется задержкой репликации. Некоторая задержка репликации ожидается в большинстве топологий репликации, и она вполне вероятна в развертывании InnoDB ClusterSet, где кластеры географически распределены и находятся в разных центрах обработки данных.
Также возможно, что основной кластер окажется отключённым от других элементов топологии InnoDB ClusterSet из-за сетевого разрыва, но останется активным. Если это произойдёт, некоторые репликативные кластеры могут остаться с основным кластером, и некоторые экземпляры и клиентские приложения могут продолжить подключение к основному кластеру и применение транзакций. В этой ситуации разделы топологии InnoDB ClusterSet начинают расходиться, имея различные наборы транзакций в каждой группе серверов.
При наличии задержки репликации или сетевого разрыва, если вы инициируете аварийный failover на репликативный кластер, все нереплицированные или расходящиеся транзакции на основном кластере могут быть потеряны. В случае сетевого разрыва failover может создать ситуацию «разделенного мозга», где различные части топологии имеют различные наборы транзакций. Поэтому всегда следует попытаться исправить или повторно подключить основной кластер перед инициированием аварийного failover. Если основной кластер не может быть исправлен достаточно быстро или к нему невозможно подключиться, вы можете продолжить аварийный failover.
Диаграмма показывает последствия аварийного failover в примере развертывания InnoDB ClusterSet. Основной кластер в дата-центре Рим отключился, поэтому был выполнен аварийный failover, чтобы репликативный кластер в дата-центре Брюссель стал основным кластером InnoDB для развертывания InnoDB ClusterSet. Кластер Рим помечается как недействительный, и его статус в развертывании InnoDB ClusterSet понижается до репликативного кластера, хотя в настоящее время он не может реплицировать транзакции из кластера Брюссель.
Рисунок 9.3 Failover InnoDB ClusterSet
Экземпляры MySQL Router, которые были настроены на следование основному кластеру, перенаправили чтение и запись трафика на кластер Брюссель, который теперь является основным. Экземпляр MySQL Router, который перенаправлял чтение трафика на кластер Брюссель по имени, когда он был репликативным кластером, продолжает перенаправлять трафик на него и не затрагивается тем, что кластер теперь является основным, а не репликативным. Однако экземпляр MySQL Router, который перенаправлял чтение трафика на кластер Рим по имени, в настоящее время не может отправлять туда какой-либо трафик. Приложению для отчётов в данном примере не нужно сообщать об отключении локального дата-центра, но если приложению всё ещё нужно функционировать, настройки перенаправления экземпляра MySQL Router следует изменить, либо на следование основному кластеру, либо на отправку трафика в кластер Брюссель.
Для выполнения аварийного failover для основного InnoDB Cluster выполните следующую процедуру:
-
Используя MySQL Shell, подключитесь к любому активному серверу-члену в развертывании InnoDB ClusterSet, используя учетную запись администратора InnoDB Cluster (созданную с помощью
). Вы также можете использовать учетную запись конфигурации сервера InnoDB Cluster, которая также имеет необходимые разрешения.cluster.setupAdminAccount()После установления подключения получите объект
ClusterSetс этого сервера-члена, используя командуdba.getClusterSet()или. Объектcluster.getClusterSet()ClusterSet, который вы ранее извлекли с сервера-члена, который сейчас оффлайн, больше не будет работать, поэтому вам нужно получить его снова с онлайн сервера. Важно использовать учетную запись администратора InnoDB Cluster или учетную запись конфигурации сервера, чтобы у пользователя по умолчанию, хранящегося в объектеClusterSet, были правильные разрешения. Например:mysql-js>
\connect admin2@127.0.0.1:4410Creating a session to 'admin2@127.0.0.1:4410' Please provide the password for 'admin2@127.0.0.1:4410': ******** Save password for 'admin2@127.0.0.1:4410'? [Y]es/[N]o/Ne[v]er (default No): Fetching schema names for autocompletion... Press ^C to stop. Closing old connection... Your MySQL connection id is 71 Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial No default schema selected; type \use <schema> to set one. <ClassicSession:admin2@127.0.0.1:4410> mysql-js>myclusterset = dba.getClusterSet()<ClusterSet:testclusterset> -
Проверьте состояние всего развертывания, используя функцию
AdminAPI в MySQL Shell. Используйте опциюclusterSet.status()extended, чтобы увидеть точное местоположение и природу проблем. Например:mysql-js>
myclusterset.status({extended: 1})Для объяснения вывода см. Раздел 9.7 «Статус и топология InnoDB ClusterSet».
-
InnoDB Cluster может переносить некоторые проблемы и работать достаточно хорошо, чтобы продолжить как часть развертывания InnoDB ClusterSet. Основной кластер, который работает приемлемо, имеет глобальный статус
OKпри проверке с помощью команды. Например, если один из серверов-членов кластера выходит из строя, даже если этот сервер является основным, технология Group Replication может справиться с этой ситуацией и переконфигурировать себя.clusterSet.status()Если основной кластер всё ещё функционирует приемлемо в развертывании InnoDB ClusterSet в соответствии с отчётом о состоянии, но вам необходимо выполнить техническое обслуживание или устранить незначительные проблемы для улучшения работы основного кластера, вы можете выполнить контролируемую смену на кластер реплик. Затем вы можете вывести основной кластер из работы, при необходимости, исправить любые проблемы и запустить его повторно в развертывании InnoDB ClusterSet. Инструкции по выполнению этого действия см. в Разделе 9.8 «Контролируемая смена InnoDB ClusterSet».
Если основной кластер не работает приемлемо (с глобальным статусом
NOT_OK) в развертывании InnoDB ClusterSet, но вы можете с ним связаться, сначала попробуйте исправить любые проблемы с помощью AdminAPI через MySQL Shell. Например, если основной кластер потерял кворум, его можно восстановить с помощью команды. Инструкции по выполнению этого действия см. в Разделе 9.10 «Восстановление и повторное подключение InnoDB ClusterSet».cluster.forceQuorumUsingPartitionOf-
Если вы не можете выполнить контролируемую смену, и вы не можете быстро решить проблему, работая с основным кластером (например, потому что вы не можете с ним связаться), переходите к аварийному переключению. Сначала выберите подходящий кластер реплик, который может взять на себя роль основного кластера. Пригодность кластера реплик для аварийного переключения зависит от его глобального состояния, как показано командой
:clusterSet.status()Таблица 9.2 Разрешенные операции над кластерами по статусу
Таблица 9.2 Разрешенные операции над кластерами по статусу Глобальный статус InnoDB Cluster в ClusterSet Маршрутизируемый Контролируемая смена Аварийное переключение OKДа Да Да OK_NOT_REPLICATINGДа, если указано как целевой кластер по имени Да Да OK_NOT_CONSISTENTДа, если указано как целевой кластер по имени Нет Да OK_MISCONFIGUREDДа Да Да NOT_OKНет Нет Нет INVALIDATEDДа, если указано как целевой кластер по имени и задана политика маршрутизации accept_roНет Нет UNKNOWNПодключённые экземпляры маршрутизаторов могут всё ещё маршрутизировать трафик к кластеру Нет Нет Выбранный вами кластер реплик должен иметь самый актуальный набор транзакций (набор GTID) среди всех доступных кластеров реплик. Если для аварийного переключения подходит более одного кластера реплик, проверьте задержку репликации для каждого кластера (которая отображается в расширенном выводе для команды
). Выберите кластер реплик с наименьшей задержкой репликации, который, следовательно, должен иметь больше транзакций. Процесс аварийного переключения проверяет наборы GTID для всех доступных кластеров реплик и сообщает вам, если другой кластер более актуален, чтобы вы могли попробовать снова с этим кластером.clusterSet.status() -
Проверьте параметры маршрутизации, заданные для каждого экземпляра MySQL Router, и глобальную политику для развертывания InnoDB ClusterSet, выполнив команду
в MySQL Shell, подключившись к любому серверу-члену в развертывании InnoDB ClusterSet. Например:clusterSet.routingOptions()mysql-js>
myclusterset.routingOptions(){ "domainName": "testclusterset", "global": { "invalidated_cluster_policy": "drop_all", "target_cluster": "primary" }, "routers": { "Rome1": { "target_cluster": "primary" }, "Rome2": {} } }Если все экземпляры MySQL Router настроены на следование основному кластеру (
"target_cluster": "primary"), трафик будет автоматически перенаправлен на новый основной кластер в течение нескольких секунд после переключения. Если для экземпляра MySQL Router параметр маршрутизации не отображается, как в примере выше с"target_cluster"дляRome2, это означает, что для этого экземпляра не задана эта политика, и он следует глобальной политике.Если какие-либо экземпляры настроены на целевой основной кластер по имени (
"target_cluster": "), они не будут перенаправлять трафик на новый основной. Когда основной кластер не функционирует, командаname_of_primary_cluster"не может быть использована для изменения параметров маршрутизации, поэтому вы не можете перенаправить трафик, обрабатываемый этим экземпляром MySQL Router, пока переключение на новый основной кластер не будет завершено.clusterSet.setRoutingOption() Если возможно, попытайтесь убедиться, что исходный основной кластер отключён, а если он подключён, попробуйте его остановить. Если он остаётся подключённым и продолжает получать трафик от клиентов, может возникнуть ситуация раскола, в которой отдельные части InnoDB ClusterSet расходятся.
-
Для продолжения аварийного переключения выполните команду
, указав кластер реплик, который станет новым основным кластером. Например:clusterSet.forcePrimaryCluster()mysql-js>
myclusterset.forcePrimaryCluster("clustertwo")Failing-over primary cluster of the clusterset to 'clustertwo' * Verifying primary cluster status None of the instances of the PRIMARY cluster 'clusterone' could be reached. * Verifying clusterset status ** Checking cluster clustertwo Cluster 'clustertwo' is available ** Checking whether target cluster has the most recent GTID set * Promoting cluster 'clustertwo' * Updating metadata PRIMARY cluster failed-over to 'clustertwo'. The PRIMARY instance is '127.0.0.1:4410' Former PRIMARY cluster was INVALIDATED, transactions that were not yet replicated may be lost.В команде
:clusterSet.forcePrimaryCluster()Параметр
clusterNameобязателен и определяет идентификатор, используемый для кластера реплик в InnoDB ClusterSet, как указано в выводе от команды. В примере,clusterSet.status()— кластер, который должен стать новым основным.clustertwoИспользуйте опцию
dryRun, если вы хотите выполнить проверки и записать изменения, не фактически их выполняя.Используйте опцию
invalidateReplicaClustersдля наименования любых кластеров реплик, недоступных или недействующих. Они будут помечены как невалидные во время процесса переключения. Переключение отменяется, если во время процесса обнаруживаются недоступные или недействующие кластеры реплик, которые вы не назвали. В этой ситуации вы должны либо восстановить и подключить кластеры реплик, а затем повторить команду, либо назвать их в этой опции при повторной попытке команды и исправить их позже.Используйте опцию
timeout, чтобы определить максимальное время в секундах ожидания применения ожидающих транзакций в каждом экземпляре кластера. Убеждение, что GTID_EXECUTED содержит самый актуальный набор GTID. Значение по умолчанию извлекается из опцииdba.gtidWaitTimeout.
При выполнении команды
MySQL Shell проверяет, соответствует ли целевой кластер реплик требованиям для перехода в роль основного кластера, и возвращает ошибку, если этого не происходит.clusterSet.forcePrimaryCluster()Если целевой кластер реплик удовлетворяет требованиям, MySQL Shell выполняет следующие задачи:
Пытается связаться с текущим основным кластером и останавливает переключение, если он действительно может быть достигнут.
Проверяет наличие недоступных или недействующих кластеров реплик, которые не были указаны с помощью
invalidateReplicaClusters, и останавливает переключение, если такие кластеры найдены.Помечает все кластеры реплик, перечисленные в
invalidateReplicaClusters, как невалидные, а старый основной кластер — как невалидный.Проверяет, что у целевого кластера реплик есть самый актуальный набор GTID среди доступных кластеров реплик. Это включает остановку канала репликации ClusterSet во всех кластерах реплик.
Обновляет канал репликации ClusterSet во всех кластерах реплик для репликации с целевым кластером как новым основным кластером.
Устанавливает целевой кластер в качестве основного кластера в метаданных ClusterSet и преобразует старый основной кластер в кластер реплик, хотя он в настоящее время не функционирует как кластер реплик, потому что помечен как невалидный.
Во время аварийного переключения MySQL Shell не пытается синхронизировать целевой кластер реплик с текущим основным кластером и не блокирует текущий основной кластер. Если исходный основной кластер остаётся подключённым, он должен быть остановлен, как только с ним можно будет связаться.
-
Если у вас есть экземпляры MySQL Router, которые нужно переключить на целевой новый основной кластер, сделайте это сейчас. Вы можете настроить их на следование основному кластеру (
"target_cluster": "primary") или указать кластер реплик, который принял на себя роль основного кластера ("target_cluster": "). Например:name_of_new_primary_cluster"mysql-js>
myclusterset.setRoutingOption('Rome1', 'target_cluster', 'primary')or mysql-js>myclusterset.setRoutingOption('Rome1', 'target_cluster', 'clustertwo')Routing option 'target_cluster' successfully updated in router 'Rome1'.Выполните команду
, чтобы проверить, что все экземпляры MySQL Router теперь правильно маршрутизируют.clusterSet.routingOptions() Снова выполните команду
, используя опциюclusterSet.status()extended, чтобы проверить состояние развертывания InnoDB ClusterSet.
-
Если и когда вы сможете снова связаться со старым основным кластером, сначала убедитесь, что к нему не направляется трафик приложений, и отключите его. Затем выполните процедуру в разделе 9.10 «Восстановление и повторное присоединение InnoDB ClusterSet», чтобы проверить транзакции и определить, как организовать топологию InnoDB ClusterSet в дальнейшем.
После аварийного переключения, и существует риск различий наборов транзакций между частями ClusterSet, необходимо изолировать кластер либо от записи трафика, либо от всего трафика. Более подробную информацию см. в Разделе «Изоляция кластеров в InnoDB ClusterSet».
Если вам пришлось сделать недействительными какие-либо реплицированные кластеры во время процесса переключения, если и когда вы сможете снова с ними связаться, вы можете использовать процедуру в разделе 9.10 «Восстановление и повторное присоединение InnoDB ClusterSet», чтобы восстановить их и добавить обратно в InnoDB ClusterSet.
© 2025 Oracle
Licensed under the GPLv2 License.