【MySQL Shell】8.9.5 将集群重新加入到 InnoDB ClusterSet
如果 InnoDB 集群是 InnoDB ClusterSet 部署的一部分,MySQL Shell 会在重新启动后立即自动将其恢复到拓扑中的角色,前提是其运行正常且未被标记为无效。但是,如果集群被标记为无效或其 ClusterSet 复制通道已停止,则必须使用 clusterSet.rejoinCluster()
操作将其重新加入 InnoDB ClusterSet 部署。
clusterSet.rejoinCluster()
操作验证目标集群是否满足以下要求:
- 该集群以前是 ClusterSet 的成员。
- 集群具有法定人数(足够的成员联机以形成多数)。
- 可以访问集群的主服务器。
- 集群未持有任何元数据锁或 InnoDB 事务锁。
- 与 ClusterSet 的活动成员相比,集群的 GTID 集( gtid_executed) 不包含额外的事务,视图更改事件除外。这些组复制内部事务由 group_replication_view_change_uuid 系统变量指定的 UUID 标识,集群重新加入过程可以协调它们。
如果集群满足这些要求,该操作将重新启动 ClusterSet 复制通道并删除 INVALIDATED
状态。如果没有,则需要修复已识别的任何问题,然后重试该命令。
按照以下步骤将 InnoDB 集群重新加入 InnoDB ClusterSet:
-
使用 MySQL Shell, 使用 InnoDB Cluster 管理员帐户(使用
cluster.setupAdminAccount()
创建)连接到主集群或副本集群中的任何成员服务器。您也可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。建立连接后,使用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>
-
使用 MySQL Shell 中 AdminAPI 的
clusterSet.status()
函数检查整个部署的状态。例如:mysql-js> myclusterset.status({extended: 1})
有关输出的说明,请参阅 8.6 InnoDB ClusterSet 的状态和拓扑 。
-
发出
clusterSet.rejoinCluster()
命令,命名要重新加入 InnoDB ClusterSet 的集群。例如: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:3310Cluster 'clustertwo' was rejoined to the clusterset
对于
clusterSet.rejoinCluster()
命令:clusterName
参数是必需的,它指定了 InnoDB ClusterSet 中用于集群的标识符,如clusterSet.status()
命令输出中所示。在本例中,clustertwo 是要重新加入的集群的名称。- 如果要执行验证并记录更改而不实际执行,请使用
dryRun
选项。
当您执行
clusterSet.rejoinCluster()
命令时,MySQLShell 会检查目标集群是否满足重新加入 ClusterSet 的要求,如果不满足,则返回错误。如果目标集群满足要求,MySQL Shell 将执行以下任务:- 检查 ClusterSet 复制通道是否正在从当前主集群复制,如果尚未复制,则重新配置该通道。
- 重新启动 ClusterSet 复制通道。
- 清除集群的
INVALIDATED
状态。
目标集群作为副本集群重新加入 InnoDB ClusterSet, 即使它以前是主集群。如果要将目标集群转换为主集群,则需要进行受控切换。
请注意,如果在执行
clusterSet.rejoinCluster()
命令时目标集群的成员不在线或不可访问,则该命令无法正确配置这些成员。如果不再需要这些实例,可以使用cluster.removeInstance()
命令删除它们。如果修复这些实例或使其再次联机,请在这些成员返回到集群后再次执行clusterSet.rejoinCluster()
命令。 -
使用
extended
选项再次执行clusterSet.status()
命令,以验证 InnoDB clusterSet 部署的状态。 -
如果您确实希望将重新加入的集群变成主集群,请执行
clusterSet.setPrimaryCluster()
命令,指定其为重新加入的集群。8.7 InnoDB ClusterSet 的受控切换 提供了该过程的说明,包括如何引导 MySQL Router 实例将流量发送到新的主集群。