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

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 或如果 auto 选择克隆作为数据供应的最佳方法,则通过 clone 选择了最佳方法,则集群将选择最佳实例进行克隆。使用的过程与 Cluster.addInstance() 使用的过程相同。有关详细信息,请参见 第 7.4.6.1 节,“使用 MySQL Clone 的集群”

在以下示例中,使用从实例 host2:4101 作为数据源,添加了新的只读副本 host5:4113,标签为 RReplica5host2: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'.

基于证书的身份验证

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

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

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

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

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

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