9.8 Управляемая смена основного кластера InnoDB ClusterSet
Управляемая смена переводит выбранный кластер-реплику в основной кластер для развертывания InnoDB ClusterSet. Во время процесса управляемой смены обеспечивается согласованность данных. Процесс проверяет, что выбранный кластер-реплику синхронизирован с основным кластером (что может означать небольшую задержку, если есть задержка репликации), затем делает этот кластер основным для InnoDB ClusterSet. Исходный основной кластер понижается до рабочего кластера-реплики только для чтения. Затем вы можете отключить исходный основной кластер при необходимости, исправить любые проблемы и вернуть его в работу в развертывании InnoDB ClusterSet.
Следуйте процедуре управляемой смены, если основной кластер в развертывании InnoDB ClusterSet работает удовлетворительно, но вам необходимо выполнить техническое обслуживание или исправить некоторые незначительные проблемы для улучшения работы основного кластера. Основной кластер, который работает удовлетворительно, имеет глобальный статус OK, когда вы проверяете его с помощью команды AdminAPI в MySQL Shell.clusterSet.status()
Если основной кластер не работает удовлетворительно (с глобальным статусом NOT_OK) в развертывании InnoDB ClusterSet, сначала попробуйте исправить любые проблемы с помощью AdminAPI через MySQL Shell. Например, если основной кластер потерял кворум, он может быть восстановлен с помощью команды . Инструкции по этому вопросу см. в разделе 9.10 «Ремонт и повторное присоединение InnoDB ClusterSet».cluster.forceQuorumUsingPartitionOf
Если вы не можете исправить проблему, работая с основным кластером (например, потому что вы не можете с ним связаться), вам необходимо выполнить аварийный переключение. Аварийное переключение предназначено для восстановления после катастрофы, когда основной кластер внезапно становится недоступен. Эта процедура влечёт риск потери транзакций и создания ситуации «разделенного мозга» для InnoDB ClusterSet. Если вам необходимо выполнить аварийное переключение, следуйте процедуре в разделе 9.9 «Аварийное переключение InnoDB ClusterSet», чтобы гарантировать, что риск будет учтён.
На диаграмме показано влияние управляемой смены в примере развертывания InnoDB ClusterSet. Основной кластер в дата-центре Рим требует технического обслуживания, поэтому была выполнена управляемая смена для перевода кластера-реплики в дата-центре Брюссель в основной кластер для развертывания InnoDB ClusterSet и понижения кластера Рим до реплики. Канал репликации ClusterSet на кластере Рим был активирован процессом управляемой смены, и он выполняет репликацию транзакций из кластера Брюссель. Теперь, когда кластер Рим является кластером-репликой, серверы-члены или весь кластер могут безопасно быть отключены при необходимости для выполнения работ по техническому обслуживанию.
Рисунок 9.2 Переключение InnoDB ClusterSet
Примеры экземпляров MySQL Router в развертывании InnoDB Cluster, которые были настроены на следование за основным кластером, перенаправили чтение и запись трафика на кластер Брюссель, который теперь является основным. Экземпляр MySQL Router, который перенаправлял трафик чтения на кластер Брюссель по имени, когда он был кластером-репликой, продолжает перенаправлять трафик на него и не затрагивается тем, что кластер теперь является основным, а не кластером-репликой. Аналогично, экземпляр MySQL Router, который перенаправлял трафик чтения на кластер Рим по имени, может продолжать это делать, потому что кластер-реплики всё ещё принимает трафик чтения.
Для выполнения управляемой смены основного InnoDB Cluster следуйте этой процедуре:
-
Используя MySQL Shell, подключитесь к любому серверу-члену в первичном кластере или в одном из реплицирующих кластеров, используя учетную запись администратора InnoDB Cluster (созданную с помощью
). Вы также можете использовать учетную запись конфигурации сервера InnoDB Cluster, которая также имеет необходимые разрешения. Получите объектcluster.setupAdminAccount()ClusterSet, используя командуdba.getClusterSet()или. Важно использовать учетную запись администратора InnoDB Cluster или учетную запись конфигурации сервера, чтобы учетная запись пользователя по умолчанию, хранящаяся в объектеcluster.getClusterSet()ClusterSet, имела правильные разрешения. Например:mysql-js>
\connect admin2@127.0.0.1:3310Creating a session to 'admin2@127.0.0.1:3310' Please provide the password for 'admin2@127.0.0.1:3310': ******** Save password for 'admin2@127.0.0.1:3310'? [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 52 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:3310> mysql-js>myclusterset = dba.getClusterSet()<ClusterSet:testclusterset>В этом примере:
-
— это строка подключения в формате URI для любого экземпляра сервера-члена, который онлайн в кластере.admin2@127.0.0.1:3310Строка подключения в формате URI состоит из следующих элементов:
— имя пользователя для учетной записи администратора InnoDB Cluster.admin2— хост и порт для экземпляра сервера-члена, как отображается командой127.0.0.1:3310.cluster.status()Возвращенный объект
ClusterSetприсваивается переменнойmyclusterset.
-
-
Проверьте состояние всего развертывания InnoDB ClusterSet, используя команду
AdminAPI в MySQL Shell. Используйте опциюclusterSet.status()extended, чтобы просмотреть подробную информацию обо всех кластерах в развертывании и проверить наличие каких-либо проблем. Например:mysql-js>
myclusterset.status({extended: 1})Для объяснения вывода см. раздел 9.7 «Состояние и топология InnoDB ClusterSet».
-
Определите подходящий реплицирующий кластер, который может заменить первичный кластер. Пригодность реплицирующего кластера для управляемого переключения зависит от его глобального состояния, как сообщается командой
:clusterSet.status()Таблица 9.1 Разрешенные операции с кластером по состоянию
Таблица 9.1 Разрешенные операции с кластером по состоянию Глобальное состояние InnoDB Cluster в ClusterSet Маршрутизируемый Управляемое переключение Аварийный переход OKДа Да Да OK_NOT_REPLICATINGДа, если указан целевой кластер по имени Да Да OK_NOT_CONSISTENTДа, если указан целевой кластер по имени Нет Да OK_MISCONFIGUREDДа Да Да NOT_OKНет Нет Нет INVALIDATEDДа, если указан целевой кластер по имени и установлена политика маршрутизации accept_roНет Нет UNKNOWNПодключенные экземпляры MySQL Router все еще могут маршрутизировать трафик в кластер Нет Нет У реплицирующего кластера с глобальным состоянием
OK_NOT_CONSISTENTесть набор транзакций в кластере (набор GTID), который не соответствует набору GTID в первичном кластере. InnoDB ClusterSet не разрешает управляемое переключение на кластер в этом состоянии, потому что клиенты будут получать неверные данные. Аварийный переход возможен, если кластер имеет наиболее актуальный набор транзакций среди доступных вариантов. -
Проверьте параметры маршрутизации, которые установлены для каждого экземпляра 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 отправляет трафик в кластер, который в настоящее время является первичным в развертывании InnoDB ClusterSet. Если все экземпляры MySQL Router настроены на следование первичному (
"target_cluster": "primary"), трафик будет автоматически перенаправлен на новый первичный кластер в течение нескольких секунд после переключения. Если параметр маршрутизации не отображается для экземпляра MySQL Router, как в примере выше дляRome2, это означает, что для экземпляра не установлена эта политика, и он следует глобальной политике.Если какие-либо экземпляры настроены на целевой первичный кластер по имени (
"target_cluster": "), они не перенаправят трафик на новый первичный. В этой ситуации, если это уместно для приложения, вы можете использовать командуname_of_primary_cluster", чтобы изменить политику маршрутизации для этих экземпляров. Вы можете изменить эти экземпляры на следование первичному (clusterSet.setRoutingOption()"target_cluster": "primary"), в этом случае этот параметр можно установить сейчас. Например:mysql-js>
myclusterset.setRoutingOption('Rome1', 'target_cluster', 'primary')Routing option 'target_cluster' successfully updated in router 'Rome1'.В этом примере
— переменная для объектаmyclustersetClusterSet, а— имя экземпляра MySQL Router.Rome1Или вы можете указать реплицирующий кластер, который станет первичным, в этом случае установите параметр (
"target_cluster": ") после того, как переключение будет выполнено, когда вы убедитесь, что оно сработало.name_of_new_primary_cluster" -
Выполните команду
, указав реплицирующий кластер, который станет новым первичным кластером. Используйте объектclusterSet.setPrimaryCluster()ClusterSet, который вы получили, используя учетную запись администратора InnoDB Cluster, с помощью командыdba.getClusterSet()или. Например:cluster.getClusterSet()mysql-js>
myclusterset.setPrimaryCluster('clustertwo')Switching the primary cluster of the clusterset to 'clustertwo' * Verifying clusterset status ** Checking cluster clustertwo Cluster 'clustertwo' is available ** Checking cluster clusterone Cluster 'clusterone' is available * Refreshing replication account of demoted cluster * Synchronizing transaction backlog at 127.0.0.1:4410 ** Transactions replicated ############################################################ 100% * Updating metadata * Updating topology ** Changing replication source of 127.0.0.1:3330 to 127.0.0.1:4410 * Acquiring locks in replicaset instances ** Pre-synchronizing SECONDARIES ** Acquiring global lock at PRIMARY ** Acquiring global lock at SECONDARIES * Synchronizing remaining transactions at promoted primary ** Transactions replicated ############################################################ 100% * Updating replica clusters Cluster 'clustertwo' was promoted to PRIMARY of the clusterset. The PRIMARY instance is '127.0.0.1:4410'Для команды
:clusterSet.setPrimaryCluster()Параметр
clusterNameнеобходим и определяет идентификатор, используемый для реплицирующего кластера в InnoDB ClusterSet, как указано в выводе команды. В примереclusterSet.status()— кластер, который должен стать новым первичным.clustertwoИспользуйте опцию
dryRun, если вы хотите выполнить валидации и записать изменения без их фактического выполнения.Используйте опцию
timeout, чтобы установить максимальное количество секунд ожидания синхронизации реплицирующего кластера с первичным кластером до переключения. Если тайм-аут истекает, переключение отменяется.Используйте опцию
invalidateReplicaClusters, чтобы указать любые недоступные или неработающие реплицирующие кластеры. Эти кластеры будут помечены как недействительные во время процесса переключения. Переключение отменяется, если обнаружены любые недоступные или неработающие реплицирующие кластеры, которые вы не указали во время процесса. В этой ситуации вы должны либо восстановить и повторно подключить реплицирующие кластеры, а затем повторить команду, либо указать их в этом параметре при повторной попытке выполнения команды и исправить их позже.
При выполнении команды
MySQL Shell проверяет, соответствует ли целевой реплицирующий кластер требованиям для замены первичного кластера, и возвращает ошибку, если нет. Если целевой реплицирующий кластер соответствует требованиям, MySQL Shell выполняет следующие задачи:clusterSet.setPrimaryCluster()Проверка наличия недоступных или неработающих реплицирующих кластеров, которые не были указаны с помощью
invalidateReplicaClusters.Ожидание синхронизации целевого реплицирующего кластера с текущим первичным кластером путем применения всех незавершенных транзакций с первичного. Если тайм-аут, установленный параметром
timeout, истекает до завершения применения транзакций реплицирующим кластером, переключение отменяется.Блокировка текущего первичного кластера, выполнив оператор
FLUSH TABLES WITH READ LOCKи установив системную переменную на всех серверах-членах, чтобы предотвратить дальнейшие изменения во время переключения. Действие члена репликации Group Replicationmysql_disable_super_read_only_if_primaryотключено, чтобы значение сохранилось после переключения.-
Устранение расхождений в событиях изменения представления между текущим первичным кластером и реплицирующими кластерами, чтобы наборы GTID стали идентичными. Эти внутренние транзакции Group Replication идентифицируются UUID, указанным системной переменной. MySQL Shell вставляет пустые транзакции во все реплицирующие кластеры, чтобы согласовать события изменения представления в первичном кластере.
ПримечаниеЭто не требуется для кластеров, работающих на MySQL Server 8.3.0 или более поздней версии.
Обновление канала репликации ClusterSet на всех реплицирующих кластерах для репликации с целевым кластером в качестве нового первичного.
Отключение
mysql_disable_super_read_only_if_primaryна сервере первичного целевого кластера и включение действия члена репликации Group Replication для обработки любых изменений на сервере первичного кластера.Отключение действия члена репликации Group Replication
mysql_disable_super_read_only_if_primaryна сервере первичного кластера, чтобы он оставался только для чтения, и включение действия члена репликации Group Replicationна этом сервере для включения асинхронного переключения подключения для реплик на канале репликации ClusterSet.mysql_start_failover_channels_if_primaryУстановка целевого кластера в качестве первичного в метаданных ClusterSet и преобразование старого первичного кластера в реплицирующий.
Выполните команду
еще раз, используя опциюclusterSet.status()extended, чтобы проверить состояние развертывания InnoDB ClusterSet.-
Если у вас есть экземпляры MySQL Router, которые нужно переключить на целевой первичный кластер, сделайте это сейчас. Например:
mysql-js>
myclusterset.setRoutingOption('Rome1', 'target_cluster', 'clustertwo')Routing option 'target_cluster' successfully updated in router 'Rome1'.В этом примере
— переменная для объектаmyclustersetClusterSet,— имя экземпляра MySQL Router, аRome1— имя конкретного целевого кластера. Когда вы закончите, выполните командуclustertwo, чтобы проверить, что все экземпляры MySQL Router теперь правильно маршрутизируют трафик.clusterSet.routingOptions()
Теперь вы можете работать со старым первичным кластером для устранения неполадок или проведения технического обслуживания. Если вам пришлось сделать недействительными какие-либо реплицируемые кластеры во время процесса переключения, вы также можете восстановить их и добавить обратно в InnoDB ClusterSet. Раздел 9.10, «InnoDB ClusterSet Repair and Rejoin» описывает, как устранить неполадки с кластером, как присоединить кластер к InnoDB ClusterSet и как сделать кластер первичным кластером снова.
© 2025 Oracle
Licensed under the GPLv2 License.