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

8.9.5 将集群重新加入到 InnoDB ClusterSet

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

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

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

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

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

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

  • 该集群的 GTID 集 (gtid_executed) 与 ClusterSet 的活动成员相比没有额外的交易,除了视图更改事件。这些 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. 使用 AdminAPI 的 clusterSet.status() 函数在 MySQL Shell 中检查整个部署的状态。例如

    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 实例将流量发送到新的主集群。