如果一个 InnoDB Cluster 是 InnoDB ClusterSet 部署的一部分,MySQL Shell 会在重启后立即自动将其恢复到拓扑中的角色,前提是它正常运行并且没有被标记为无效。但是,如果集群已被标记为无效或其 ClusterSet 复制通道已停止,则必须使用
操作将其重新加入到 InnoDB ClusterSet 部署。clusterSet
.rejoinCluster()
操作会验证目标集群是否满足以下要求:clusterSet
.rejoinCluster()
该集群以前是 ClusterSet 的成员。
该集群具有仲裁(有足够多的成员在线以形成多数)。
该集群的主服务器可达。
该集群未持有任何元数据锁或 InnoDB 事务锁。
与 ClusterSet 的活动成员相比,该集群的 GTID 集(
gtid_executed
)不包含任何额外的事务,视图更改事件除外。这些 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 [email protected]:3310 Creating a session to '[email protected]:3310' Please provide the password for '[email protected]:3310': ******** Save password for '[email protected]: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:[email protected]:3310> mysql-js> myclusterset = dba.getClusterSet() <ClusterSet:testclusterset>
-
使用 MySQL Shell 中的 AdminAPI 的
函数检查整个部署的状态。例如: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()