Documentation Home
MySQL 外壳 8.0  / 第 8 章 MySQL InnoDB ClusterSet  / 8.9 InnoDB ClusterSet修复和重新加入  /  8.9.5 将集群重新加入到 InnoDB ClusterSet

8.9.5 将集群重新加入到 InnoDB ClusterSet

如果 InnoDB Cluster 是 InnoDB ClusterSet 部署的一部分,MySQL Shell 会在重启后立即自动将其恢复到其在拓扑中的角色,前提是它运行正常并且没有被标记为无效。但是,如果集群已被标记为无效或其 ClusterSet 复制通道已停止,则必须使用 clusterSet.rejoinCluster() 操作将其重新加入 InnoDB ClusterSet 部署。

clusterSet.rejoinCluster() 操作验证目标集群是否满足以下要求:

  • 该集群以前是 ClusterSet 的成员。

  • 集群有法定人数(足够多的成员在线以形成多数)。

  • 集群的主服务器可访问。

  • 集群不持有任何元数据锁或 InnoDB 事务锁。

  • gtid_executed与 ClusterSet 的活动成员相比, 集群的 GTID 集 ( ) 不包含额外的事务,但视图更改事件除外。这些 Group Replication 内部事务由 group_replication_view_change_uuid 系统变量指定的 UUID 标识,集群重新加入过程可以协调它们。

如果集群满足这些要求,该操作将重新启动 ClusterSet 复制通道并删除 INVALIDATED状态。如果没有,您将需要修复已识别的任何问题并重试该命令。

按照此过程将 InnoDB Cluster 重新加入 InnoDB ClusterSet:

  1. 使用 MySQL Shell,使用 InnoDB Cluster 管理员帐户(使用创建 cluster.setupAdminAccount())连接到主集群或其中一个副本集群中的任何成员服务器。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。建立连接后, 使用或 命令获取ClusterSet对象 。使用 InnoDB Cluster 管理员帐户或服务器配置帐户很重要,这样存储在 对象中的默认用户帐户具有正确的权限。例如: dba.getClusterSet()cluster.getClusterSet()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>
  2. clusterSet.status() 使用MySQL Shell 中 的 AdminAPI 函数检查整个部署的状态 。例如:

    mysql-js> myclusterset.status({extended: 1})

    有关输出的解释,请参阅 第 8.6 节,“InnoDB ClusterSet 状态和拓扑”

  3. 发出 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集群的状态。

    The target cluster rejoins the InnoDB ClusterSet as a replica cluster, even if it was previously a primary cluster. A controlled switchover is required if you want to make the target cluster into the primary cluster.

    Note that if the target cluster has members that are not online or not reachable when you issue the clusterSet.rejoinCluster() command, these members are not correctly configured by the command. If you no longer require these instances, you can remove them using the cluster.removeInstance() command. If you repair these instances or bring them online again, issue the clusterSet.rejoinCluster() command again after those members return to the cluster.

  4. 使用该选项再次发出 clusterSet.status() 命令extended,以验证 InnoDB ClusterSet 部署的状态。

  5. 如果您确实想让重新加入的集群成为主集群,请发出 clusterSet.setPrimaryCluster() 命令,命名重新加入的集群。 第 8.7 节,“InnoDB ClusterSet 控制切换”有该过程的说明,包括如何指示 MySQL Router 实例将流量发送到新的主集群。