MySQL Shell 9.0  /  ...  /  从失去仲裁恢复集群

7.8.2 从失去仲裁恢复集群

如果一个或多个实例失败,则集群可能会失去仲裁,即无法投票选举新的主节点。当足够多的实例失败导致集群中不再有多数实例可以对 Group Replication 操作进行投票时,就会发生这种情况。请参见 容错。当集群失去仲裁时,您将无法再处理与集群的写事务,也无法更改集群的拓扑结构,例如添加、重新加入或删除实例。但是,如果您有一个包含 InnoDB 集群元数据的实例在线,则可以恢复具有仲裁的集群。这假设您能够连接到包含 InnoDB 集群元数据的实例,并且该实例可以联系您要用于恢复集群的其他实例。

重要

此操作可能很危险,因为如果使用不当,可能会导致脑裂情况,应将其视为最后手段。务必确保该组的任何分区都没有在网络中的任何地方继续运行,但无法从您的位置访问。

连接到包含集群元数据的实例,然后使用 Cluster.forceQuorumUsingPartitionOf(instance) 操作,该操作根据 instance 上的元数据恢复集群,然后将从给定实例定义的角度来看所有处于 ONLINE 状态的实例添加到恢复的集群中。

mysql-js> cluster.forceQuorumUsingPartitionOf("icadmin@ic-1:3306")

  Restoring replicaset 'default' from loss of quorum, by using the partition composed of [icadmin@ic-1:3306]

  Please provide the password for 'icadmin@ic-1:3306': ******
  Restoring the InnoDB cluster ...

  The InnoDB cluster was successfully restored using the partition from the instance 'icadmin@ic-1:3306'.

  WARNING: To avoid a split-brain scenario, ensure that all other members of the replicaset
  are removed or joined back to the group that was restored.

如果某个实例未自动添加到集群中,例如,如果其设置未持久化,请使用 Cluster.rejoinInstance() 手动将该实例添加回集群。

恢复的集群可能不包含构成该集群的所有原始实例,也不必包含所有原始实例。例如,如果原始集群包含以下五个实例

  • ic-1

  • ic-2

  • ic-3

  • ic-4

  • ic-5

并且集群出现脑裂情况,ic-1ic-2ic-3 形成一个分区,而 ic-4ic-5 形成另一个分区。如果您连接到 ic-1 并发出 Cluster.forceQuorumUsingPartitionOf('icadmin@ic-1:3306') 以恢复集群,则生成的集群将包含这三个实例

  • ic-1

  • ic-2

  • ic-3

因为 ic-1ic-2ic-3 视为 ONLINE,而没有看到 ic-4ic-5