您需要在 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])
函数的 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 Router 以提供高可用性,请参阅第 6.10 节“将 MySQL Router 与 AdminAPI、InnoDB 集群和 InnoDB ReplicaSet 配合使用”。