使用只读副本 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用只读副本

Amazon RDS 使用 MariaDB、Microsoft SQL Server、MySQL、Oracle 和 PostgreSQL 数据库引擎的内置复制功能来从源数据库实例创建一个特殊类型的数据库实例,称为只读副本。源数据库实例将成为主数据库实例。对主数据库实例进行的更新将异步复制到只读副本。您可以将从应用程序发出的读取查询路由到只读副本,以减轻主数据库实例上的负载。利用只读副本,可以实现弹性扩展并超越单个数据库实例的容量限制,以处理高读取量的数据库工作负载。


            只读副本配置
注意

以下信息适用于在源数据库实例所在 Amazon 区域中或在单独的 Amazon 区域中创建 Amazon RDS 只读副本。以下信息不适用于对 Amazon EC2 实例上运行或本地运行的实例设置复制操作。

创建只读副本时,首先指定现有的数据库实例作为源。接着,Amazon RDS 拍摄源实例的快照,并根据该快照创建一个只读实例。然后,每当主数据库实例发生更改时,Amazon RDS 就使用数据库引擎的异步复制方法来更新只读副本。只读副本是仅允许只读连接的数据库实例。应用程序连接到只读副本的方式与连接到任何数据库实例相同。Amazon RDS 复制源数据库实例中的所有数据库。

注意

Oracle 数据库引擎可支持装载模式下的副本数据库。装载副本不接受用户连接,因此无法支持只读工作负载。装载副本的主要用途是跨区域灾难恢复。有关更多信息,请参阅 使用适用于 Amazon RDS 的 Oracle 副本

在某些情况下,只读副本与其主数据库实例位于不同的 Amazon 区域。在这些情况下,Amazon RDS 在主数据库实例与只读副本之间设置安全通道。Amazon RDS 建立启用安全通道所需的任何 Amazon 安全配置,例如添加安全组条目。有关跨区域只读副本的更多信息,请参阅在不同的 Amazon 区域中创建只读副本

您可以为数据库实例配置只读副本,此外还配置了备用副本以实现高可用性。备用副本复制同步进行,备用副本无法处理只读流量。


            只读副本和备用副本配置

有关高可用性和备用副本的更多信息,请参阅Amazon RDS 的高可用性(多可用区)

MariaDB、Microsoft SQL Server、MySQL、Oracle 和 PostgreSQL 数据库引擎支持只读副本。在本部分中,您可以找到有关在所有这些引擎上使用只读副本的一般信息。有关在特定引擎上使用只读副本的信息,请参阅以下部分:

Amazon RDS 只读副本概述

为给定的源数据库实例部署一个或多个只读副本在各种情况下都可能有意义,包括:

  • 扩展用于执行大量读取数据库工作负载的单个数据库实例的计算资源或 I/O 容量。可以将过多的读取流量引导到一个或多个只读副本。

  • 当源数据库实例不可用时,为读取流量提供服务。在某些情况下,您的源数据库实例可能无法处理 I/O 请求(例如,由于备份或计划维护而暂停 I/O)。在这些情况下,您可以将读取流量引导到只读副本。对于这种使用案例,请注意,由于源数据库实例不可用,因而只读副本中的数据可能处于“静态”。

  • 对于业务报告或数据仓库方案,您可能希望针对只读副本(而生产数据库实例)运行业务报告查询。

  • 实施灾难恢复。如果主数据库实例出现故障,则将只读副本提升为独立的实例作为灾难恢复解决方案。

默认情况下,将创建与源数据库实例的存储类型相同的只读副本。但是,您可基于下表中列出的选项创建与源数据库实例的存储类型不同的只读副本。

源数据库实例存储类型 源数据库实例存储分配 只读副本存储类型选项
PIOPS 100 GiB–32 TiB PIOPS、GP2、标准
GP2 100 GiB–32 TiB PIOPS、GP2、标准
GP2 <100 GiB GP2、标准
标准 100 GiB–6 TiB PIOPS、GP2、标准
标准 <100 GiB GP2、标准
注意

增加只读副本的分配存储空间时,它必须至少增加 10%。如果您尝试将该值增加不到 10%,则会得到错误。

Amazon RDS 不支持循环复制。您不能将数据库实例配置为充当现有数据库实例的复制源。您只可以基于现有数据库实例创建新的只读副本。例如,如果 MyDBInstance 复制到 ReadReplica1,您不能将 ReadReplica1 配置为复制回 MyDBInstance。对于 MariaDB 和 MySQL,您可以基于现有只读副本创建只读副本。例如,您可以基于 ReadReplica1 创建新的只读副本,例如 ReadReplica2。对于 Oracle、PostgreSQL 和 SQL Server,您不能基于现有只读副本来创建只读副本。

如果您不再需要只读副本,则可以使用用于删除数据库实例的相同机制显式删除它们。如果您在同一 Amazon 区域中删除源数据库实例而不删除其只读副本,则每个只读副本都会提升为独立的数据库实例。有关删除数据库实例的信息,请参阅删除数据库实例。有关只读副本提升的信息,请参阅将只读副本提升为独立的数据库实例。如果您具有跨区域只读副本,请参阅跨区域复制注意事项了解有关删除跨区域只读副本源的注意事项。

不同数据库引擎的只读副本之间的差异

由于 Amazon RDS 数据库引擎执行复制的方式不同,因此您应了解它们具有的几个显著差异,如下表所示:

功能或操作 MySQL 和 MariaDB Oracle PostgreSQL SQL Server

复制方法是什么?

逻辑复制。

物理复制。

物理复制。

物理复制。

如何清除事务日志?

RDS for MySQL 和 RDS for MariaDB 保留尚未应用的任何二进制日志。

如果主数据库实例没有跨区域只读副本,则 Amazon RDS for Oracle 会在源数据库实例上至少保留两个小时的事务日志。两小时之后或在传递存档日志保留小时数设置之后从源数据库实例中清除日志,以时间较长者为准。传递存档日志保留小时数设置之后,仅当日志已成功应用到数据库时,才会从只读副本清除日志。

在某些情况下,主数据库实例可能具有一个或多个跨区域只读副本。如果是这样,则 Amazon RDS for Oracle 将保留源数据库实例上的事务日志,直到将它们传输并应用到所有跨区域只读副本为止。

有关如何设置存档日志保留时间的信息,请参阅保留存档重做日志

PostgreSQL 具有参数 wal_keep_segments,该参数指示保留多少个提前写入日志 (WAL) 文件以便为只读副本提供数据。该参数值指定要保留的日志的数量。

辅助副本不再需要主副本上事务日志文件的虚拟日志文件 (VLF) 后,可以截断该文件。

只有在副本中稳定了日志记录时,才能将 VLF 标记为非活动。无论磁盘子系统在主副本中的速度如何,事务日志都将保留 VLF,直到最慢的副本已进行稳定。

是否能将副本设置为可写?

是。 您可将 MySQL 或 MariaDB 只读副本设置为可写。

否。Oracle 只读副本是物理副本,Oracle 不允许写入只读副本。您可以提升只读副本以将它设置为可写。提升的只读副本拥有提出提升请求时的已复制数据。

否。PostgreSQL 只读副本是一个物理副本,PostgreSQL 不允许将只读副本设置为可写。

否。SQL Server 只读副本是物理副本,也不允许写入。您可以提升只读副本以将它设置为可写。提升的只读副本拥有提出提升请求时的已复制数据。

是否能在副本上执行备份?

是。您可以对 MySQL 或 MariaDB 只读副本启用自动备份。

否。您不能创建 Amazon RDS for Oracle 只读副本的手动快照或为它们启用自动备份。

是,您可以创建 PostgreSQL 只读副本的手动快照,但无法启用自动备份。

否。您不能创建 Amazon RDS for SQL Server 只读副本的手动快照或为它们启用自动备份。

是否能使用并行复制?

是。MySQL 5.6 版和更高版本和所有支持的 MariaDB 版本允许并行复制线程。

是。重做日志数据始终会从主数据库并行传输到其所有只读副本。

否。PostgreSQL 是一个处理复制的过程。

是。重做日志数据始终会从主数据库并行传输到其所有只读副本。

是否可以使副本保持为装载状态而不是只读状态?

否。

是。装载副本的主要用途是跨区域灾难恢复。装载副本不需要具有 Active Data Guard 许可证。有关更多信息,请参阅 使用适用于 Amazon RDS 的 Oracle 副本

否。

否。

创建只读副本

您可以使用 Amazon Web Services Management Console、Amazon CLI 或 RDS API 从现有数据库实例创建只读副本。可通过指定 SourceDBInstanceIdentifier(要从其进行复制的源数据库实例的数据库实例标识符)创建只读副本。

当您创建只读副本时,Amazon RDS 会制作源数据库实例的数据库快照,然后开始复制。因此,在制作数据库快照时,将在源数据库实例上感到短暂的 I/O 暂停。

注意

这种 I/O 暂停通常持续大约一分钟时间。如果源数据库实例为多可用区部署,则可避免 I/O 暂停,因为在这种情况下,会从辅助数据库实例制作数据库快照。

长时间运行的活动事务会减慢创建只读副本的过程。我们建议您等待长时间运行的事务完成,然后再创建只读副本。如果从同一源数据库实例同时创建多个并行只读副本,则 Amazon RDS 仅在开始第一个创建操作时创建一张快照。

创建只读副本时,有几件事情需要考虑。首先,您必须先通过将备份保留期设置为一个非零值来在源数据库实例上启用自动备份。此要求也适用于作为一个只读副本的源数据库实例的另一个只读副本。要对 RDS for MySQL 5.6 或更高版本的只读副本启用自动备份,请先创建只读副本,然后修改只读副本以启用自动备份。

注意

在 Amazon 区域内,我们强烈建议您在与源数据库实例相同的基于 Amazon VPC 的 Virtual Private Cloud (VPC) 中创建所有只读副本。如果您在与源数据库实例不同的 VPC 中创建只读副本,则副本和 RDS 系统之间的无类域间路由 (CIDR) 范围可能会重叠。CIDR 重叠会使副本不稳定,从而对连接到副本的应用程序产生负面影响。如果您在创建只读副本时收到错误,请选择其他目标数据库子网组。有关更多信息,请参阅 在 VPC 中使用数据库实例

您无法在与源数据库实例不同的 Amazon 账户中创建只读副本。

从源数据库实例创建只读副本

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择数据库

  3. 选择要作为只读副本源的数据库实例。

  4. 对于 Actions (操作),选择 Create read replica (创建只读副本)

  5. 对于数据库实例标识符,输入该只读副本的名称。

  6. 选择您的实例规格。我们建议您为只读副本使用与源数据库实例相同的数据库实例类和存储类型。

  7. 对于多可用区部署,选择以便在另一个可用区中创建副本的备用来支持副本的故障转移。

    注意

    创建您的只读副本作为多可用区数据库实例与源数据库是否为多可用区数据库实例无关。

  8. 创建加密只读副本:

    1. 选择 Enable encryption (启用加密)

    2. 对于主密钥,请选择客户主密钥 (CMK) 的 Amazon Key Management Service (Amazon KMS) 密钥标识符。

    注意

    源数据库实例必须加密。要了解关于加密源数据库实例的更多信息,请参阅 加密 Amazon RDS 资源

  9. 选择其他选项,例如存储自动扩展。

  10. 选择 Create read replica (创建只读副本)

创建只读副本后,您可以在 RDS 控制台的数据库页面上看到它。它在角色列中显示副本

要从源数据库实例创建只读副本,请使用 Amazon CLI 命令 create-db-instance-read-replica。此示例还启用了存储自动扩展功能。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier myreadreplica \ --source-db-instance-identifier mydbinstance \ --max-allocated-storage 1000

对于 Windows:

aws rds create-db-instance-read-replica ^ --db-instance-identifier myreadreplica ^ --source-db-instance-identifier mydbinstance ^ --max-allocated-storage 1000

要从源 MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 数据库实例创建只读副本,请调用具有以下必要参数的Amazon RDS API CreateDBInstanceReadReplica操作:

  • DBInstanceIdentifier

  • SourceDBInstanceIdentifier

将只读副本提升为独立的数据库实例

您可以将只读副本提升为独立的数据库实例。提升只读副本时,数据库实例将在重启后变得可用。


                提升只读副本

出于多种原因,您可能要将只读副本提升为独立的数据库实例:

  • 执行 DDL 操作(仅限 MySQL 和 MariaDB)– 创建或重新生成索引等 DDL 操作需要耗费时间,并且会显著影响数据库实例性能。在 MySQL 或 MariaDB 只读副本与其主数据库实例同步后,可以对该只读副本执行这些操作。然后就可以提升此只读副本并指导应用程序使用提升的实例。

  • 分片 – 分片体现了“无共享”架构,主要涉及将大型数据库分成几个较小的数据库。拆分数据库的一种常用方法是将未加入到同一查询中的表拆分到不同主机。另一种方法是跨多台主机复制表,然后通过哈希算法确定哪一台主机接收给定的更新。您可以创建与各分片(较小的数据库)相对应的只读副本,决定将它们转换成独立分片后即可对其进行提升。然后可以根据您的要求,为每个分区创建表的密钥空间 (如果要拆分行) 或分配。

  • 实施故障恢复 – 如果主数据库实例失败,您可以使用只读副本提升作为数据恢复方案。此方法可补充同步复制、自动故障检测和故障转移。

    如果您了解异步复制的影响和限制,并且仍然要使用只读副本提升功能实现数据恢复,则可以这样做。为此,请先创建只读副本,然后监控主数据库实例的故障。如果出现故障,请执行以下操作:

    1. 提升只读副本。

    2. 将数据库流量指引到提升的数据库实例。

    3. 将提升的数据库实例作为源,创建替代只读副本。

当您提升只读副本时,创建的新数据库实例会保留以前只读副本的选项组和参数组。提升过程可能需要几分钟或更长时间才能完成,具体时间取决于只读副本的大小。将只读副本提升为新数据库实例后,即与任何其他数据库实例相同。例如,您可从新数据库实例创建只读副本并执行时间点还原操作。由于经过提升的数据库实例不再是只读副本,因此不能再使用它作为复制目标。如果源数据库实例有多个只读副本,则将其中一个只读副本提升为数据库实例对其他副本无影响。

备份持续时间随在上次备份后对数据库进行的更改数而发生变化。如果您打算将只读副本提升为单独实例,我们建议您在提升之前启用备份并完成至少一次备份。此外,当只读副本处于 backing-up 状态时,您无法将其提升为独立实例。如果您为只读副本启用了备份,请配置自动备份时段,以便每日备份不会影响只读副本提升。

以下步骤说明将只读副本提升为数据库实例的一般过程:

  1. 停止向主数据库实例写入任何事务,然后等待对只读副本完成所有更新。在主数据库实例上完成数据库更新后,只读副本才会进行数据库更新,且这种复制滞后可能会有很大差异。使用 Replica Lag 指标确定只读副本完成所有更新的时间。

  2. 仅限 MySQL 和 MariaDB:如果需要对 MySQL 或 MariaDB 只读副本作出更改,必须在只读副本的数据库参数组中将 read_only 参数设置为 0。然后可在只读副本上执行所有必需的 DDL 操作,如创建索引。在只读副本上执行的操作不会影响主数据库实例的性能。

  3. 使用 Amazon RDS 控制台上的提升选项、Amazon CLI 命令 promote-read-replicaPromoteReadReplica Amazon RDS API 操作提升只读副本。

    注意

    提升过程需要几分钟才能完成。在提升只读副本时,会停止复制并重启只读副本。完成重启后,只读副本即可作为新数据库实例使用。

  4. (可选) 将新的数据库实例修改为多可用区部署。有关更多信息,请参阅修改 Amazon RDS 数据库实例Amazon RDS 的高可用性(多可用区)

将只读副本提升为独立的数据库实例

  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在 Amazon RDS 控制台中,选择数据库

    随后会显示数据库窗格。每个只读副本在角色列中显示副本

  3. 选择要提升的只读副本。

  4. 对于操作,请选择提升

  5. 提升只读副本页面上,输入新提升的数据库实例的备份保留期和备份时段。

  6. 根据需要设置完毕后,选择 Continue

  7. 在确认页面上,选择 Promote Read Replica (提升只读副本)

要将只读副本提升为独立的数据库实例,请使用 Amazon CLI promote-read-replica 命令。

对于 Linux、macOS 或 Unix:

aws rds promote-read-replica \ --db-instance-identifier myreadreplica

对于 Windows:

aws rds promote-read-replica ^ --db-instance-identifier myreadreplica

要将只读副本提升为独立的数据库实例,请调用具有必要参数 DBInstanceIdentifier 的Amazon RDS API PromoteReadReplica操作。

监控只读复制

您可以通过几个方法监控只读副本的状态。Amazon RDS 控制台在只读副本详细信息的可用性与持久性部分中显示只读副本的状态。要查看只读副本的详细信息,请在 Amazon RDS 控制台的实例列表中选择该只读副本的名称。


                只读副本状态

您还可以使用 Amazon CLI describe-db-instances 命令或 Amazon RDS API DescribeDBInstances 操作查看只读副本的状态。

只读副本的状态可以是以下某项:

  • 正在复制 – 正在成功地复制只读副本。

  • 复制已降级(仅 SQL Server)– 副本从主实例接收数据,但一个或多个数据库可能无法获取更新。例如,当副本正在设置新创建的数据库时,可能会发生这种情况。

    除非在降级状态期间发生错误,否则状态不会从 replication degraded 转换为 error

  • 错误 – 复制出错。检查 Amazon RDS 控制台中的复制错误字段或事件日志以确定具体错误。有关复制错误故障诊断的详细信息,请参阅 排查 MySQL 只读副本问题

  • 已终止(仅限 MariaDB、MySQL 或 PostgreSQL) – 复制已终止。如果复制连续终止超过 30 天,不论是手动还是由于复制错误,都将会出现这种情况。此时,Amazon RDS 终止主数据库实例与所有只读副本之间的复制。Amazon RDS 这样做是为了防止增加源数据库实例上的存储需求以及长故障转移时间。

    复制中断可能影响存储,因为日志的大小和数量可能因向日志写入大量错误消息而增大。复制中断还可能影响故障恢复,因为 Amazon RDS 在恢复期间需要一段时间来维护和处理大量日志。

  • 已停止(仅限 MariaDB 或 MySQL) – 复制已因客户发起请求而停止。

  • 复制停止点设置​(仅限 MySQL) – 使用mysql.rds_start_replication_until存储过程设置客户启动的停止点,并且正在进行复制。

  • 达到复制停止点​(仅限 MySQL) – 使用mysql.rds_start_replication_until存储过程设置客户启动的停止点,并且复制已停止(因为已达到停止点)。

您可以查看到数据库实例的复制位置,如果是,请检查其复制状态。在 RDS 控制台的数据库页面上,它在角色列中显示主要。选择其数据库实例名称。在详细信息页面的连接性和安全性选项卡上,其复制状态位于复制下。

监控复制滞后

您可以通过查看 Amazon RDS ReplicaLag 指标,在 Amazon CloudWatch 中监控复制滞后。

对于 MariaDB 和 MySQL,ReplicaLag 指标报告 SHOW REPLICA STATUS 命令的 Seconds_Behind_Master 字段的值。MySQL 和 MariaDB 的复制滞后的常见原因如下所示:

  • 网络中断。

  • 向只读副本上带索引的表写入。如果只读副本上的 read_only 参数未设置为 0,它可以中断复制。

  • 使用 MyISAM 等非事务性存储引擎。只有 MySQL 上 InnoDB 存储引擎和 MariaDB 上的 XtraDB 存储引擎支持复制。

注意

以前的 MariaDB 和 MySQL 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用的 MariaDB 版本低于 10.5 或者 MySQL 版本低于 8.0.23,那么请使用 SHOW SLAVE STATUS

ReplicaLag 指标达到 0 时,即表示副本已赶上主数据库实例进度。如果 ReplicaLag 指标返回 -1,则当前未激活复制。ReplicaLag = -1 等效于 Seconds_Behind_Master = NULL

对于 Oracle,ReplicaLag 指标是以下项的总和:Apply Lag 值加上当前时间和应用滞后的 DATUM_TIME 值之间的差。DATUM_TIME 值是只读副本从其源数据库实例收到数据的最后时间。有关更多信息,请参阅 Oracle 文档中的V$DATAGUARD_STATS

对于 SQL Server,ReplicaLag 指标是已落后数据库的最大滞后秒数。例如,如果您有两个数据库分别滞后 5 秒和 10 秒,则 ReplicaLag 为 10 秒。ReplicaLag 指标返回以下查询的值。

select ag.name name, MAX(hdrs.secondary_lag_seconds) max_lag from sys.dm_hadr_database_replica_state

有关更多信息,请参阅 Microsoft 文档中的 secondary_lag_seconds

如果 RDS 无法确定滞后,例如在副本安装期间或只读副本处于 error 状态时,则 ReplicaLag 返回 -1

注意

只有当新数据库在只读副本上可供访问之后,才会将其包含在延迟计算中。

对于 PostgreSQL, ReplicaLag 指标返回以下查询的值。

SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS reader_lag

PostgreSQL 9.5.2 版及更高版本使用物理复制槽来管理源实例上的提前写入日志 (WAL) 保留。对于每个跨区域只读副本实例,Amazon RDS 创建一个物理复制槽并将它与实例关联。两个 Amazon CloudWatch 指标、Oldest Replication Slot LagTransaction Logs Disk Usage 表示最滞后的副本(依据接收到的 WAL 数据)的滞后时间和用于 WAL 数据的存储空间。当跨区域只读副本长时间滞后时,Transaction Logs Disk Usage 值会显著增大。

有关使用 CloudWatch 监控数据库实例的更多信息,请参阅使用 Amazon CloudWatch 监控 Amazon RDS 指标