MySQL Shell 8.4  /  ...  /  修复 InnoDB ClusterSet 中的成员服务器和集群

8.9.3 修复 InnoDB ClusterSet 中的成员服务器和集群

根据集群的问题或维护需求,您可以使用以下操作来处理集群的成员服务器。除非另有说明,请使用 ClusterClusterSet 对象(使用 InnoDB 集群管理员帐户或服务器配置帐户获取),以便 ClusterSet 对象中存储的默认用户帐户拥有正确的权限。

  • 使用 cluster.addInstance() 命令将更多服务器实例添加到集群中,如 第 8.4 节,“部署 InnoDB ClusterSet” 中的步骤所述。有关该命令的更多详细信息,请参见 第 7.4.4 节,“将实例添加到 InnoDB 集群”

    请注意,对于此操作,您需要使用 InnoDB 集群服务器配置帐户和使用该帐户获取的 Cluster 对象。该帐户还必须存在于服务器实例上,如 第 8.3 节,“InnoDB ClusterSet 用户帐户” 中所述。

    当您使用此命令将成员服务器添加到作为 InnoDB ClusterSet 部署的一部分的 InnoDB 集群时,服务器实例将添加到集群并配置 InnoDB ClusterSet 的数据。ClusterSet 复制通道将在实例上设置,并且将应用在 InnoDB ClusterSet 部署中运行所需的配置。

  • 使用 cluster.rejoinInstance() 命令重新加入先前是集群的一部分但无法自动重新加入集群的服务器实例。有关此操作的详细信息,请参见 第 7.8.1 节,“将实例重新加入集群”

    当您使用此命令将成员服务器重新加入作为 InnoDB ClusterSet 部署的一部分的 InnoDB 集群时,服务器实例将重新加入集群并配置 InnoDB ClusterSet 的数据。ClusterSet 复制通道将在实例上设置,并且将应用在 InnoDB ClusterSet 部署中运行所需的配置。

  • 使用 cluster.removeInstance() 命令从集群中移除服务器实例。指定要移除的服务器实例的主机名和端口号。有关此操作的详细信息,请参见 从 InnoDB 集群中移除实例。可以使用 force 选项,但这应作为最后的手段使用。

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会重置为 InnoDB ClusterSet 应用的所有配置,并重置 ClusterSet 复制通道设置。

  • 使用 cluster.setPrimaryInstance(instance) 命令将集群的主服务器更改为另一个成员服务器。更改主服务器允许您对当前主服务器进行维护和升级,或者在组复制的选举过程无法自动选择您想要的主服务器时选择主服务器。

    指定要作为主服务器的服务器实例的主机名和端口号。您可以使用 runningTransactionsTimeout 选项来指定使用该函数时运行的事务的超时时间(介于 0 到 3600 秒之间),该函数还会停止新的传入事务。该超时时间没有默认设置,因此如果您没有设置它,操作的等待时间没有上限,并且新事务可以在此期间启动。

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会预先停止服务器上的 ClusterSet 复制通道,并在之后重新启动它。此外,如果集群是副本集群,MySQL Shell 会将主服务器保持为只读状态,而不是像 InnoDB 集群的主服务器那样将其变为读写状态。

  • 使用 cluster.forceQuorumUsingPartitionOf(instance) 命令通过强制剩余实例的仲裁来恢复已丢失仲裁的集群。指定具有正确元数据的在线服务器实例的主机名和端口号。该操作会使集群由该实例和其他可达的实例组成,并排除已分区实例。此操作可能会创建脑裂场景,因此应将其视为最后的手段。有关此操作的详细信息,请参见 第 7.8.2 节,“从仲裁丢失中恢复集群”

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会检查目标集群是否仍然是 ClusterSet 的有效部分,并在集群被无效时发出警告。它还会在之后自动重新启动 ClusterSet 复制通道。如果集群是副本集群,MySQL Shell 会将主服务器保持为只读状态,而不是像 InnoDB 集群的主服务器那样将其变为读写状态。

  • 使用 dba.rebootClusterFromCompleteOutage() 命令重新启动完全脱机的集群。有关此操作的详细信息,请参见 第 7.8.3 节,“从重大故障中重新启动集群”

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会检查目标集群是否仍然是 ClusterSet 的有效部分,并在集群被无效时发出警告。

    如果集群未被无效,MySQL Shell 会在重新启动后立即将其重新加入 InnoDB ClusterSet 部署。如果集群被无效,您必须使用 clusterSet.rejoinCluster() 操作将其重新加入 InnoDB ClusterSet 部署。有关执行此操作的说明,请参见 第 8.9.5 节,“将集群重新加入 InnoDB ClusterSet”

    MySQL Shell 还会在此操作后自动重新启动 ClusterSet 复制通道。如果集群是副本集群,MySQL Shell 会将主服务器保持为只读状态,而不是像 InnoDB 集群的主服务器那样将其变为读写状态。

您无法解散当前是 InnoDB ClusterSet 部署一部分的 InnoDB 集群,除非它是 ClusterSet 中唯一的集群或集群被无效。在所有其他配置中,您必须按照 第 8.9.4 节,“从 InnoDB ClusterSet 中移除集群” 中所述将其从 InnoDB ClusterSet 中移除。

如果集群是 ClusterSet 中唯一的集群或集群被无效,您可以对集群使用 dba.dropMetadataSchema()cluster.dissolve()