8.8 Управляемый переход InnoDB ClusterSet
Управляемый переход делает выбранный репликативный кластер первичным кластером для развертывания InnoDB ClusterSet. Во время процесса управляемого перехода обеспечивается согласованность данных. Процесс проверяет, что выбранный репликативный кластер синхронизирован с первичным кластером (что может означать кратковременное ожидание, если есть задержка репликации), затем делает этот кластер первичным для InnoDB ClusterSet. Исходный первичный кластер понижается до рабочего репликативного кластера только для чтения. Затем вы можете отключить исходный первичный кластер, если это необходимо, исправить любые проблемы и вернуть его в работу в развертывании InnoDB ClusterSet.
Следуйте процедуре управляемого перехода, если первичный кластер в развертывании InnoDB ClusterSet функционирует приемлемо, но вам нужно выполнить техническое обслуживание или исправить некоторые незначительные проблемы для повышения его производительности. Первичный кластер, который функционирует приемлемо, имеет глобальный статус OK при проверке с помощью команды AdminAPI в MySQL Shell.clusterSet.status()
Если первичный кластер не функционирует приемлемо (с глобальным статусом NOT_OK) в развертывании InnoDB ClusterSet, сначала попробуйте исправить любые проблемы, используя AdminAPI через MySQL Shell. Например, если первичный кластер потерял кворум, его можно восстановить с помощью команды . Инструкции по этому вопросу см. в разделе 8.10 «Ремонт и повторное присоединение InnoDB ClusterSet».cluster.forceQuorumUsingPartitionOf
Если вы не можете исправить проблему, работая с первичным кластером (например, потому что не можете с ним связаться), вам необходимо выполнить аварийный переход. Аварийный переход предназначен для восстановления после катастрофы, когда первичный кластер внезапно недоступен. Эта процедура сопряжена с риском потери транзакций и созданием ситуации «разделенного мозга» для InnoDB ClusterSet. Если вам необходимо выполнить аварийный переход, следуйте процедуре в разделе 8.9 «Аварийный переход InnoDB ClusterSet», чтобы управлять риском.
Диаграмма показывает последствия управляемого перехода в примере развертывания InnoDB ClusterSet. Первичному кластеру в дата-центре Рим необходимо техническое обслуживание, поэтому был выполнен управляемый переход, чтобы сделать репликативный кластер в дата-центре Брюссель первичным для развертывания InnoDB ClusterSet и понизить кластер Рим до репликативного. Канал репликации ClusterSet в кластере Рим был активирован процессом управляемого перехода, и он реплицирует транзакции из кластера Брюссель. Теперь, когда кластер Рим является репликативным, серверы-члены или весь кластер могут безопасно быть отключены при необходимости для выполнения работ по техническому обслуживанию.
Рисунок 8.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})Для объяснения вывода см. Раздел 8.7, «Статус и топология InnoDB ClusterSet».
-
Определите подходящий кластер реплик, который может взять на себя роль первичного кластера. Пригодность кластера реплик для управляемого переключения зависит от его глобального статуса, который сообщается командой
:clusterSet.status()Таблица 8.1 Разрешенные операции с кластерами в зависимости от статуса
Таблица 8.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 на всех кластерах реплик, чтобы выполнять репликацию с целевым кластером в качестве нового первичного.
Отключает на первичном сервере целевого кластера и включает действие члена Group Replication
mysql_disable_super_read_only_if_primaryдля обработки любых изменений на первичном сервере в этом кластере.Отключает действие члена 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. Раздел 8.10, «InnoDB ClusterSet Repair and Rejoin» объясняет, как устранить неполадки в кластере, как присоединить кластер к InnoDB ClusterSet и как сделать кластер снова основным кластером.
© 2025 Oracle
Licensed under the GPLv2 License.