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