如果 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 [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>
-
使用 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()