Spec-Zone.ru › MySQL Shell 8.4

8.9 Аварийный переход InnoDB ClusterSet

Аварийный переход делает выбранный реплицирующий кластер основным кластером InnoDB для развертывания InnoDB ClusterSet. Эта процедура может быть использована, когда текущий основной кластер не работает или с ним невозможно связаться. Во время процесса аварийного перехода согласованность данных не гарантируется, поэтому для безопасности исходный основной кластер помечается как недействительный во время процесса перехода. Если исходный основной кластер остаётся онлайн, его следует отключить как можно скорее после установления связи с ним. Позже вы можете восстановить и повторно подключить недействительный основной кластер к топологии InnoDB ClusterSet, при условии, что вы сможете устранить проблемы.

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

Важно

Почему не просто выполнить переход? Реплицирующие кластеры в топологии InnoDB ClusterSet делают всё возможное, чтобы оставаться синхронизированными с основным кластером. Однако в зависимости от объёма транзакций и скорости и ёмкости сетевых соединений между основным кластером и реплицирующими кластерами, реплицирующие кластеры могут отставать от основного кластера в получении транзакций и применении изменений к их данным. Это называется лагом репликации. Некоторый лаг репликации ожидается в большинстве топологий репликации, и это довольно вероятно в развертывании InnoDB ClusterSet, где кластеры географически распределены и находятся в разных центрах обработки данных.

Также возможно, что основной кластер может быть отключён от других элементов топологии InnoDB ClusterSet из-за сетевого разрыва, но оставаться онлайн. Если это произойдёт, некоторые реплицирующие кластеры могут остаться с основным кластером, и некоторые экземпляры и клиентские приложения могут продолжить подключение к основному кластеру и применение транзакций. В этой ситуации разделенные области топологии InnoDB ClusterSet начинают расходиться, с различным набором транзакций в каждой группе серверов.

При наличии лага репликации или сетевого разрыва, если вы инициируете аварийный переход на реплицирующий кластер, любые нереплицированные или расходящиеся транзакции на основном кластере рискуют быть потерянными. В случае сетевого разрыва переход может создать ситуацию «разделенного мозга», где разные части топологии имеют расходящиеся наборы транзакций. Поэтому вы всегда должны попытаться исправить или повторно подключить основной кластер перед инициированием аварийного перехода. Если основной кластер нельзя исправить достаточно быстро или к нему нельзя получить доступ, вы можете перейти к аварийному переходу.

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

Рисунок 8.3 Аварийный переход InnoDB ClusterSet

The InnoDB Cluster in the Rome datacenter is now offline and invalidated, and the InnoDB Cluster in the Brussels datacenter is now the primary cluster. Asynchronous replication between the two is not taking place because the Rome cluster is not available. 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 cannot send traffic to the cluster.

Экземпляры MySQL Router, которые были настроены на следование за основным кластером, перенаправили трафик чтения и записи на брюссельский кластер, который теперь является основным. Экземпляр MySQL Router, который перенаправлял трафик чтения на брюссельский кластер по имени, когда он был реплицирующим кластером, продолжает перенаправлять трафик на него и не затрагивается тем фактом, что кластер теперь является основным, а не реплицирующим. Однако экземпляр MySQL Router, который перенаправлял трафик чтения на римский кластер по имени, в настоящее время не может отправлять туда никакой трафик. Приложению для отчётности в этом примере не нужно сообщать, когда локальный дата-центр отключён, но если приложению всё ещё нужно работать, параметры маршрутизации экземпляра MySQL Router следует изменить либо на следование за основным, либо на отправку трафика в брюссельский кластер.

Для выполнения аварийного перехода основного кластера InnoDB выполните следующую процедуру:

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

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

    mysql-js> \connect admin2@127.0.0.1:4410
    Creating 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>
    
  2. Проверьте состояние всего развертывания, используя функцию clusterSet.status() AdminAPI в MySQL Shell. Используйте опцию extended, чтобы увидеть точное место и природу проблем. Например:

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

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

  3. InnoDB Cluster может переносить некоторые проблемы и продолжать функционировать в рамках развертывания InnoDB ClusterSet. Основной кластер, функционирующий удовлетворительно, имеет глобальный статус OK при проверке с помощью команды clusterSet.status(). Например, если один из серверов-членов кластера выходит из строя, даже если этот сервер является основным, технология Group Replication может справиться с этой ситуацией и переконфигурироваться.

    Если основной кластер все еще функционирует удовлетворительно в развертывании InnoDB ClusterSet согласно отчету о статусе, но вам необходимо выполнить техническое обслуживание или исправить незначительные проблемы для улучшения работы основного кластера, вы можете выполнить управляемый перевод на кластер-репликант. Затем вы можете отключить основной кластер, если необходимо, исправить любые проблемы и вернуть его в работу в развертывании InnoDB ClusterSet. Инструкции по выполнению этого действия см. в разделе 8.8 «Управляемый перевод InnoDB ClusterSet».

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

  5. Если вы не можете выполнить управляемый перевод и не можете достаточно быстро исправить проблему, работая с основным кластером (например, потому что вы не можете с ним связаться), перейдите к аварийному переключению. Сначала определите подходящий кластер-репликант, который может взять на себя роль основного кластера. Пригодность кластера-репликанта для аварийного переключения зависит от его глобального состояния, как сообщает команда clusterSet.status():

    Таблица 8.2 Разрешенные операции с кластером по статусу

    Таблица 8.2 Разрешенные операции с кластером по статусу
    Глобальный статус InnoDB Cluster в ClusterSet Маршрутизируемый Управляемый перевод Аварийное переключение
    OK Да Да Да
    OK_NOT_REPLICATING Да, если указан как целевой кластер по имени Да Да
    OK_NOT_CONSISTENT Да, если указан как целевой кластер по имени Нет Да
    OK_MISCONFIGURED Да Да Да
    NOT_OK Нет Нет Нет
    INVALIDATED Да, если указан как целевой кластер по имени и политика маршрутизации accept_ro установлена Нет Нет
    UNKNOWN Подключенные маршрутизаторы могут по-прежнему маршрутизировать трафик в кластер Нет Нет

    Выбранный вами кластер-репликант должен иметь наиболее актуальный набор транзакций (набор GTID) среди всех доступных кластеров-репликантов. Если несколько кластеров-репликантов подходят для аварийного переключения, проверьте задержку репликации для каждого кластера (она отображается в расширенном выводе команды clusterSet.status()). Выберите кластер-репликант с наименьшей задержкой репликации, который, следовательно, должен содержать больше транзакций. Процесс аварийного переключения проверяет наборы GTID для всех доступных кластеров-репликантов и сообщает вам, если другой кластер более актуальный, чтобы вы могли попробовать снова с этим кластером.

  6. Проверьте параметры маршрутизации, установленные для каждого экземпляра 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 настроены на следование основному кластеру ("target_cluster": "primary"), трафик будет автоматически перенаправлен на новый основной кластер в течение нескольких секунд после переключения. Если для экземпляра MySQL Router не отображается параметр маршрутизации, как в примере выше с "target_cluster" для Rome2, это означает, что для него не установлена эта политика, и он следует глобальной политике.

    Если какие-либо экземпляры настроены на целевой основной кластер по имени ("target_cluster": "name_of_primary_cluster"), они не перенаправят трафик на новый основной. Когда основной кластер не функционирует, команда clusterSet.setRoutingOption() не может быть использована для изменения параметров маршрутизации, поэтому вы не можете перенаправить трафик, обрабатываемый этим экземпляром MySQL Router, пока не завершится переключение на новый основной кластер.

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

  8. Для продолжения аварийного переключения выполните команду 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.

    При выполнении команды clusterSet.forcePrimaryCluster() MySQL Shell проверяет, соответствует ли целевой кластер-репликант требованиям для взятия на себя роли основного кластера, и возвращает ошибку, если нет.

    Если целевой кластер-репликант соответствует требованиям, MySQL Shell выполняет следующие задачи:

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

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

    • Помечает все кластеры-репликанты, перечисленные в invalidateReplicaClusters, как недействительные и помечает старый основной кластер как недействительный.

    • Проверяет, что у целевого кластера-репликанта есть самый актуальный набор GTID среди доступных кластеров-репликантов. Это включает остановку канала репликации ClusterSet во всех кластерах-репликантах.

    • Обновляет канал репликации ClusterSet во всех кластерах-репликантах для репликации с целевого кластера в качестве нового основного.

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

    Во время аварийного переключения MySQL Shell не пытается синхронизировать целевой кластер-репликант с текущим основным кластером и не блокирует текущий основной кластер. Если исходный основной кластер остается онлайн, его следует остановить, как только он будет доступен.

  9. Если у вас есть экземпляры 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'.
    

    Выполните команду clusterSet.routingOptions(), чтобы проверить, что все экземпляры MySQL Router теперь правильно маршрутизируют.

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

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

    После аварийного переключения и существует риск различий в наборах транзакций между частями ClusterSet, необходимо изолировать кластер либо от записи, либо от всего трафика. Более подробную информацию см. в разделе Изоляция кластеров в 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-failover.html

Spec-Zone.ru

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