Spec-Zone.ru › MySQL Shell 8.4

8.10.1 Изоляция кластеров в InnoDB ClusterSet

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

Если происходит разрыв сети, то возможна ситуация разделения мозга (split-brain), когда экземпляры теряют синхронизацию и не могут корректно обмениваться данными для определения состояния синхронизации. Разделение мозга может возникнуть, например, когда DBA принимает решение принудительно выбрать реплику кластера в качестве первичного кластера, создавая более одного мастера, что приводит к ситуации разделения мозга.

В этой ситуации DBA может выбрать изоляцию исходного первичного кластера от:

  • Записи.

  • Всех операций.

Доступны три операции изоляции:

  • <Cluster>.fenceWrites(): Останавливает запись в первичный кластер ClusterSet. Реплики кластеров не принимают записи, поэтому эта операция не влияет на них.

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

  • <Cluster>.unfenceWrites(): Возобновляет запись. Эту операцию можно выполнить на кластере, который ранее был изолирован от записи с помощью операции <Cluster>.fenceWrites().

    На реплике кластера cluster.unfenceWrites() выполнить нельзя.

  • <Cluster>.fenceAllTraffic(): Изолирует кластер и все реплики чтения в этом кластере от всех операций. Если вы изолировали кластер от всех операций с помощью <Cluster>.fenceAllTraffic(), необходимо перезапустить кластер с помощью команды dba.rebootClusterFromCompleteOutage() MySQL Shell.

    Дополнительную информацию о dba.rebootClusterFromCompleteOutage() см. в разделе 7.8.3, «Перезагрузка кластера после серьезного сбоя».

fenceWrites()

Выполнение .fenceWrites() на реплике кластера возвращает ошибку:

ERROR: Unable to fence Cluster from write traffic:
operation not permitted on REPLICA Clusters
Cluster.fenceWrites: The Cluster '<Cluster>' is a REPLICA Cluster
of the ClusterSet '<ClusterSet>' (MYSQLSH 51616)

Хотя изоляция в основном используется для кластеров, принадлежащих ClusterSet, также возможно изолировать автономные кластеры с помощью <Cluster>.fenceAllTraffic().

  1. Для изоляции первичного кластера от записи используйте команду Cluster.fenceWrites следующим образом:

            <Cluster>.fenceWrites()
        

    После выполнения команды:

    • Автоматическое управление super_read_only отключено в кластере.

    • super_read_only включено на всех экземплярах кластера.

    • Все приложения заблокированы от выполнения записей в кластере.

    cluster.fenceWrites()
        The Cluster 'primary' will be fenced from write traffic
    
    	  * Disabling automatic super_read_only management on the Cluster...
    	  * Enabling super_read_only on '127.0.0.1:3311'...
    	  * Enabling super_read_only on '127.0.0.1:3312'...
    	  * Enabling super_read_only on '127.0.0.1:3313'...
    
    	  NOTE: Applications will now be blocked from performing writes on Cluster 'primary'.
        Use <Cluster>.unfenceWrites() to resume writes if you are certain a split-brain is not in effect.
    
    	  Cluster successfully fenced from write traffic
  2. Чтобы проверить, что первичный кластер изолирован от записи, используйте команду <Cluster>.status следующим образом:

          <Cluster>.clusterset.status()
        

    Вывод:

    clusterset.status()
            {
            "clusters": {
            "primary": {
            "clusterErrors": [
            "WARNING: Cluster is fenced from Write traffic.
             Use cluster.unfenceWrites() to unfence the Cluster."
            ],
            "clusterRole": "PRIMARY",
            "globalStatus": "OK_FENCED_WRITES",
            "primary": null,
            "status": "FENCED_WRITES",
            "statusText": "Cluster is fenced from Write Traffic."
            },
            "replica": {
            "clusterRole": "REPLICA",
            "clusterSetReplicationStatus": "OK",
            "globalStatus": "OK"
            }
            },
            "domainName": "primary",
            "globalPrimaryInstance": null,
            "primaryCluster": "primary",
            "status": "UNAVAILABLE",
            "statusText": "Primary Cluster is fenced from write traffic."
  3. Для отмены изоляции кластера и возобновления записи в первичный кластер используйте команду Cluster.fenceWrites следующим образом:

            <Cluster>.unfenceWrites()
          

    Автоматическое управление super_read_only в первичном кластере включено, и статус super_read_only на первичном экземпляре кластера.

            cluster.unfenceWrites()
            The Cluster 'primary' will be unfenced from write traffic
    
            * Enabling automatic super_read_only management on the Cluster...
            * Disabling super_read_only on the primary '127.0.0.1:3311'...
    
            Cluster successfully unfenced from write traffic
        
  4. Для изоляции кластера от всех операций используйте команду Cluster.fenceAllTraffic следующим образом:

          <Cluster>.fenceAllTraffic()
        

    Статус super_read_only включен на первичном экземпляре кластера. Перед включением offline_mode на всех экземплярах в кластере:

          cluster.fenceAllTraffic()
            The Cluster 'primary' will be fenced from all traffic
    
            * Enabling super_read_only on the primary '127.0.0.1:3311'...
            * Enabling offline_mode on the primary '127.0.0.1:3311'...
            * Enabling offline_mode on '127.0.0.1:3312'...
            * Stopping Group Replication on '127.0.0.1:3312'...
            * Enabling offline_mode on '127.0.0.1:3313'...
            * Stopping Group Replication on '127.0.0.1:3313'...
            * Stopping Group Replication on the primary '127.0.0.1:3311'...
    
            Cluster successfully fenced from all traffic
        
  5. Чтобы снять изоляцию кластера от всех операций, используйте команду dba.rebootClusterFromCompleteOutage() MySQL Shell. После восстановления кластера подключайте экземпляры к кластеру, выбрав Y при запросе на подключение экземпляра к кластеру:

    cluster = dba.rebootClusterFromCompleteOutage()
    		Restoring the cluster 'primary' from complete outage...
    
    		The instance '127.0.0.1:3312' was part of the cluster configuration.
    		Would you like to rejoin it to the cluster? [y/N]: Y
    
    		The instance '127.0.0.1:3313' was part of the cluster configuration.
    		Would you like to rejoin it to the cluster? [y/N]: Y
    
    		* Waiting for seed instance to become ONLINE...
    		127.0.0.1:3311 was restored.
    		Rejoining '127.0.0.1:3312' to the cluster.
    		Rejoining instance '127.0.0.1:3312' to cluster 'primary'...
    
    		The instance '127.0.0.1:3312' was successfully rejoined to the cluster.
    
    		Rejoining '127.0.0.1:3313' to the cluster.
    		Rejoining instance '127.0.0.1:3313' to cluster 'primary'...
    
    		The instance '127.0.0.1:3313' was successfully rejoined to the cluster.
    
    		The cluster was successfully rebooted.
    
    		<Cluster:primary>

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

Spec-Zone.ru

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