InnoDB 集群中至少需要三个实例才能使其能够容忍一个实例的故障。添加更多实例会提高 InnoDB 集群对故障的容忍度。
组复制实现了兼容性策略,该策略考虑了实例的版本和
操作会检测到这一点,如果发生不兼容,操作将终止并显示错误。请参阅 检查实例上的 MySQL 版本 和 在组中组合不同的成员版本。Cluster
.addInstance()
使用
函数将实例添加到集群中,其中 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 集群一起使用”。
您可以配置
的行为方式,允许恢复操作在后台进行,或者在 MySQL Shell 中监控不同级别的进度。Cluster
.addInstance()
根据您选择从集群中恢复实例的方式,您在 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 副本集一起使用”。