下载此手册
PDF (美国信纸) - 2.3Mb
PDF (A4) - 2.3Mb


MySQL Shell 9.0  /  ...  /  将实例添加到 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]) 函数的选项字典提供以下属性

  • 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 路由器以提供高可用性,请参阅 第 6.10 节,“将 MySQL 路由器与 AdminAPI、InnoDB 集群和 InnoDB 副本集一起使用”