MySQL Shell 8.4  /  ...  /  将实例添加到 InnoDB 集群

7.4.4 将实例添加到 InnoDB 集群

您需要在 InnoDB 集群中至少拥有三个实例,使其能够容忍一个实例的故障。添加更多实例可以提高 InnoDB 集群的容错能力。

组复制实现了考虑实例版本和 Cluster.addInstance() 操作的兼容性策略,并在出现不兼容时检测到此情况,并以错误终止操作。请参阅检查实例上的 MySQL 版本在组中组合不同的成员版本

使用 Cluster.addInstance(instance) 函数将实例添加到集群,其中 instance 是到已配置实例的连接信息,请参阅第 7.4.2 节“为 InnoDB 集群使用配置生产实例”。例如

mysql-js> cluster.addInstance('icadmin@ic-2:3306')
A new instance will be added to the InnoDB cluster. Depending on the amount of
data on the cluster this might take from a few seconds to several hours.
Please provide the password for 'icadmin@ic-2:3306': ********
Adding instance to the cluster ...
Validating instance at ic-2:3306...
This instance reports its own address as ic-2
Instance configuration is suitable.
The instance 'icadmin@ic-2:3306' was successfully added to the cluster.

addInstance(instance[, options]) 函数的 options 字典提供以下属性

  • label:要添加的实例的标识符。

    标签不能为空,且长度不能超过 256 个字符。它在集群中必须是唯一的,并且只能包含字母数字、_(下划线)、.(句点)、-(连字符)或 :(冒号)字符。

  • recoveryMethod:首选的状态恢复方法。可以是 auto、clone 或 incremental。默认为 auto。

  • recoveryProgress:定义恢复进程详细级别的整数值。

    • 0:不显示任何进度信息。

    • 1:显示详细的静态进度信息。

    • 2:使用进度条显示详细的动态进度信息。

  • ipAllowlist:允许连接到实例以进行组复制的主机列表。

  • localAddress:字符串值,其中包含要使用的组复制本地地址,而不是自动生成的地址。

  • exitStateAction:字符串值,指示组复制退出状态操作。

  • memberWeight:整数值,表示故障转移时自动主选举的百分比权重。

  • autoRejoinTries:整数值,用于定义实例在被驱逐后尝试重新加入集群的次数。

将新实例添加到集群时,此实例的本地地址会自动添加到所有联机集群实例上 group_replication_group_seeds 变量中,以便允许它们在需要时使用新实例重新加入组。

注意

列在 group_replication_group_seeds 中的实例将按照它们在列表中出现的顺序使用。这确保首先使用并优先使用用户指定的设置。有关详细信息,请参阅第 7.5.2 节“自定义 InnoDB 集群成员服务器”

如果您使用的是 MySQL 8.0.17 或更高版本,则可以选择实例如何恢复与集群同步所需的事务。只有当加入的实例恢复了集群之前处理的所有事务后,它才能作为联机实例加入并开始处理事务。有关详细信息,请参阅第 7.4.6 节“将 MySQL Clone 与 InnoDB 集群配合使用”

您可以配置 Cluster.addInstance() 的行为方式,让恢复操作在后台进行或在 MySQL Shell 中监控不同级别的进度。

根据您选择从集群恢复实例的选项,您会在 MySQL Shell 中看到不同的输出。假设您要将实例 ic-2 添加到集群,并且 ic-1 是种子或捐赠者。

  • 当您使用 MySQL Clone 从集群恢复实例时,输出如下所示

    Validating instance at ic-2:3306...
    This instance reports its own address as ic-2:3306
    Instance configuration is suitable.
    A new instance will be added to the InnoDB cluster. Depending on the amount of
    data on the cluster this might take from a few seconds to several hours.
    Adding instance to the cluster...
    Monitoring recovery process of the new cluster member. Press ^C to stop monitoring 
    and let it continue in background.
    Clone based state recovery is now in progress.
    NOTE: A server restart is expected to happen as part of the clone process. If the
    server does not support the RESTART command or does not come back after a
    while, you may need to manually start it back.
    * Waiting for clone to finish...
    NOTE: ic-2:3306 is being cloned from ic-1:3306
    ** Stage DROP DATA: Completed
    ** Clone Transfer
    FILE COPY  ############################################################  100%  Completed
    PAGE COPY  ############################################################  100%  Completed
    REDO COPY  ############################################################  100%  Completed
    NOTE: ic-2:3306 is shutting down...
    * Waiting for server restart... ready
    * ic-2:3306 has restarted, waiting for clone to finish...
    ** Stage RESTART: Completed
    * Clone process has finished: 2.18 GB transferred in 7 sec (311.26 MB/s)
    State recovery already finished for 'ic-2:3306'
    The instance 'ic-2:3306' was successfully added to the cluster.

    应注意有关服务器重启的警告,您可能需要手动重启实例。请参阅RESTART 语句

  • 当您使用增量恢复从集群恢复实例时,输出如下所示

    Incremental distributed state recovery is now in progress.
    * Waiting for incremental recovery to finish...
    NOTE: 'ic-2:3306' is being recovered from 'ic-1:3306'
    * Distributed recovery has finished

要取消监控恢复阶段,请发出 CONTROL+C。这将停止监控,但恢复进程会在后台继续。可以使用 recoveryProgress 整数选项和 Cluster.addInstance() 操作来显示恢复阶段的进度。

要验证实例是否已添加,请使用集群实例的 status() 函数。例如,这是添加第二个实例后沙盒集群的状态输出

mysql-js> cluster.status()
{
    "clusterName": "testCluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "ic-1:3306",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "ic-1:3306": {
                "address": "ic-1:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            },
            "ic-2:3306": {
                "address": "ic-2:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            }
        }
    },
    "groupInformationSourceMember": "mysql://icadmin@ic-1:3306"
}

如何继续取决于实例是与运行 MySQL Shell 的实例位于本地还是远程,以及实例是否支持自动持久化配置更改,请参阅第 6.2.3 节“持久化设置”。如果实例支持自动持久化配置更改,则无需手动持久化设置,并且可以添加更多实例或继续下一步。如果实例不支持自动持久化配置更改,则必须在本地配置实例。这对于确保实例在离开集群的情况下重新加入集群至关重要。

提示

如果实例的 super_read_only=ON,则您可能需要确认 AdminAPI 可以设置 super_read_only=OFF。有关详细信息,请参阅超级只读模式下的实例配置

部署集群后,您可以配置 MySQL Router 以提供高可用性,请参阅第 6.10 节“将 MySQL Router 与 AdminAPI、InnoDB 集群和 InnoDB ReplicaSet 配合使用”