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

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 集不得与集群的 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")