MySQL Shell 8.4  /  ...  /  创建只读副本

7.11.2 创建只读副本

使用 addReplicaInstance() 创建只读副本

Cluster.addReplicaInstance(instance, [options])

示例

本节和后续章节中的示例假设一个由三个实例组成的简单集群,一个主实例和两个辅助实例。

  • host1:4100:主实例。

  • host2:4101:辅助实例。

  • host3:4102:辅助实例。

默认只读副本

本节介绍如何将只读副本添加到集群。默认情况下,只读副本从主实例复制。

以下示例将一个实例 host4:4110 添加到集群,标签为 RReplica1

Cluster.addReplicaInstance('host4:4110', {label: 'RReplica1'})
注意

标签在集群中必须唯一,并且只能包含字母数字、_(下划线)、.(句号)、-(连字符)或:(冒号)字符。

为只读副本定义复制源

addReplicaInstancereplicationSources 选项使您可以为只读副本指定一个或多个首选复制源。此选项接受以下值

  • primary:将集群主实例定义为复制源。如果发生故障转移,只读副本将等待,直到提升新的主实例,然后使用新的主实例作为源恢复复制。

  • secondary:将集群辅助实例之一定义为复制源。选择由组复制管理。源将始终是集群的辅助成员,除非它成为单成员集群。在这种情况下,只读副本使用唯一的其他成员作为源。

  • hostname:port:将特定的集群成员(主实例或辅助实例)定义为复制源。

  • 以逗号分隔的主机列表:将集群成员(主实例或辅助实例)的加权列表定义为潜在的复制源。列表中的第一个实例具有最高优先级;当只读副本的复制通道激活时,它是第一个尝试连接的实例。如果发生故障转移或连接尝试失败,则连接到列表中的其他成员。

以下示例将辅助实例 host2:4101 定义为源

Cluster.addReplicaInstance('host4:4110', {label: 'RReplica1', replicationSources: ['host2:4101']})

也可以通过使用 host:port 格式提供以逗号分隔的主机列表来指定多个复制源。该列表是加权的,第一个条目具有最大的权重。这使您可以定义源故障转移列表。如果第一个定义的源失败,只读副本将尝试使用第二个定义的源恢复复制,依此类推。

以下示例将辅助实例 host2:4101 定义为第一个源,将 host3:4102 定义为下一个源

Cluster.addReplicaInstance('host4:4110', {label: 'RReplica1', replicationSources: ['host2:4101','host3:4102']]})

您可以使用相同的选项来仅定义主实例或仅定义辅助实例作为源,而无需定义单个实例。例如

Cluster.addReplicaInstance('host4:4110', {label: 'RReplica1', replicationSources: 'secondary']})

将复制源仅定义为辅助实例。要将复制源仅定义为主实例,请使用 replicationSources: 'primary'

默认情况下,源列表由 MySQL 组复制管理,默认为主实例源。

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

注意

也可以使用 cluster.setInstanceOption() 方法设置只读副本的 replicationSourceslabel

如果目标是只读副本,则 cluster.setInstanceOption() 方法接受的唯一选项是 tags(仅限保留标签)、replicationSourceslabel

为只读副本定义恢复方法

recoveryMethod 定义如何在预配期间获取只读副本的数据。

  • clone:在分布式恢复开始之前,使用另一个集群成员的完整快照完全替换目标实例的状态。需要 MySQL 8.0.17 或更高版本。

    如果定义了 cloneDonor,则使用定义的实例作为源。

    如果 replicationSources 设置为 parimarysecondary,则集群主实例用作源。

    如果 replicationSources 包含一个或多个命名的集群成员,则列表中的第一个成员(如果可用)将用作源。如果第一个不可用,则使用第二个,依此类推。

  • incremental:使用分布式状态恢复来应用从另一个集群成员复制的缺少的事务。克隆被禁用。

  • auto:默认值。组复制根据目标服务器支持的内容和 group_replication_clone_threshold 值选择是否进行完整快照。如果无法安全地确定安全进行的方式,则会显示提示。如果交互被禁用,则操作将被取消。

除了 recoveryMethod: clone 选项之外,addReplicaInstance 还提供了一个 cloneDonor 选项,使您可以定义要克隆到新的只读副本的特定实例。如果未定义 cloneDonor,但 clone 是选定的恢复方法(通过显式指定 cloneauto 选择克隆作为数据预配的最佳方法),则集群将选择最佳实例进行克隆。使用的过程与 Cluster.addInstance() 使用的过程相同。有关更多信息,请参阅 第 7.4.6.1 节“使用使用 MySQL Clone 的集群”

在以下示例中,使用辅助实例 host2:4101 作为数据源,添加了标签为 RReplica5 的新只读副本 host5:4113host2:4101 的数据被克隆到新的只读副本。

JS> cluster.addReplicaInstance('host5:4113',{label: 'RReplica5', recoveryMethod: "clone", cloneDonor: "host2:4101"})

成功的命令将返回类似于以下内容的信息

Setting up 'host5:4113' as a Read Replica of Cluster 'myCluster'.

Validating instance configuration at host5:4113...

This instance reports its own address as host5:4113

Instance configuration is suitable.
* Checking transaction state of the instance...


Clone based recovery selected through the recoveryMethod option

* Waiting for the donor to synchronize with PRIMARY...
** Transactions replicated  ############################################################  100%


Monitoring Clone based state recovery of the new member. Press ^C to abort the operation.
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: host5:4113 is being cloned from host2:4101
** Stage DROP DATA: Completed
** Clone Transfer
    FILE COPY  ############################################################  100%  Completed
    PAGE COPY  ############################################################  100%  Completed
    REDO COPY  ============================================================    0%  In Progress

NOTE: host5:4113 is shutting down...

* Waiting for server restart... ready
* host5:4113 has restarted, waiting for clone to finish...
** Stage RESTART: Completed
* Clone process has finished: 8.64 GB transferred in 11 sec (785.30 MB/s)

* Configuring Read-Replica managed replication channel...
** Changing replication source of host5:4113 to host1:4100

* Waiting for Read-Replica 'host5:4113' to synchronize with Cluster...
** Transactions replicated  ############################################################  100%


'host5:4113' successfully added as a Read-Replica of Cluster 'myCluster'.

基于证书的身份验证

只读副本的基于证书的身份验证按以下方式定义

  • cluster.addReplicaInstance()certSubject 选项:指定实例的证书主题,如果集群的 memberAuthTypeCERT_SUBJECTCERT_SUBJECT_PASSWORD,则使用该选项。

  • 集群的 memberSslMode 值用于配置只读副本的复制通道的身份验证类型。

  • 该方法在更新拓扑之前,使用配置的 memberSslMode 执行连接性检查。

  • 如果集群的 memberAuthTypeCERT_SUBJECTCERT_SUBJECT_PASSWORD,则该方法将验证服务器的证书。

已更新 cluster.options() 以在 topology 数组中返回 certSubject