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集群的状态。

    目标集群作为副本集群重新加入 InnoDB ClusterSet,即使它以前是主集群。如果要使目标集群成为主集群,则需要进行受控切换。

    请注意,如果在您发出命令时目标集群有不在线或不可访问的 clusterSet.rejoinCluster() 成员,则这些成员未被命令正确配置。如果您不再需要这些实例,可以使用 cluster.removeInstance() 命令将其删除。clusterSet.rejoinCluster() 如果您修复这些实例或使它们再次联机,请在这些成员返回集群后 再次发出 命令。

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

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