MySQL Shell 8.4  /  ...  /  从 InnoDB ClusterSet 中移除集群

8.9.4 从 InnoDB ClusterSet 中移除集群

如果无法修复集群,可以使用 clusterSet.removeCluster() 命令将其从 InnoDB ClusterSet 中移除。如果无法联系到集群,可以使用 force 选项。

重要

无法使用此命令移除 InnoDB ClusterSet 中的主集群。如果确实需要移除主集群,则必须先执行受控切换(请参阅第 8.7 节“InnoDB ClusterSet 受控切换”)或紧急故障转移(请参阅第 8.8 节“InnoDB ClusterSet 紧急故障转移”),将主集群降级为副本集群,并将其中一个副本集群提升为主集群。之后,可以使用此过程移除以前的主集群。

移除的 InnoDB 集群无法添加回 InnoDB ClusterSet 部署。如果要再次使用部署中的服务器实例,则需要使用它们设置新的集群。

要从 InnoDB ClusterSet 中移除集群,请按照以下步骤操作

  1. 使用 MySQL Shell,使用 InnoDB 集群管理员帐户(使用 cluster.setupAdminAccount() 创建)连接到主集群或其中一个副本集群中的任何成员服务器。您也可以使用 InnoDB 集群服务器配置帐户,该帐户也具有所需的权限。建立连接后,使用 dba.getClusterSet()cluster.getClusterSet() 命令获取 ClusterSet 对象。务必使用 InnoDB 集群管理员帐户或服务器配置帐户,以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。例如

    mysql-js> \connect [email protected]:4410
    Creating a session to '[email protected]:4410'
    Please provide the password for '[email protected]:4410': ********
    Save password for '[email protected]:4410'? [Y]es/[N]o/Ne[v]er (default No):
    Fetching schema names for autocompletion... Press ^C to stop.
    Closing old connection...
    Your MySQL connection id is 33
    Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial
    No default schema selected; type \use <schema> to set one.
    <ClassicSession:[email protected]:4410>
    mysql-js> myclusterset = dba.getClusterSet()
    <ClusterSet:testclusterset>
  2. 使用 MySQL Shell 中的 AdminAPI 的 clusterSet.status() 函数检查整个部署的状态。例如

    mysql-js> myclusterset.status({extended: 1})

    有关输出的说明,请参阅第 8.6 节“InnoDB ClusterSet 状态和拓扑”

    发出 clusterSet.removeCluster() 命令时,InnoDB ClusterSet 部署中必须有一个活动且可访问的主集群,并且这不能是要移除的集群。要移除的集群当前必须具有副本集群的状态。它可以是无效的,并且不必是可访问的。

  3. 通过连接到 InnoDB ClusterSet 部署中的任何成员服务器并在 MySQL Shell 中发出 clusterSet.routingOptions(),检查为每个 MySQL Router 实例设置的路由选项以及 InnoDB ClusterSet 部署的全局策略。验证没有 MySQL Router 实例将流量路由到要移除的集群。如果有,则必须使用 clusterSet.setRoutingOption() 命令更改其设置以将流量路由到另一个集群,如第 8.5 节“将 MySQL Router 与 InnoDB ClusterSet 集成”中所述。如果 InnoDB ClusterSet 部署已知的任何 MySQL Router 实例正在向集群路由流量,则无法移除该集群。

  4. 发出 clusterSet.removeCluster() 命令,命名要从 InnoDB ClusterSet 中移除的集群。例如

    mysql-js> myclusterset.removeCluster('clusterone')
    The Cluster 'clusterone' will be removed from the InnoDB ClusterSet.
    
    * Waiting for the Cluster to synchronize with the PRIMARY Cluster...
    ** Transactions replicated  ############################################################  100% 
    * Updating topology
    ** Transactions replicated  ############################################################  100% 
    * Stopping and deleting ClusterSet managed replication channel...
    
    The Cluster 'clusterone' was removed from the ClusterSet.
    • clusterName 参数是必需的,它指定在 InnoDB ClusterSet 中用于集群的标识符,如 clusterSet.status() 命令的输出中所示。在本例中,clusterone是要移除的集群。

    • 如果要执行验证并记录更改而不实际执行它们,请使用 dryRun 选项。

    • 使用 timeout 选项指定等待集群与 InnoDB ClusterSet 中的主集群同步的最长时间(以秒为单位)。

    • 当集群的主实例不可访问时,使用 force 选项从 ClusterSet 中移除集群。

    发出 clusterSet.removeCluster() 命令时,MySQL Shell 会检查 InnoDB ClusterSet 部署中的主集群是否可访问、目标集群是否不是主集群,以及是否有 MySQL Router 实例正在向目标集群路由流量。如果其中任何一个条件不满足,则返回错误。如果满足这些条件,MySQL Shell 将执行以下任务以从 InnoDB ClusterSet 中移除目标集群

    • 删除在目标集群上为 ClusterSet 复制通道创建的复制用户。

    • 将目标集群的主服务器与 InnoDB ClusterSet 的主集群同步,并等待所有事务在本地应用。如果在完成此操作之前超时到期,则操作失败。如果同步不起作用,请尝试使用 force 选项重试。

    • 停止 ClusterSet 复制通道,然后移除该通道并将其配置重置为默认值。

    • 从 InnoDB ClusterSet 元数据中移除目标集群的元数据和成员信息。

    • 将所有成员服务器上的 super_read_only 系统变量设置为确保不在其上执行任何更新。

  5. 使用 extended 选项再次发出 clusterSet.status() 命令,以验证 InnoDB ClusterSet 部署的状态。

  6. 移除的 InnoDB 集群无法添加回 InnoDB ClusterSet 部署,因此如果要再次使用部署中的服务器实例,则需要使用独立实例设置新的集群。InnoDB 集群在移除过程中隐式解散,以便所有成员都成为独立实例。

    请注意,不会从服务器实例中移除组复制配置,因此在 InnoDB ClusterSet 部署中重用这些实例时应谨慎操作,如第 8.1 节“InnoDB ClusterSet 要求”中所述。由于这些实例是为 InnoDB ClusterSet 部署配置的,因此出现问题的可能性较低,但您应该注意潜在的配置差异,尤其是在不同的 InnoDB ClusterSet 部署中重用这些实例时。