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