如果一个(或多个)实例发生故障,则集群可能会失去其法定人数,即在新主节点中投票的能力。当有足够多的实例发生故障,以至于组成集群的大多数实例不再对组复制操作进行投票时,就会发生这种情况。参见 容错. 当集群失去法定人数时,您将无法再处理集群的写入事务,或更改集群的拓扑结构,例如通过添加、重新加入或删除实例。但是,如果您有一个包含 InnoDB Cluster 元数据的在线实例,则可以恢复具有 quorum 的集群。这假设您可以连接到包含 InnoDB Cluster 元数据的实例,并且该实例可以联系您要用于恢复集群的其他实例。
此操作具有潜在危险,因为如果使用不当可能会造成裂脑情况,因此应将其视为最后的手段。绝对确保该组中没有仍在网络某处运行但无法从您所在位置访问的分区。
连接到包含集群元数据的实例,然后使用
基于 上的元数据恢复集群的操作,
然后将所有从给定实例定义的角度来看的实例添加到恢复的集群中。
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-1
、ic-2
和
ic-3
形成一个分区,而
ic-4
和ic-5
形成另一个分区。如果您连接到集群ic-1
并发出
恢复集群的命令,则生成的集群将包含以下三个实例:
Cluster
.forceQuorumUsingPartitionOf('icadmin@ic-1:3306')
ic-1
ic-2
ic-3
因为ic-1
看到ic-2
并且
ic-3
作为ONLINE
并且没有看到ic-4
并且ic-5
。