如果 InnoDB Cluster 是 InnoDB ClusterSet 部署的一部分,则 MySQL Shell 会在重新启动后立即将其恢复到拓扑结构中的角色,前提是它正常运行且未被标记为无效。但是,如果一个集群被标记为无效或其 ClusterSet 复制通道已停止,则您必须使用 操作将其重新加入到 InnoDB ClusterSet 部署中。clusterSet.rejoinCluster()
操作将验证目标集群是否满足以下要求clusterSet.rejoinCluster()
该集群以前是 ClusterSet 的成员。
该集群具有仲裁(在线的成员数量足以构成多数)。
该集群的主服务器可访问。
该集群未持有任何元数据锁或 InnoDB 事务锁。
该集群的 GTID 集 (
gtid_executed) 与 ClusterSet 的活动成员相比没有额外的交易,除了视图更改事件。这些 Group Replication 内部事务由group_replication_view_change_uuid系统变量指定的 UUID 识别,并且集群重新加入过程可以协调它们。
如果集群满足这些要求,则该操作将重新启动 ClusterSet 复制通道并删除 INVALIDATED 状态。如果它不满足要求,您将需要修复已识别出的任何问题并重试该命令。
按照以下步骤将 InnoDB Cluster 重新加入到 InnoDB ClusterSet
-
使用 MySQL Shell,使用 InnoDB Cluster 管理员帐户(使用
创建)连接到主集群或任何副本集群中的任何成员服务器。您也可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有必需的权限。建立连接后,使用cluster.setupAdminAccount()dba.getClusterSet()或命令获取cluster.getClusterSet()ClusterSet对象。重要的是使用 InnoDB Cluster 管理员帐户或服务器配置帐户,以便存储在ClusterSet对象中的默认用户帐户具有正确的权限。例如mysql-js> \connect admin2@127.0.0.1:3310 Creating a session to 'admin2@127.0.0.1:3310' Please provide the password for 'admin2@127.0.0.1:3310': ******** Save password for 'admin2@127.0.0.1:3310'? [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 28 Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial No default schema selected; type \use <schema> to set one. <ClassicSession:admin2@127.0.0.1:3310> mysql-js> myclusterset = dba.getClusterSet() <ClusterSet:testclusterset> -
使用 AdminAPI 的
函数在 MySQL Shell 中检查整个部署的状态。例如clusterSet.status()mysql-js> myclusterset.status({extended: 1})有关输出的解释,请参见 第 8.6 节“InnoDB ClusterSet 状态和拓扑”。
-
发出
命令,命名要重新加入到 InnoDB ClusterSet 的集群。例如clusterSet.rejoinCluster()mysql-js> myclusterset.rejoinCluster('clustertwo') Rejoining cluster 'clustertwo' to the clusterset NOTE: Cluster 'clustertwo' is invalidated * Updating metadata * Rejoining cluster ** Changing replication source of 127.0.0.1:4420 to 127.0.0.1:3310 ** Changing replication source of 127.0.0.1:4430 to 127.0.0.1:3310 ** Changing replication source of 127.0.0.1:4410 to 127.0.0.1:3310 Cluster 'clustertwo' was rejoined to the clusterset对于
命令clusterSet.rejoinCluster()clusterName参数是必需的,它指定集群在 InnoDB ClusterSet 中使用的标识符,如命令的输出中所示。在示例中,clusterSet.status()是正在重新加入的集群的名称。clustertwo如果您希望执行验证并记录更改而不实际执行它们,请使用
dryRun选项。
当您发出
命令时,MySQL Shell 会检查目标集群是否满足重新加入 ClusterSet 的要求,如果它不满足,则返回错误。如果目标集群满足要求,MySQL Shell 将执行以下任务clusterSet.rejoinCluster()检查 ClusterSet 复制通道是否从当前主集群进行复制,如果尚未进行复制,则重新配置它以进行复制。
重新启动 ClusterSet 复制通道。
清除集群的
INVALIDATED状态。
目标集群将重新加入 InnoDB ClusterSet 作为副本集群,即使它以前是主集群。如果您想将目标集群变为主集群,则需要进行受控切换。
请注意,如果目标集群在您发出
命令时有成员未在线或无法访问,则这些成员不会被该命令正确配置。如果您不再需要这些实例,可以使用clusterSet.rejoinCluster()命令将其移除。如果您修复了这些实例或将其重新上线,请在这些成员返回到集群后再次发出cluster.removeInstance()命令。clusterSet.rejoinCluster() 使用
extended选项再次发出命令,以验证 InnoDB ClusterSet 部署的状态。clusterSet.status()如果您确实想将重新加入的集群变为主集群,请发出
命令,命名重新加入的集群。第 8.7 节“InnoDB ClusterSet 受控切换” 包含该过程的说明,包括如何指导 MySQL Router 实例将流量发送到新的主集群。clusterSet.setPrimaryCluster()