MySQL Shell 9.0  /  ...  /  将集群重新加入 InnoDB ClusterSet

8.9.5 将集群重新加入 InnoDB ClusterSet

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

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

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

  • 该集群具有仲裁(有足够多的成员在线以形成多数)。

  • 该集群的主服务器可达。

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

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

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

请按照以下步骤将 InnoDB Cluster 重新加入到 InnoDB ClusterSet:

  1. 使用 MySQL Shell,使用 InnoDB Cluster 管理员帐户(使用 cluster.setupAdminAccount() 创建)连接到主集群或其中一个副本集群中的任何成员服务器。您也可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。连接建立后,使用 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>
  2. 使用 MySQL Shell 中的 AdminAPI 的 clusterSet.status() 函数检查整个部署的状态。例如:

    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. 再次使用 extended 选项发出 clusterSet.status() 命令,以验证 InnoDB ClusterSet 部署的状态。

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