Spec-Zone.ru › MySQL Shell 8.4

8.8 Управляемый переход InnoDB ClusterSet

Управляемый переход делает выбранный репликативный кластер первичным кластером для развертывания InnoDB ClusterSet. Во время процесса управляемого перехода обеспечивается согласованность данных. Процесс проверяет, что выбранный репликативный кластер синхронизирован с первичным кластером (что может означать кратковременное ожидание, если есть задержка репликации), затем делает этот кластер первичным для InnoDB ClusterSet. Исходный первичный кластер понижается до рабочего репликативного кластера только для чтения. Затем вы можете отключить исходный первичный кластер, если это необходимо, исправить любые проблемы и вернуть его в работу в развертывании InnoDB ClusterSet.

Следуйте процедуре управляемого перехода, если первичный кластер в развертывании InnoDB ClusterSet функционирует приемлемо, но вам нужно выполнить техническое обслуживание или исправить некоторые незначительные проблемы для повышения его производительности. Первичный кластер, который функционирует приемлемо, имеет глобальный статус OK при проверке с помощью команды clusterSet.status() AdminAPI в MySQL Shell.

Если первичный кластер не функционирует приемлемо (с глобальным статусом NOT_OK) в развертывании InnoDB ClusterSet, сначала попробуйте исправить любые проблемы, используя AdminAPI через MySQL Shell. Например, если первичный кластер потерял кворум, его можно восстановить с помощью команды cluster.forceQuorumUsingPartitionOf. Инструкции по этому вопросу см. в разделе 8.10 «Ремонт и повторное присоединение InnoDB ClusterSet».

Если вы не можете исправить проблему, работая с первичным кластером (например, потому что не можете с ним связаться), вам необходимо выполнить аварийный переход. Аварийный переход предназначен для восстановления после катастрофы, когда первичный кластер внезапно недоступен. Эта процедура сопряжена с риском потери транзакций и созданием ситуации «разделенного мозга» для InnoDB ClusterSet. Если вам необходимо выполнить аварийный переход, следуйте процедуре в разделе 8.9 «Аварийный переход InnoDB ClusterSet», чтобы управлять риском.

Диаграмма показывает последствия управляемого перехода в примере развертывания InnoDB ClusterSet. Первичному кластеру в дата-центре Рим необходимо техническое обслуживание, поэтому был выполнен управляемый переход, чтобы сделать репликативный кластер в дата-центре Брюссель первичным для развертывания InnoDB ClusterSet и понизить кластер Рим до репликативного. Канал репликации ClusterSet в кластере Рим был активирован процессом управляемого перехода, и он реплицирует транзакции из кластера Брюссель. Теперь, когда кластер Рим является репликативным, серверы-члены или весь кластер могут безопасно быть отключены при необходимости для выполнения работ по техническому обслуживанию.

Рисунок 8.2 Переход InnoDB ClusterSet

The InnoDB Cluster in the Rome datacenter is now a replica cluster, and the InnoDB Cluster in the Brussels datacenter is now the primary cluster. The asynchronous replication channel is now sending transactions from the Brussels cluster to the Rome cluster. The MySQL Router instances that targeted the primary or the Brussels cluster are sending traffic to the Brussels cluster. The instance that specifically targeted the Rome cluster can continue to send traffic to it because it is only sending read traffic.

Экземпляры MySQL Router в примере развертывания InnoDB Cluster, которые были настроены на следование первичному кластеру, перенаправили трафик чтения и записи в кластер Брюссель, который теперь является первичным. Экземпляр MySQL Router, который перенаправлял трафик чтения в кластер Брюссель по имени, когда он был репликативным кластером, продолжает перенаправлять трафик в него и не затрагивается тем фактом, что кластер теперь является первичным, а не репликативным. Аналогично, экземпляр MySQL Router, который перенаправлял трафик чтения в кластер Рим по имени, может продолжать это делать, потому что репликативный кластер по-прежнему принимает трафик чтения.

Чтобы выполнить управляемый переход для первичного InnoDB Cluster, следуйте этой процедуре:

  1. Используя MySQL Shell, подключитесь к любому узловому серверу в первичном кластере или в одном из кластеров реплик, используя учетные данные администратора InnoDB Cluster (созданные с помощью cluster.setupAdminAccount()). Вы также можете использовать учетные данные конфигурации сервера InnoDB Cluster, которые также имеют необходимые разрешения. Получите объект ClusterSet, используя команду dba.getClusterSet() или cluster.getClusterSet(). Важно использовать учетные данные администратора InnoDB Cluster или учетные данные конфигурации сервера, чтобы учетная запись пользователя по умолчанию, хранящаяся в объекте ClusterSet, имела правильные разрешения. Например:

    mysql-js> \connect admin2@127.0.0.1:3310
    Creating 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>
    

    В этом примере:

    • admin2@127.0.0.1:3310 — строка подключения в формате URI для любого активного узлового сервера в кластере.

      Строка подключения в формате URI состоит из следующих элементов:

    • admin2 — имя пользователя учетной записи администратора InnoDB Cluster.

    • 127.0.0.1:3310 — хост и порт узлового сервера, как отображается командой cluster.status().

    • Возвращаемый объект ClusterSet присваивается переменной myclusterset.

  2. Проверьте статус всей развертывания InnoDB ClusterSet, используя команду clusterSet.status() AdminAPI в MySQL Shell. Используйте параметр extended, чтобы просмотреть подробную информацию обо всех кластерах в развертывании и проверить наличие каких-либо проблем. Например:

    mysql-js> myclusterset.status({extended: 1})
    

    Для объяснения вывода см. Раздел 8.7, «Статус и топология InnoDB ClusterSet».

  3. Определите подходящий кластер реплик, который может взять на себя роль первичного кластера. Пригодность кластера реплик для управляемого переключения зависит от его глобального статуса, который сообщается командой 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 не допускает управляемого переключения на кластер в этом состоянии, так как клиенты будут получать неверные данные. Аварийное переключение возможно, если кластер имеет наиболее актуальный набор транзакций среди доступных вариантов.

  4. Проверьте параметры маршрутизации, установленные для каждого экземпляра MySQL Router, и глобальную политику для развертывания InnoDB ClusterSet, выдав команду clusterSet.routingOptions() в MySQL Shell, подключившись к любому узловому серверу в развертывании InnoDB ClusterSet. Например:

    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'.
    

    В этом примере, myclusterset переменная для объекта ClusterSet, а Rome1 — имя экземпляра MySQL Router.

    Или вы можете указать кластер реплик, который будет принимать на себя роль первичного кластера, в этом случае установите параметр ("target_cluster": "name_of_new_primary_cluster") после переключения, когда вы проверили, что оно прошло успешно.

  5. Выполните команду 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, чтобы указать любые недоступные или неработающие кластеры реплик. Во время процесса переключения они будут помечены как недействительные. Переключение будет отменено, если во время процесса обнаружатся недоступные или неработающие кластеры реплик, которые вы не указали. В этой ситуации вы должны либо восстановить и повторно подключить кластеры реплик, а затем повторить команду, либо указать их в этом параметре при повторной попытке выполнения команды и исправить их позже.

    При выполнении команды clusterSet.setPrimaryCluster(), MySQL Shell проверяет, соответствует ли целевой кластер реплик требованиям для перехода в первичный кластер, и возвращает ошибку, если нет. Если целевой кластер реплик соответствует требованиям, MySQL Shell выполняет следующие задачи:

    • Проверяет наличие недоступных или неработающих кластеров реплик, которые не были указаны с помощью invalidateReplicaClusters.

    • Ожидает, пока целевой кластер реплик синхронизируется с текущим первичным кластером, применяя все ожидающие транзакции от первичного. Если таймаут, установленный параметром timeout, истечет до завершения применения транзакций кластером реплик, переключение будет отменено.

    • Блокирует текущий первичный кластер, выполнив инструкцию FLUSH TABLES WITH READ LOCK и установив системную переменную на всех узловых серверах, чтобы предотвратить дальнейшие изменения во время переключения. Действие члена Group Replication mysql_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 mysql_start_failover_channels_if_primary на этом сервере, чтобы включить асинхронное переключение соединения для реплик по каналу репликации ClusterSet.

    • Устанавливает целевой кластер в качестве первичного в метаданных ClusterSet и преобразует старый первичный кластер в кластер реплик.

  6. Выполните команду clusterSet.status() еще раз с параметром extended, чтобы проверить статус развертывания InnoDB ClusterSet.

  7. Если у вас есть экземпляры MySQL Router, которые нужно переключить на целевой первичный кластер, сделайте это сейчас. Например:

    mysql-js> myclusterset.setRoutingOption('Rome1', 'target_cluster', 'clustertwo')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.
    

    В этом примере, myclusterset переменная для объекта ClusterSet, Rome1 — имя экземпляра MySQL Router, а clustertwo — имя целевого кластера. После завершения выполните команду clusterSet.routingOptions(), чтобы убедиться, что все экземпляры MySQL Router теперь правильно маршрутизируют трафик.

  1. Теперь вы можете работать со старым основным кластером, чтобы устранить неполадки или выполнить техническое обслуживание. Если вам пришлось аннулировать какие-либо реплицированные кластеры во время процесса переключения, вы также можете их восстановить и добавить обратно в InnoDB ClusterSet. Раздел 8.10, «InnoDB ClusterSet Repair and Rejoin» объясняет, как устранить неполадки в кластере, как присоединить кластер к InnoDB ClusterSet и как сделать кластер снова основным кластером.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-shell-8.4-en/innodb-clusterset-switchover.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API