本节介绍如何将 InnoDB 集群从单主模式更改为多主模式,或反过来,如何从 InnoDB 集群中删除服务器实例,以及如何解散不再需要的 InnoDB 集群。
默认情况下,InnoDB 集群在单主模式下运行,集群只有一个主服务器接受读写查询 (R/W),集群中所有其他实例只接受读查询 (R/O)。当您将集群配置为在多主模式下运行时,集群中的所有实例都是主实例,这意味着它们都接受读写查询 (R/W)。如果集群中的所有实例都运行 MySQL 服务器版本 8.0.15 或更高版本,您可以在集群在线时更改集群的拓扑结构。在之前的版本中,必须完全解散并重新创建集群才能进行配置更改。这使用了通过 配置在线组 中描述的功能公开的组操作协调器,因此您应该遵守配置在线组的规则。
多主模式被认为是高级模式。
通常,当当前主服务器意外离开集群时(例如,由于意外停止),单主集群会选举一个新的主服务器。选举过程通常用于选择当前哪个从服务器成为新的主服务器。要覆盖选举过程并强制基础 Group Replication 组中的特定服务器实例成为新的主服务器,请使用
函数,其中 Cluster
.setPrimaryInstance(instance
[, options
)instance
指定应成为新主服务器的实例的连接。您可以使用 runningTransactionsTimeout
选项在使用该函数时添加 0 到 3600 秒之间的超时,以便在发出命令后拒绝传入的事务。
您可以使用以下操作在单主和多主之间更改集群运行的模式(有时称为拓扑结构)
,将集群切换到多主模式。所有实例都成为主实例。Cluster
.switchToMultiPrimaryMode()
,将集群切换到单主模式。如果指定了Cluster
.switchToSinglePrimaryMode([instance
])instance
,它将成为主服务器,所有其他实例将成为从服务器。如果没有指定instance
,新的主服务器将是具有最高成员权重(以及最低 UUID,如果成员权重相同)的实例。
如果您愿意,可以随时从集群中删除实例。这可以使用
方法完成,如下例所示Cluster
.removeInstance(instance
)
mysql-js> cluster.removeInstance('root@localhost:3310')
The instance will be removed from the InnoDB cluster. Depending on the instance
being the Seed or not, the Metadata session might become invalid. If so, please
start a new session to the Metadata Storage R/W instance.
Attempting to leave from the Group Replication group...
The instance 'localhost:3310' was successfully removed from the cluster.
操作确保将实例从所有处于 cluster
.removeInstance()ONLINE
状态的集群成员以及实例本身的元数据中删除。处于 ONLINE
状态的 InnoDB 集群中最后剩下的实例无法使用此操作删除。
当要删除的实例有尚未应用的事务时,AdminAPI 会等待最多由 MySQL Shell dba.gtidWaitTimeout
选项配置的秒数来应用事务(GTID)。MySQL Shell dba.gtidWaitTimeout
选项的默认值为 60 秒,有关更改默认值的详细信息,请参阅 第 13.4 节,“配置 MySQL Shell 选项”。如果在等待应用事务时达到了由 dba.gtidWaitTimeout
定义的超时值,并且 force
选项为 false
(或未定义),则会发出错误,并且删除操作将中止。如果在等待应用事务时达到了由 dba.gtidWaitTimeout
定义的超时值,并且 force
选项设置为 true
,则操作将继续执行,不会出现错误,并将实例从集群中删除。
force
选项的
强制将实例从集群的元数据中删除。如果实例不再是成员,但仍注册为集群的一部分,这将很有用。此选项对正常且可联系的实例无效,仅影响不可联系的实例或无法与集群同步的实例。Cluster
.removeInstance(instance
)
要解散 InnoDB 集群,请连接到读写实例,例如单主集群中的主服务器,并使用
命令。这将删除与集群相关联的所有元数据和配置,并在实例上禁用 Group Replication。任何在实例之间复制的数据都不会被删除。Cluster
.dissolve()
无法撤消解散集群的操作。要重新创建它,请使用 dba.createCluster()
。
操作只能配置处于 Cluster
.dissolve()ONLINE
状态或可联系的实例。如果在您发出
命令的成员中无法联系到集群的成员,您需要决定解散操作如何进行。如果有可能将识别出的缺少集群实例重新加入集群,强烈建议取消解散操作,首先将缺少的实例恢复联机,然后再进行解散操作。这将确保所有实例都可以正确更新其元数据,并且不会出现脑裂情况。但是,如果无法联系的集群实例已经永久离开集群,则别无选择,只能强制进行解散操作,这意味着会忽略缺少的实例,并且只有联机实例会受到操作的影响。Cluster
.dissolve()
强制解散操作忽略集群实例会导致无法在解散操作期间联系到的实例继续运行,从而产生脑裂情况的风险。只有在确定实例不可能再次联机时才强制解散操作忽略缺少的实例。
在交互模式下,如果在解散操作期间无法联系到集群的成员,则会显示一个交互式提示,例如
mysql-js> Cluster.dissolve()
The cluster still has the following registered instances:
{
"clusterName": "testCluster",
"defaultReplicaSet": {
"name": "default",
"topology": [
{
"address": "ic-1:3306",
"label": "ic-1:3306",
"role": "HA"
},
{
"address": "ic-2:3306",
"label": "ic-2:3306",
"role": "HA"
},
{
"address": "ic-3:3306",
"label": "ic-3:3306",
"role": "HA"
}
]
}
}
WARNING: You are about to dissolve the whole cluster and lose the high
availability features provided by it. This operation cannot be reverted. All
members will be removed from the cluster and replication will be stopped,
internal recovery user accounts and the cluster metadata will be dropped. User
data will be maintained intact in all instances.
Are you sure you want to dissolve the cluster? [y/N]: y
ERROR: The instance 'ic-2:3306' cannot be removed because it is on a '(MISSING)'
state. Please bring the instance back ONLINE and try to dissolve the cluster
again. If the instance is permanently not reachable, then you can choose to
proceed with the operation and only remove the instance from the Cluster
Metadata.
Do you want to continue anyway (only the instance metadata will be removed)?
[y/N]: y
Instance 'ic-3:3306' is attempting to leave the cluster... Instance 'ic-1:3306'
is attempting to leave the cluster...
WARNING: The cluster was successfully dissolved, but the following instance was
skipped: 'ic-2:3306'. Please make sure this instance is permanently unavailable
or take any necessary manual action to ensure the cluster is fully dissolved.
在此示例中,集群由三个实例组成,其中一个实例在发出解散命令时处于离线状态。错误被捕获,并提供了如何继续执行的选项。在这种情况下,缺少的 ic-2
实例被忽略,可联系的成员更新了其元数据。
当 MySQL Shell 在非交互模式下运行时(例如,运行批处理文件时),可以使用 force
选项配置
操作的行为。要强制解散操作忽略任何不可联系的实例,请发出Cluster
.dissolve()
mysql-js> Cluster.dissolve({force: true})
任何可联系的实例都将从集群中删除,任何不可联系的实例都将被忽略。本节中有关强制从集群中删除缺少实例的警告同样适用于此强制解散操作的技术。
dba.gtidWaitTimeout
MySQL Shell 选项配置
操作在从集群中删除目标实例之前等待集群事务应用多长时间,但这仅适用于目标实例处于 Cluster
.dissolve()ONLINE
状态。如果在任何要删除的实例上等待集群事务应用时达到了超时值,则会发出错误,但如果使用了 force: true,则在这种情况下会跳过错误。
在发出 cluster.dissolve()
后,分配给
对象的任何变量将不再有效。Cluster