使用只读副本 - Amazon Relational Database Service

使用只读副本

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


            只读副本配置
注意

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

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

注意

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

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

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


            只读副本和备用副本配置

有关高可用性和备用副本的更多信息,请参阅多可用区部署,可实现高可用性

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

有关在特定引擎上使用只读副本的信息,请参阅以下部分:

Amazon RDS 只读副本概述

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

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

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

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

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

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

源数据库实例存储类型 源数据库实例存储分配 只读副本存储类型选项
预置 IOPS 100 GiB–64 TiB 预调配 IOPS、通用型、磁性
通用 100 GiB–64 TiB 预调配 IOPS、通用型、磁性
通用 <100 GiB 通用型,磁性
磁介质 100 GiB–6 TiB 预调配 IOPS、通用型、磁性
磁介质 <100 GiB 通用型,磁性
注意

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

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

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

如果您具有跨区域只读副本,请参阅跨区域复制注意事项了解有关删除跨区域只读副本源数据库实例的注意事项。

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

由于 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 只读副本的手动快照或为它们启用自动备份。

是否能使用并行复制?

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

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

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

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

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

否。

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

否。

否。

创建只读副本

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

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

注意

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

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

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

注意

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

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

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

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

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

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

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

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

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

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

    注意

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

  8. 创建加密只读副本:

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

    2. 对于 AWS KMS key,选择 KMS 密钥的 AWS KMS key 标识符。

    注意

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

  9. 指定其他设置,例如存储自动扩展。

    有关每项设置的信息,请参阅 数据库实例的设置

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

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

要从源数据库实例创建只读副本,请使用 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 \ --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 控制台上的 Promote(提升)选项、AWS CLI 命令 promote-read-replicaPromoteReadReplica Amazon RDS API 操作来提升只读副本。

    注意

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

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

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

  1. 登录AWS Management Console并通过以下网址打开 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 的 Amazon RDS API DBInstanceIdentifier 操作。

监控只读复制

您可以通过几个方法监控只读副本的状态。Amazon RDS 控制台在只读副本详细信息的 Connectivity & security(连接和安全)选项卡的 Replication(复制)部分中显示只读副本的状态。要查看只读副本的详细信息,请在 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存储过程设置客户启动的停止点,并且复制已停止(因为已达到停止点)。

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

监控复制滞后

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

对于 MariaDB 和 MySQL,ReplicaLag 指标报告 Seconds_Behind_Master 命令的 SHOW REPLICA STATUS 字段的值。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 MAX(secondary_lag_seconds) max_lag FROM sys.dm_hadr_database_replica_states;

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

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

注意

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

对于 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 指标

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

借助 Amazon RDS,您可以在与源数据库实例不同的 AWS 区域中创建只读副本。


                跨区域只读副本配置

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

  • 完善灾难恢复功能。

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

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

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

注意

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

区域和版本可用性

功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关跨区域复制的版本和区域可用性的更多信息,请参阅跨区域只读副本

创建跨区域只读副本

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

您可以使用 AWS Management Console 跨不同 AWS 区域创建只读副本。

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

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

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

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

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

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

  6. 选择目标区域

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

  8. 要在其他 AWS 区域中创建加密只读副本,请执行以下操作:

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

    2. 对于 AWS KMS key,请选择目标 AWS 区域中的 KMS 密钥的 AWS KMS key 标识符。

    注意

    要创建加密的只读副本,必须对源数据库实例进行加密。要了解关于加密源数据库实例的更多信息,请参阅 加密 Amazon RDS 资源

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

  10. 选择 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 中创建的资源。

例如,如果您的源数据库实例位于US East (N. Virginia)区域,则 ARN 看起来类似于下例:

arn:aws:rds:us-east-1:123456789012:db:mydbinstance

有关 ARN 的信息,请参阅 在 Amazon RDS 中使用 Amazon Resource Name (ARN)

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

  • --region – 创建只读副本的目标 AWS 区域。

  • --source-db-instance-identifier – 源数据库实例的数据库实例标识符。对于源 AWS 区域,此标识符必须采用 ARN 格式。

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

例 跨区域只读副本

以下代码从 US East (N. Virginia) 区域中的源数据库实例,在 美国西部(俄勒冈) 区域中创建只读副本。

对于 Linux、macOS 或 Unix:

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

对于 Windows:

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

在另一 AWS 区域创建加密的只读副本还需要以下参数:

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

例 加密的跨区域只读副本

以下代码从 US East (N. Virginia) 区域中的源数据库实例,在 美国西部(俄勒冈) 区域中创建加密的只读副本。

对于 Linux、macOS 或 Unix:

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

对于 Windows:

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

在 AWS GovCloud(美国东部)和 AWS GovCloud(美国西部)区域之间创建加密只读副本时需要 --source-region 选项。对于 --source-region,指定源数据库实例的 AWS 区域。

如果未指定 --source-region,请指定 --pre-signed-url 值。预签名 URL 包含签名版本 4 签名的请求,该请求用于在源 AWS 区域中调用的 create-db-instance-read-replica 命令。要了解有关 pre-signed-url 选项的更多信息,请参阅《AWS CLI 命令参考》中的 create-db-instance-read-replica

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

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

例如,如果您的源数据库实例位于US East (N. Virginia)区域,则 ARN 看起来类似以下内容。

arn:aws:rds:us-east-1:123456789012:db:mydbinstance

有关 ARN 的信息,请参阅在 Amazon RDS 中使用 Amazon Resource Name (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%253DCreateDBInstanceReadReplica %2526DestinationRegion%253Dus-east-1 %2526KmsKeyId%253Dmy-us-east-1-key %2526SourceDBInstanceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%123456789012%25253Adb%25253Amydbinstance %2526SignatureMethod%253DHmacSHA256 %2526SignatureVersion%253D4%2526SourceDBInstanceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%25253A123456789012%25253Ainstance%25253Amydbinstance %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=&region-arn;rds:us-east-1:123456789012:db:mydbinstance &Version=2012-01-15 &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2012-01-20T22%3A06%3A23.624Z &AWSAccessKeyId=<&AWS; Access Key ID> &Signature=<Signature>

Amazon RDS 如何执行跨区域复制

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

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

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

  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 区域作为自动快照列出,状态为 creating(正在创建)。其名称与源数据库快照相同。数据库快照的进度栏可显示复制进度。复制完成后,数据库快照的状态将被设置为 available (可用)

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

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

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

跨区域复制注意事项

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

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

  • 对于 Microsoft SQL Server、Oracle 和 PostgreSQL 数据库实例,您只能从未作为其他 Amazon RDS 数据库实例的只读副本的源 Amazon RDS 数据库实例创建跨区域的 Amazon RDS 只读副本。此限制不适用于 MariaDB 和 MySQL 数据库实例。

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

  • 对于跨区域只读副本,所有指定 --db-subnet-group-name 参数的只读副本创建命令必须从同一 VPC 指定数据库子网组。

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

  • 大多数情况下,只读副本使用指定数据库引擎的默认数据库参数组和数据库选项组。

    对于 MySQL 和 Oracle 数据库引擎,您可以在 AWS CLI 命令 create-db-instance-read-replica--db-parameter-group-name 选项中为只读副本指定自定义参数组。使用 AWS Management Console 时,无法指定自定义参数组。

  • 只读副本使用原定设置安全组。

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

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

    您必须手动提升只读副本或将其删除。

请求跨区域只读副本

要与源区域通信以请求创建跨区域只读副本,请求者(IAM 角色或 IAM 用户)必须能够访问源数据库实例和源区域。

请求者的 IAM 策略中的某些条件可能会导致请求失败。以下示例假定源数据库实例位于美国东部(俄亥俄州),只读副本在US East (N. Virginia)中创建。这些示例显示了请求者的 IAM 策略中导致请求失败的条件:

  • 请求者的策略对于 aws:RequestedRegion 具有条件限制。

    ... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "us-east-1" } }

    请求失败,因为该策略不允许访问源区域。要想请求成功,请指定源区域和目标区域。

    ... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": [ "us-east-1", "us-east-2" ] } }
  • 请求者的策略不允许访问源数据库实例。

    ... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": "arn:aws:rds:us-east-1:123456789012:db:myreadreplica" ...

    要想请求成功,请指定源实例和副本。

    ... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": [ "arn:aws:rds:us-east-1:123456789012:db:myreadreplica", "arn:aws:rds:us-east-2:123456789012:db:mydbinstance" ] ...
  • 请求者的政策拒绝 aws:ViaAWSService

    ... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": "*", "Condition": { "Bool": {"aws:ViaAWSService": "false"} }

    与源区域的通信由 RDS 代表请求者进行。要想请求成功,请不要拒绝 AWS 服务发出的调用。

  • 请求者的策略对于 aws:SourceVpcaws:SourceVpce 具有条件限制。

    这些请求可能会失败,因为 RDS 对远程区域进行调用时,它并非来自指定的 VPC 或 VPC 终端节点。

如果您需要使用可能导致请求失败的上述某个条件,则可以在策略中包含第二个带有 aws:CalledVia 的语句,以便请求成功。例如,您可以使用带有 aws:CalledViaaws:SourceVpce,如下所示:

... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": "*", "Condition": { "Condition" : { "ForAnyValue:StringEquals" : { "aws:SourceVpce": "vpce-1a2b3c4d" } } }, { "Effect": "Allow", "Action": [ "rds:CreateDBInstanceReadReplica" ], "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": [ "rds.amazonaws.com" ] } } }

有关更多信息,请参阅 IAM 用户指南 中的 IAM 中的策略和权限

授权只读副本

跨区域数据库只读副本创建请求返回后success,RDS 开始在后台创建副本。创建了 RDS 访问源数据库实例的授权。此授权将源数据库实例链接到只读副本,并允许 RDS 仅复制到指定的只读副本。

RDS 使用服务链接的 IAM 角色中的 rds:CrossRegionCommunication 权限对授权进行验证。如果副本获得授权,RDS 将与源区域通信并完成副本创建。

RDS 无权访问之前未经 CreateDBInstanceReadReplica 请求授权的数据库实例。只读副本创建完成后,将撤销授权。

RDS 使用服务链接的角色来验证源区域中的授权。如果在复制创建过程中删除了服务链接的角色,则创建将失败。

有关更多信息,请参阅 IAM 用户指南 中的使用服务相关角色

使用 AWS Security Token Service 凭证

来自全局 AWS Security Token Service (AWS STS) 终端节点的会话令牌仅在默认启用的 AWS 区域(商业区域)中有效。在 assumeRole 中使用来自 AWS STS API 操作的凭证时, 如果源区域是选择加入区域,请使用区域终端节点。否则,请求将失败。发生这种情况的原因是,您的凭证必须在两个区域都有效,而在使用区域 AWS STS 终端节点时,仅选择加入区域有效。

要使用全局终端节点,请确保在操作中为两个区域都启用了该终端节点。在 Valid in all AWS 区域 账户设置中将全局终端节点设置为 AWS STS。

同样的规则也适用于预签名 URL 参数中的凭证。

有关更多信息,请参阅《IAM 用户指南》中的在 AWS 区域中管理 AWS STS

跨区域复制成本

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

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

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

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

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

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

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

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

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

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