Spec-Zone.ru › MySQL Shell 9.2

9.10.1 Ограничение доступа к кластерам в InnoDB ClusterSet

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

Если произойдет разрыв сети, может возникнуть ситуация разделения мозга, когда экземпляры теряют синхронизацию и не могут корректно общаться для определения состояния синхронизации. Разделение мозга может произойти, например, когда 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() см. в разделе 8.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)

Хотя вы в основном используете ограничение доступа к кластерам, принадлежащим к кластеру, также возможно ограничить доступ к автономным кластерам с помощью <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-9.2-en/innodb-cluster-fencing.html

Spec-Zone.ru

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