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() на реплицированном кластере возвращает ошибку:
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().
-
Чтобы ограничить основной кластер от трафика записи, используйте команду 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 -
Чтобы проверить, что вы ограничили основной кластер от трафика записи, используйте команду
<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." -
Чтобы снять ограничение доступа к кластеру и возобновить трафик записи к главному кластеру, используйте команду 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 -
Чтобы ограничить доступ к кластеру для всего трафика, используйте команду 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 -
Чтобы снять ограничение доступа к кластеру для всего трафика, используйте команду
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.