要从 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 中移除集群并解散集群,请按照以下步骤操作
使用 MySQL Shell,使用 InnoDB 集群管理员帐户(使用
创建)连接到主集群或副本集群中的任何成员服务器。也可以使用 InnoDB 集群服务器配置帐户,该帐户也具有必需的权限。建立连接后,使用cluster.setupAdminAccount()dba.getClusterSet()或命令获取cluster.getClusterSet()ClusterSet对象。务必使用 InnoDB 集群管理员帐户或服务器配置帐户,以便存储在ClusterSet对象中的默认用户帐户具有正确的权限。-
使用 MySQL Shell 中 AdminAPI 的
函数检查整个部署的状态。例如clusterSet.status()mysql-js> myclusterset.status({extended: 1})有关输出的解释,请参见 第 8.6 节,“InnoDB ClusterSet 状态和拓扑结构”。
发出
命令时,InnoDB ClusterSet 部署中必须存在一个活动且可访问的主集群,并且此集群不能是您要移除的集群。您要移除的集群当前必须具有副本集群的状态。它可以被失效,并且不需要可访问。clusterSet.removeCluster() 通过在 MySQL Shell 中连接到 InnoDB ClusterSet 部署中的任何成员服务器并发出
命令,检查为每个 MySQL Router 实例设置的路由选项和 InnoDB ClusterSet 部署的全局策略。验证没有 MySQL Router 实例将流量路由到您要移除的集群。如果有,则必须使用clusterSet.routingOptions()命令更改其设置,将流量路由到另一个集群,如 第 8.5 节,“将 MySQL Router 集成到 InnoDB ClusterSet” 中所述。如果 InnoDB ClusterSet 部署已知的任何 MySQL Router 实例将流量路由到集群,则无法移除该集群。clusterSet.setRoutingOption()-
发出
命令,命名要从 InnoDB ClusterSet 中移除的集群。例如clusterSet.removeCluster()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 中移除集群,即使集群的主实例不可访问。
发出
命令时,MySQL Shell 会检查 InnoDB ClusterSet 部署中的主集群是否可访问,目标集群是否不是主集群,以及是否有任何 MySQL Router 实例将流量路由到目标集群。如果其中任何一个条件不满足,则会返回错误。如果满足,MySQL Shell 会执行以下任务,将目标集群从 InnoDB ClusterSet 中移除clusterSet.removeCluster()删除为目标集群上的 ClusterSet 复制通道创建的复制用户。
将目标集群的主服务器与 InnoDB ClusterSet 的主集群同步,并等待所有事务在本地应用。如果超时到期,但在完成之前,则操作失败。如果同步不起作用,请尝试使用
force选项再次尝试。停止 ClusterSet 复制通道,然后移除该通道并将配置重置为默认值。
从 InnoDB ClusterSet 元数据中移除目标集群的元数据和成员信息。
将所有成员服务器上的
super_read_only系统变量设置为已设置状态,以确保不会对它们执行任何更新。
使用
extended选项再次发出命令,以验证 InnoDB ClusterSet 部署的状态。clusterSet.status()-
已移除的 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 中完整移除,但无法联系的成员不会同步。但是,如果集群的主服务器无法联系,则该集群会解散为其组件实例。如果主服务器不可用,则无法保持集群完整。