MySQL 外壳 8.0  / 第 7 章 MySQL InnoDB 集群  /  7.9 修改或解散 InnoDB 集群

7.9 修改或解散 InnoDB 集群

本节介绍如何将 InnoDB Cluster 从单主模式更改为多主模式或相反,如何从 InnoDB Cluster 中删除服务器实例,以及如何解散不再需要的 InnoDB Cluster。

更改集群的拓扑

默认情况下,InnoDB 集群以单主模式运行,其中集群有一个主服务器接受读写查询(R/W),集群中的所有其余实例只接受读取查询(R/O) . 当您将集群配置为以多主模式运行时,集群中的所有实例都是主实例,这意味着它们接受读取和写入查询 (R/W)。如果集群的所有实例都运行 MySQL 服务器版本 8.0.15 或更高版本,您可以在集群在线时更改集群的拓扑结构。在以前的版本中,必须完全解散并重新创建集群才能进行配置更改。 配置在线群组,因此您应该遵守配置在线群组的规则。

笔记

多主模式被认为是一种高级模式。

通常,当当前主集群意外离开集群时,例如由于意外停止,单主集群会选择一个新的主集群。选举过程通常用于选择当前的辅助节点中的哪一个成为新的主要节点。要覆盖选举过程并强制底层组复制组中的特定服务器实例成为新的主实例,请使用该 函数,其中 指定与应成为新主实例的实例的连接。从 MySQL Shell 8.0.29 开始,您可以使用 Cluster.setPrimaryInstance(instance[, options)instancerunningTransactionsTimeout为使用该函数时正在运行的事务添加 0 到 3600 秒之间的超时的选项。当您设置超时时,发出命令后传入的事务将被拒绝。

您可以使用以下操作更改集群在单主模式和多主模式之间运行的模式(有时称为拓扑):

  • Cluster.switchToMultiPrimaryMode(),它将集群切换到多主模式。所有实例都成为主要实例。

  • Cluster.switchToSinglePrimaryMode([instance]),它将集群切换到单主模式。如果 instance指定,它将成为主要实例,所有其他实例成为次要实例。如果instance未指定,则新的主实例是成员权重最高的实例(在成员权重相同的情况下,UUID 最低)。

从 InnoDB 集群中删除实例

如果您愿意,可以随时从集群中删除实例。这可以使用 方法完成,如以下示例所示: 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.

您可以选择传入interactive 选项来控制是否提示您确认从集群中删除实例。在交互模式下,系统会提示您继续删除(或不删除)实例以防无法访问。该 cluster.removeInstance() 操作确保从所有集群成员的元数据ONLINE和实例本身中删除该实例。ONLINE不能使用此操作删除 InnoDB Cluster 中保持状态的最后一个实例 。

当被删除的实例有仍然需要应用的事务时,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)UNREACHABLEforceONLINE

解散 InnoDB 集群

要解散 InnoDB 集群,您连接到一个读写实例,例如单主集群中的主实例,并使用 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.

在此示例中,集群由三个实例组成,其中一个在发出 dissolve 时处于脱机状态。错误被捕获,您可以选择如何继续。在这种情况下,丢失的ic-2实例将被忽略,可访问的成员将更新其元数据。

当 MySQL Shell 以非交互模式运行时,例如运行批处理文件时,您可以 Cluster.dissolve() 使用该force选项配置操作的行为。要强制溶解操作忽略任何无法访问的实例,请发出:

mysql-js> Cluster.dissolve({force: true})

任何可以到达的实例都会从集群中移除,任何无法到达的实例都会被忽略。本节中关于强制从集群中删除缺失实例的警告同样适用于这种强制溶解操作的技术。

您还可以使用interactive带有 Cluster.dissolve() 操作的选项来覆盖 MySQL Shell 运行的模式,例如在运行批处理脚本时显示交互式提示。例如:

mysql-js> Cluster.dissolve({interactive: true})

dba.gtidWaitTimeoutMySQL Shell 选项配置 操作 在Cluster.dissolve() 从集群中删除目标实例之前等待应用集群事务的时间,但前提是目标实例是ONLINE. 如果在等待将集群事务应用于要删除的任何实例时达到超时,则会发出错误,除非使用 force: true,在这种情况下会跳过错误。

笔记

发出后cluster.dissolve(),分配给该对象的任何变量 Cluster都不再有效。