MySQL Shell 8.4  /  ...  /  修改或删除只读副本

7.11.3 修改或删除只读副本

本节介绍如何修改或从集群中删除您的只读副本。

删除只读副本

要从集群中删除只读副本,请使用 Cluster.removeInstance()。此操作执行以下任务

  • 从集群中删除复制用户。

  • 从集群元数据中删除只读副本。

  • 停止复制通道,并且只读副本的配置重置为默认值。

注意

如果 Cluster.removeInstance() 在集群成员(也是只读副本的来源)上运行,则会触发故障转移过程,并且只读副本尝试连接到另一个来源。如果无法使用其他来源,则会停止复制通道。已删除的集群成员也将从只读副本的来源列表中删除。

以下示例从集群中删除只读副本 host4:4110

Cluster.removeInstance("host4:4110")
Removing Read-Replica 'ipaddress:4110' from the Cluster 'myCluster'.

* Waiting for the Read-Replica to synchronize with the Cluster...
** Transactions replicated  ############################################################  100%

* Stopping and deleting the Read-Replica managed replication channel...

Read-Replica 'ipaddress:4110' successfully removed from the Cluster 'myCluster'.

删除只读副本后,事务会与来源同步。您可以定义一个以秒为单位的超时值,用于事务复制过程。例如

Cluster.removeInstance("host4:4110", {timeout:30})

这在同步过程中定义了 30 秒的超时。如果同步过程未能在 30 秒内完成,则 removeInstance 操作将回滚,并且只读副本不会从集群中删除。

默认超时值为 0(零)或无超时。

您可以使用 dryRun 选项测试此操作。包含此选项,将其设置为 true 将运行命令但不进行任何更改。这使您可以测试您的更改。

将只读副本重新加入集群

要将只读副本重新加入集群,请使用 Cluster.rejoinInstance()

Cluster.rejoinInstance(instance [, options])

要将只读副本重新加入集群,该实例必须满足以下要求

  • 目标实例必须是集群的成员。

  • 目标实例必须满足只读副本的先决条件。请参见 第 7.11.1 节,“先决条件”

  • 目标实例的 GTID 集不得与集群的不同。如果 recoveryMethod: clone,则不适用。

注意

如果所有配置的只读副本来源都无法访问,或者不再是集群的一部分,则 rejoinInstance() 操作将失败。在这种情况下,您必须使用 Cluster.setInstanceOption() 更新只读副本的复制来源。

此过程与将集群成员重新加入集群相同,但有以下例外

  • recoveryMethodclone 和选项 cloneDonor 仅适用于只读副本。

  • timeout 选项仅适用于只读副本。

以下示例显示尝试使用默认恢复方法将只读副本 host4:4110 重新加入集群

Cluster.rejoinInstance('host4:4110')

将只读副本重新加入后,事务会与主服务器同步。您可以定义一个以秒为单位的超时值,用于事务复制过程。以下示例为事务同步过程设置 60 秒的超时

Cluster.rejoinInstance('host4:4110', {timeout: 60})

这在同步过程中定义了 60 秒的超时。如果同步过程未能在 60 秒内完成,则 rejoinInstance 操作将回滚,并且只读副本不会重新加入集群。

默认超时值为 0(零)或无超时。

您可以使用 dryRun 选项测试此操作。包含此选项,将其设置为 true 将运行命令但不进行任何更改。这使您可以测试您的更改。

注意

无法使用 rejoinInstance 将使用 removeInstance 从集群中删除的只读副本重新加入。 removeInstance 会将只读副本从集群中删除,并删除只读副本的元数据。

要重新加入此类实例,您必须使用 addReplicaInstance

路由只读副本

集群的默认路由策略是将所有只读流量定向到辅助成员。 Cluster.setRoutingOption() 使您能够使用 read_only_targets 选项将路由策略设置为以下值之一

  • all:所有只读副本和辅助集群成员用于只读流量。

  • read_replicas:仅只读副本用于只读流量。

  • secondaries:仅辅助集群成员用于只读流量。

以下示例将名为 machine1::router1 的路由器的只读路由策略设置为仅只读副本

Cluster.setRoutingOption("machine1::router1", "read_only_targets", "read_replicas")

要查看名为 machine1::router1 的路由器的当前路由策略,请运行以下命令

Cluster.routingOptions("machine1::router1")