使用只读副本 - Amazon Relational Database Service

使用只读副本

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

注意

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

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

在某些情况下,只读副本与其源数据库实例位于不同的 AWS 区域。在这些情况下,Amazon RDS 在源数据库实例与只读副本之间设置安全通道。Amazon RDS 建立启用安全通道所需的任何 AWS 安全配置,例如添加安全组条目。

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

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、标准

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

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

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

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

复制方法是什么?

逻辑复制。

物理复制。

物理复制。

物理复制。

如何清除事务日志?

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

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

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

有关设置 archivelog retention hours 的信息,请参阅保留存档重做日志

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 是一个处理复制的过程。

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

创建只读副本

可使用 AWS 管理控制台、AWS CLI 或 RDS API 从现有 MySQL、MariaDB、Oracle、PostgreSQL 数据库或 SQL Server 实例创建只读副本。可通过指定 SourceDBInstanceIdentifier(要从其进行复制的源数据库实例的数据库实例标识符)创建只读副本。

当您创建只读副本时,Amazon RDS 会制作源数据库实例的数据库快照,然后开始复制。因此,在制作数据库快照时,将在源数据库实例上感到短暂的 I/O 暂停。这种 I/O 暂停通常持续大约一分钟时间。如果源数据库实例为多可用区部署,则可避免 I/O 暂停,因为在这种情况下,会从辅助数据库实例制作数据库快照。长时间运行的活动事务会减慢创建只读副本的过程。我们建议您等待长时间运行的事务完成,然后再创建只读副本。如果从同一源数据库实例同时创建多个并行只读副本,则 Amazon RDS 仅在开始第一个创建操作时创建一张快照。

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

注意

在 AWS 区域中,所有只读副本必须在与源数据库实例相同的基于 Amazon VPC 的 Virtual Private Cloud (VPC) 中创建。即使在 AWS 区域中配置了 VPC 对等连接,此要求也适用。

从源 MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 数据库实例创建只读副本

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

  3. 选择要用作只读副本源的 MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 数据库实例。

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

  5. 选择要使用的实例规格。我们建议您为只读副本使用与源数据库实例相同的数据库实例类和存储类型。对于多可用区部署,选择以便在另一个可用区中创建副本的备用来支持副本的故障转移。创建您的只读副本作为多可用区数据库实例与源数据库是否为多可用区数据库实例无关。

  6. 选择要使用的设置。对于数据库实例标识符,输入该只读副本的名称。根据需要,调整其他设置。

  7. 选择要使用的其他设置。

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

从源 MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 数据库实例创建只读副本,请使用 AWS 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

对于 Windows:

aws rds create-db-instance-read-replica ^ --db-instance-identifier myreadreplica ^ --source-db-instance-identifier mydbinstance

要从源 MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 数据库实例创建只读副本,请调用 Amazon RDS API 函数 CreateDBInstanceReadReplica

https://rds.amazonaws.com/ ?Action=CreateDBInstanceReadReplica &DBInstanceIdentifier=myreadreplica &SourceDBInstanceIdentifier=mydbinstance &Version=2012-01-15 &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2012-01-20T22%3A06%3A23.624Z &AWSAccessKeyId=<AWS Access Key ID> &Signature=<Signature>

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

可以将 MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 只读副本提升为独立的数据库实例。提升只读副本时,数据库实例将在重启后变得可用。

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

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

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

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

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

    1. 提升只读副本。

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

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

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

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

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

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

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

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

    注意

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

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

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

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

  4. 对于操作,选择提升只读副本

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

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

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

要将只读副本提升为数据库实例,请使用 AWS 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

要将只读副本提升为数据库实例,请调用 PromoteReadReplica

https://rds.amazonaws.com/ ?Action=PromoteReadReplica &DBInstanceIdentifier=myreadreplica &Version=2012-01-15 &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2012-01-20T22%3A06%3A23.624Z &AWSAccessKeyId=<AWS Access Key ID> &Signature=<Signature>

在不同的 AWS 区域中创建只读副本

通过使用 Amazon RDS,您可以在与源数据库实例不同的 AWS 区域中创建 MariaDB、MySQL、Oracle 或 PostgreSQL 只读副本。Amazon RDS 上的 SQL Server 不支持创建跨区域只读副本。

您可在其他 AWS 区域创建只读副本,用于执行以下操作:

  • 完善灾难恢复功能。

  • 将读取操作扩展到与用户更接近的 AWS 区域。

  • 使从一个 AWS 区域中的数据中心迁移到另一个 AWS 区域中的数据中心的操作变得更轻松。

在与源实例不同的 AWS 区域中创建只读副本与在同一 AWS 区域中创建副本非常相似。您可以使用 AWS 管理控制台、运行 create-db-instance-read-replica 命令或调用 CreateDBInstanceReadReplica API 操作。

要在与源数据库实例不同的 AWS 区域中创建一个加密的只读副本,源数据库实例必须加密。

以下可选择加入的 AWS 区域不支持跨区域只读副本:

  • 非洲(开普敦)

  • 亚太地区(香港)

  • 欧洲(米兰)

  • 中东(巴林)

以下过程演示如何根据不同 AWS 区域中的源 MariaDB、MySQL、Oracle 或 PostgreSQL 数据库实例创建只读副本。

您可以使用 AWS 管理控制台跨不同 AWS 区域创建只读副本。

使用控制台跨不同 AWS 区域创建只读副本

  1. 通过以下网址登录 AWS 管理控制台并打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

  3. 选择要用作只读副本源的 MariaDB、MySQL、Oracle 或 PostgreSQL 数据库实例。对于 Actions (操作),选择 Create read replica (创建只读副本)。要创建加密的只读副本,必须对源数据库实例进行加密。要了解关于加密源数据库实例的更多信息,请参阅 加密 Amazon RDS 资源

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

  5. 选择要使用的其他设置:

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

    • 网络与安全部分中,为目标区域目标数据库子网组选择一个值。

    • 要在另一个 AWS 区域中创建加密的只读副本,请选择启用加密,然后选择主密钥。对于主密钥,请选择目标 AWS 区域的 AWS Key Management Service (AWS KMS) 密钥标识符。

    • 选择要使用的其他设置。

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

要从不同 AWS 区域中的源 MySQL、MariaDB、Oracle 或 PostgreSQL 数据库实例创建只读副本,您可以使用 create-db-instance-read-replica 命令。在本示例中,您从要在其中创建只读副本的 AWS 区域使用 create-db-instance-read-replica 并指定源数据库实例的 Amazon 资源名称 (ARN)。ARN 唯一地标识 Amazon Web Services 中创建的资源。

例如,如果您的源数据库实例位于美国东部(弗吉尼亚北部)区域,则 ARN 看起来类似于下例:

arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance

有关 ARN 的信息,请参阅在 Amazon RDS 中使用 Amazon 资源名称 (ARN)

要在与源数据库实例不同的 AWS 区域中创建一个加密的只读副本,您可以在目标 AWS 区域使用 AWS CLI create-db-instance-read-replica 命令。以下参数用于在另一 AWS 区域创建加密的只读副本:

  • --source-region — 创建加密只读副本的 AWS 区域。如果未指定 source-region,则必须指定 pre-signed-url 值。pre-signed-url 是一个 URL,包含签名版本 4 签名的请求,该请求用于在源 AWS 区域(将从中创建只读副本)中调用 CreateDBInstanceReadReplica 操作。要了解有关 pre-signed-url 的更多信息,请参阅CreateDBInstanceReadReplica

  • --source-db-instance-identifier — 创建的加密只读副本的数据库实例标识符。对于源 AWS 区域,此标识符必须采用 ARN 格式。source-db-instance-identifier 中指定的 AWS 区域必须匹配指定为 source-region 的 AWS 区域。

  • --db-instance-identifier — 目标 AWS 区域中加密只读副本的标识符。

  • --kms-key-id — 要用于对目标 AWS 区域中只读副本进行加密的密钥的 AWS KMS 密钥标识符。

以下代码可在 us-west-2 区域创建只读副本。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier DBInstanceIdentifier \ --region us-west-2 \ --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance

对于 Windows:

aws rds create-db-instance-read-replica ^ --db-instance-identifier DBInstanceIdentifier ^ --region us-west-2 ^ --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance

以下代码可在与源数据库实例不同的 AWS 区域中创建只读副本。您调用 create-db-instance-read-replica 命令的 AWS 区域是加密只读副本的目标 AWS 区域。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier DBInstanceIdentifier \ --region us-west-2 \ --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance \ --source-region us-east-1 \ --kms-key-id my-us-east-1-key

对于 Windows:

aws rds create-db-instance-read-replica ^ --db-instance-identifier DBInstanceIdentifier ^ --region us-west-2 ^ --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance ^ --source-region us-east-1 ^ --kms-key-id my-us-east-1-key

要从不同 AWS 区域中的源 MySQL、MariaDB、Oracle 或 PostgreSQL 数据库实例创建只读副本,可以调用 Amazon RDS API 函数 CreateDBInstanceReadReplica。在本示例中,您从要在其中创建只读副本的 AWS 区域调用 CreateDBInstanceReadReplica 并指定源数据库实例的 Amazon 资源名称 (ARN)。ARN 唯一地标识 Amazon Web Services 中创建的资源。

要在与源数据库实例不同的 AWS 区域中创建加密只读副本,可以在 AWS 目标区域使用 Amazon RDS APICreateDBInstanceReadReplica 操作。若要在另一个 AWS 区域中创建加密的只读副本,必须指定 PreSignedURL 的值。PreSignedURL 应包含对 CreateDBInstanceReadReplica 操作的请求,以便调用创建只读副本的源 AWS 区域。要了解有关 PreSignedUrl 的更多信息,请参阅CreateDBInstanceReadReplica

例如,如果您的源数据库实例位于美国东部(弗吉尼亚北部)区域,则 ARN 看起来类似以下内容。

arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance

有关 ARN 的信息,请参阅在 Amazon RDS 中使用 Amazon 资源名称 (ARN)

https://us-west-2.rds.amazonaws.com/ ?Action=CreateDBInstanceReadReplica &KmsKeyId=my-us-east-1-key &PreSignedUrl=https%253A%252F%252Frds.us-west-2.amazonaws.com%252F %253FAction%253D CreateDBInstanceReadReplica %2526DestinationRegion%253Dus-east-1 %2526KmsKeyId%253Dmy-us-east-1-key %2526SourceDBInstanceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%1234567890 12%25253Adb%25253Amy-mysql-instance %2526SignatureMethod%253DHmacSHA256 %2526SignatureVersion%253D4%2526SourceDBInstanceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%25253A123456789012%25253Ainstance%25253Amysql-instance1-instance-20161115 %2526Version%253D2014-10-31 %2526X-Amz-Algorithm%253DAWS4-HMAC-SHA256 %2526X-Amz-Credential%253DAKIADQKE4SARGYLE%252F20161117%252Fus-west-2%252Frds%252Faws4_request %2526X-Amz-Date%253D20161117T215409Z %2526X-Amz-Expires%253D3600 %2526X-Amz-SignedHeaders%253Dcontent-type%253Bhost%253Buser-agent%253Bx-amz-content-sha256%253Bx-amz-date %2526X-Amz-Signature%253D255a0f17b4e717d3b67fad163c3ec26573b882c03a65523522cf890a67fca613 &DBInstanceIdentifier=myreadreplica &SourceDBInstanceIdentifier=arn:aws:rds:us-east-1:123456789012:db:my-mysql-instance &Version=2012-01-15 &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2012-01-20T22%3A06%3A23.624Z &AWSAccessKeyId=<AWS Access Key ID> &Signature=<Signature>

跨区域复制注意事项

所有在一个 AWS 区域内执行复制需要注意的事项都适用于跨区域复制。在执行跨 AWS 区域复制时,还需要额外注意以下事项:

  • 您只有在使用以下 Amazon RDS 数据库实例时,才能在 AWS 区域之间进行复制:

    • MariaDB(所有版本)。

    • MySQL 版本 5.6 及更高版本。

    • Oracle Enterprise Edition (EE) 引擎版本 12.1.0.2.v10 和更高的 12.1 版本、12.2 的所有版本以及 18.0 的所有版本。

      需要有效的 Data Guard 许可。有关 Oracle 跨区域只读副本的限制的信息,请参阅 只读副本限制 (Oracle)

    • PostgreSQL(所有版本)。

  • 源数据库实例可在多个 AWS 区域具有跨区域只读副本。

  • 您只能从未作为其他 Amazon RDS 数据库实例的只读副本的源 Amazon RDS 数据库实例创建跨区域的 Amazon RDS 只读副本。

  • 不能在 AWS GovCloud (US-West)区域内外设置复制通道。

  • 对于所在 AWS 区域与源实例不同的任何只读副本,其滞后时间将更长。产生此滞后时间是因为区域数据中心之间的网络通道更长。

  • 在一个 AWS 区域内,从同一源数据库实例创建的所有跨区域只读副本必须位于同一 VPC 内部或任一 VPC 外部。对于跨区域只读副本,所有指定 --db-subnet-group-name 参数的只读副本创建命令必须从同一 VPC 指定数据库子网组。

  • 您可以从其他 AWS 区域的 VPC 中的源数据库实例在 VPC 内部创建跨区域只读副本。还可以从 VPC 外部的源数据库实例在 VPC 内部创建跨区域只读副本。也可以从 VPC 内部的源数据库实例在 VPC 外部创建跨区域只读副本。

  • 由于 VPC 对访问控制列表 (ACL) 条目数有限制,我们无法保证 5 个以上的跨区域只读副本实例。

  • 只读副本使用指定数据库引擎的默认数据库参数组。

  • 只读副本使用默认安全组。

  • 对于 MariaDB、MySQL 和 Oracle 数据库实例,删除跨区域只读副本的源时,将提升只读副本。

  • 对于 PostgreSQL 数据库实例,删除跨区域只读副本的源时,只读副本的复制状态将设置为 terminated。不会提升只读副本。

跨区域复制成本

跨区域复制时传输的数据可产生 Amazon RDS 数据传输费用。这些跨区域复制操作会对传输到源 AWS 区域以外的数据收取费用:

  • 在创建只读副本时,Amazon RDS 将创建源实例的快照,并将快照传输到只读副本 AWS 区域。

  • 对于源数据库中做出的每个数据修改,Amazon RDS 都会将数据从源 AWS 区域传输到只读副本 AWS 区域。

有关数据传输定价的更多信息,请参阅 Amazon RDS 定价

对于 MySQL 和 MariaDB 实例,可以通过减少创建的跨区域只读副本的数量来降低数据传输费用。例如,假设您在一个 AWS 区域中有一个源数据库实例并希望在另一个 AWS 区域中有三个只读副本。在这种情况下,您只能从源数据库实例创建一个只读副本。您可以从第一个只读副本而不是源数据库实例创建另外两个副本。

例如,如果您在一个 AWS 区域有 source-instance-1,则可以执行以下操作:

  • 在新的 AWS 区域创建 read-replica-1,指定 source-instance-1 作为源。

  • read-replica-1 创建 read-replica-2

  • read-replica-1 创建 read-replica-3

在此例中,只需支付从 source-instance-1read-replica-1 的数据传输费用。您无需支付从 read-replica-1 到另外两个副本的数据传输费用,因为它们位于同一 AWS 区域。如果从 source-instance-1 直接创建所有三个副本,则需要为传输到所有三个副本的数据付费。

Amazon RDS 如何执行跨区域复制

Amazon RDS 使用以下过程创建跨区域只读副本。根据涉及的 AWS 区域和数据库中的数据量,此过程可能需要几个小时才能完成。在创建跨区域只读副本时,可使用此信息来确定过程进度:

  1. Amazon RDS 开始将源数据库实例作为复制源配置,并将状态设置为 modifying

  2. Amazon RDS 开始在 AWS 目标区域中设置指定的只读副本,并将状态设置为正在创建

  3. Amazon RDS 在源 AWS 区域创建源数据库实例的自动数据库快照。数据库快照名称的格式为 rds:<InstanceID>-<timestamp>,其中 <InstanceID> 是源实例的标识符,<timestamp> 是复制开始的日期和时间。例如,rds:mysourceinstance-2013-11-14-09-24 是在 mysourceinstance 从实例 2013-11-14-09-24 创建的。在创建自动数据库快照期间,源数据库实例保持正在修改 状态,只读副本保持正在创建 状态,数据库快照处于正在创建 状态。控制台中数据库快照页面的进度栏可报告数据库快照创建进度。数据库快照创建完成后,数据库快照和源数据库实例的状态都将设置为 available

  4. Amazon RDS 开始为初始数据传输复制跨区域快照。快照复制在目标 AWS 区域作为自动快照列出,状态为正在创建。其名称与源数据库快照相同。数据库快照的进度栏可显示复制进度。复制完成后,数据库快照的状态将被设置为 available

  5. Amazon RDS 随后使用对只读副本的初始数据加载的数据库快照副本。在此期间,只读副本位于目标区域的数据库实例列表中,状态为正在创建。加载完成后,只读副本的状态将设置为可用,数据库快照副本则被删除。

  6. 当只读副本为可用状态时,Amazon RDS 启动,并复制自创建只读副本操作启动以来对源实例所做的修改。在此期间,只读副本的复制滞后时间将大于 0。

    有关使用复制滞后时间的信息,请参阅 监控只读复制

跨区域复制示例

例 在任何 VPC 外部创建跨区域只读副本

以下示例从 us-east-1 中的源数据库实例,在 us-west-2 中创建只读副本。在 VPC 外部创建只读副本:

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier SimCoProd01Replica01 \ --region us-west-2 --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:SimcoProd01

对于 Windows:

aws rds create-db-instance-read-replica ^ --db-instance-identifier SimCoProd01Replica01 ^ --region us-west-2 --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:SimcoProd01

例 在 VPC 内部创建跨区域只读副本

本实例从 us-east-1 中的源数据库实例,在 us-west-2 中创建只读副本。在与指定数据库子网组相关联的 VPC 内部创建只读副本:

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier SimCoProd01Replica01 \ --region us-west-2 --db-subnet-group-name my-us-west-2-subnet --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:SimcoProd01

对于 Windows:

aws rds create-db-instance-read-replica ^ --db-instance-identifier SimCoProd01Replica01 ^ --region us-west-2 --db-subnet-group-name my-us-west-2-subnet --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:SimcoProd01

监控只读复制

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


                只读副本状态

您还可以使用 AWS 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存储过程设置客户启动的停止点,并且复制已停止(因为已达到停止点)。

监控复制滞后

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

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

  • 网络中断。

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

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

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 slave_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 进行监控