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

8.9.4 从 InnoDB ClusterSet 中移除集群

要从 InnoDB ClusterSet 中移除集群,请使用 clusterSet.removeCluster() 命令。如果完全无法联系到集群,则可以使用 force 选项。

clusterSet.removeCluster() 的语法如下

         clusterSet.removeCluster(clusterName[, options])

可以通过移除集群来将其从 ClusterSet 中移除,但保持集群完整,或者通过移除集群并将其解散为其成员实例来移除集群。这两种方法都会保留所有用户数据。

默认情况下,移除的集群会解散为其组件实例。这由 dissolve 选项配置,该选项默认值为 true

重要

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

已解散的 InnoDB 集群无法重新添加到 InnoDB ClusterSet 部署中。如果要再次使用部署中的服务器实例,可以使用这些实例设置新集群并将该集群添加到 ClusterSet 中。

移除并解散集群

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

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

  2. 使用 MySQL Shell 中 AdminAPI 的 clusterSet.status() 函数检查整个部署的状态。例如

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

    有关输出的解释,请参见 第 8.6 节,“InnoDB ClusterSet 状态和拓扑结构”

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

  3. 通过在 MySQL Shell 中连接到 InnoDB ClusterSet 部署中的任何成员服务器并发出 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 部署,则配置可能存在差异,尤其是在这种情况下。

移除集群并更新为独立状态

要从 ClusterSet 中移除集群并保持集群完整,作为独立集群,请将 dissolve 选项设置为 false

以下示例显示了名为 clustertwo 的集群从 ClusterSet 中完整移除

          myclusterset.removeCluster('clustertwo', {dissolve: false})

如果 {dissolve: false} 且未启用 force,则如果一个或多个成员无法联系,则该命令无法继续执行。

如果 {dissolve: false, force: true},则即使一个或多个集群成员无法联系,该命令也会继续执行。集群将从 ClusterSet 中完整移除,但无法联系的成员不会同步。但是,如果集群的主服务器无法联系,则该集群会解散为其组件实例。如果主服务器不可用,则无法保持集群完整。