Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 PostgreSQL、MySQL 和 MariaDB 只读副本

Amazon RDS 使用 MySQL、MariaDB 和 PostgreSQL (版本 9.3.5 和更高版本) 数据库引擎的内置复制功能从源数据实例创建一个特殊类型的数据库实例,称为只读副本。对源数据库实例的更新将异步复制到只读副本。您可以将应用程序发出的读取查询路由到只读副本,以减轻源数据库实例上的负载。利用只读副本,可针对进行大量读取操作的数据库负载灵活地进行扩展,突破单个数据库实例的容量限制。

注意

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

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

如果只读副本与数据库实例位于不同的 AWS 区域中,则 Amazon RDS 会在源数据库实例与只读副本之间设置安全信道。Amazon RDS 会建立启用安全通道所需的所有 AWS 安全配置,如添加安全组条目。PostgreSQL 数据库实例使用一个安全连接,可通过同时将源实例和副本实例的 ssl 参数设置为 1 来对此安全连接进行加密。

Amazon RDS 只读副本概述

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

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

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

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

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

源数据库实例存储类型 源数据库实例存储分配 只读副本存储类型选项
PIOPS 100 GB - 3 TB PIOPS | GP2 | 标准
GP2 100 GB - 3 TB PIOPS | GP2 | 标准
GP2 不到 100 GB GP2 | 标准
标准 100 GB - 3 TB PIOPS | GP2 | 标准
标准 不到 100 GB GP2 | 标准

Amazon RDS 不支持循环复制。无法配置数据库实例以使其作为现有数据库实例的复制源;只能从现有的数据库实例新建只读副本。例如,如果 MyDBInstance 复制到 ReadReplica1,您就不能再配置 ReadReplica1 以反向复制到 MyDBInstance。您只能从 ReadReplica1 新建只读副本,如 ReadReplica2。

对于 MySQL、MariaDB 和 PostgreSQL 只读副本,您可以通过查看 Amazon RDS ReplicaLag 指标来监控 Amazon CloudWatch 中的复制滞后。对于 MySQL 和 MariaDB,ReplicaLag 指标报告 SHOW SLAVE STATUS 命令的 Seconds_Behind_Master 字段的值。对于 PostgreSQL,ReplicaLag 指标报告 SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS slave_lag 的值。

MySQL 和 MariaDB 的复制滞后的常见原因如下所示:

  • 网络中断。

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

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

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

PostgreSQL 与 MySQL 或 MariaDB 只读副本之间的区别

由于 PostgreSQL 数据库引擎执行复制操作的方式与 MySQL 和 MariaDB 数据库引擎不同,因此您应了解下表中所示的几个显著差异:

功能/操作 PostgreSQL MySQL 和 MariaDB

复制方法是什么?

物理复制。 

逻辑复制。

如何清除事务日志?

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

Amazon RDS 将不会删除任何尚未应用的二进制日志。

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

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

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

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

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

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

是否能使用并行复制?

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

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

PostgreSQL 只读副本 (版本 9.3.5 和更高版本)

Amazon RDS PostgreSQL 9.3.5 和更高版本使用 PostgreSQL 本机流式复制来创建源 (PostgreSQL 术语中的“主”) 数据库实例的只读副本。此只读副本 (PostgreSQL 术语中的“备用”) 数据库实例是主数据库实例异步创建的物理副本。该副本是由在源数据库实例和只读副本 (其中,PostgreSQL 在发生数据库更改时将异步流式处理这些更改) 之间传输提前写入日志 (WAL) 数据的特殊连接创建的。

PostgreSQL 使用“副本”角色执行流式复制。该角色拥有特权,但不能用于修改任何数据。PostgreSQL 使用处理复制的单个过程。

创建 PostgreSQL 只读副本不需要中断主数据库实例。Amazon RDS 为源数据库实例和只读副本设置所需的参数和权限,而不中断任何服务。将拍摄源数据库实例的快照,此快照将变为只读副本。在删除只读副本时不会发生中断。

您可以从一个源数据库实例创建最多 5 个只读副本。为了有效地进行复制,每个只读副本具有的计算和存储资源的量应与源数据库实例的一样多。如果扩展源数据库实例,则还应扩展只读副本。

如果 Amazon RDS 从一开始就阻止只读副本,它将覆盖只读副本上任何不兼容的参数。例如,如果 max_connections 参数在源数据库实例上的值大于其在只读副本上的值,Amazon RDS 会将只读副本上该参数的值更新为与源数据库实例相同。

以下是有关 PostgreSQL 只读副本的一些重要情况:

  • PostgreSQL 只读副本是只读的,不能将其设置为可写。

  • 无法从一个只读副本创建另一个只读副本 (即,无法创建级联只读副本)。

  • 您可将 PostgreSQL 只读副本提升为新的源数据库实例。但只读副本不会自动变为新的源数据库实例。在提升只读副本时,该副本将停止接收 WAL 通信并且不再是只读实例。必须设置任何后续副本,因为提升的只读副本现已成为新的源数据库实例。

  • 如果源数据库实例上未发生任何用户事务,则 PostgreSQL 只读副本将在最迟 5 分钟后报告复制滞后。

  • 您必须先通过将备份保留期设置为一个非零值来在源数据库实例上启用自动备份,然后数据库实例才能充当源数据库实例。

导致 PostgreSQL 复制中断的情况

在几种情况下,PostgreSQL 源数据库实例会意外地中断只读副本的复制。这些情况包括:

  • max_wal_senders 参数设置为一个太小的值,导致无法向只读副本的数目提供足够的数据。此情况会导致复制停止。

  • PostgreSQL 参数 wal_keep_segments,该参数指示保留多少个 WAL 文件以便为只读副本提供数据。 该参数值指定要保留的日志的数量。如果将该参数值设置为一个太小的值,则可能导致只读副本在流式复制停止后大幅滞后。在此情况下,Amazon RDS 将通过重播源数据库实例的已存档 WAL 日志来报告复制错误并开始在只读副本上执行恢复操作。在只读副本赶上进度可继续流式复制之前,该恢复过程将继续。有关此过程以及如何确定适当的参数设置的更多信息,请参阅解决 PostgreSQL 只读副本问题

  • 如果源数据库实例终端节点发生更改,则 PostgreSQL 只读副本需要重启。

在向只读副本提供数据的 WAL 流中断时,PostgreSQL 会切换为恢复模式以使用已存档 WAL 文件还原只读副本。此过程完成后,PostgreSQL 将尝试重新建立流式复制。

MySQL 和 MariaDB 只读副本

您必须先通过将备份保留期设置为一个非零值来对源数据库实例启用自动备份,然后 MySQL 或 MariaDB 数据库实例才能充当复制源。此要求也适用于作为一个只读副本的源数据库实例的另一个只读副本。只有运行任意版本的 MariaDB 或运行 MySQL 5.6 及更高版本的只读副本支持自动备份。

您可以同时为 MySQL 和 MariaDB 实例配置基于复制的二进制日志坐标。对于 MariaDB 实例,您也可以配置基于复制的全局事务 ID (GTID),它将提供更高的崩溃安全性。有关通过在 MariaDB 数据库实例上使用 GTID 来配置复制的更多信息,请参阅 将基于 GTID 的复制配置到 Amazon RDS MariaDB 数据库实例中

您可从一个数据库实例创建最多 5 个只读副本。为了有效地进行复制,每个只读副本具有的计算和存储资源应与源数据库实例一样多。如果扩展源数据库实例,则还应扩展只读副本。

如果一个只读副本运行的是任何版本的 MariaDB 或 MySQL 5.6 及更高版本,则可指定它作为另一个只读副本的源数据库实例。例如,可从 MyDBInstance 创建 ReadReplica1,然后从 ReadReplica1 创建 ReadReplica2。对 MyDBInstance 的更新将复制到 ReadReplica1,然后从 ReadReplica1 复制到 ReadReplica2。一个复制链中不能涉及超过四个实例。例如,您可以从 MySourceDBInstance 创建 ReadReplica1,再从 ReadReplica1 创建 ReadReplica2,然后从 ReadReplica2 创建 ReadReplica3,但不能再从 ReadReplica3 创建 ReadReplica4。

要对 Amazon RDS MariaDB 或 MySQL 5.6 版及更高版本的只读副本启用自动备份,请先创建只读副本,然后修改只读副本以启用自动备份。

只读副本旨在支持读取查询,但您可能需要偶尔进行更新。例如,您可能需要添加索引,以加快访问副本的特定类型的查询。可通过在只读副本的数据库参数组中将 read_only 参数设置为 0 来启用更新。

只要不超过源实例的 5 个只读副本的限制,即可同时运行多个引用同一源数据库实例的只读副本创建或删除操作。

可从单可用区或多可用区数据库实例部署中创建只读副本。您可以使用多可用区部署提高关键系统的持久性和可用性,但无法使用多可用区域为只读查询提供辅助服务。必须从大流量、多可用区数据库实例创建只读副本以从源数据库实例卸载读取查询。如果多可用区部署的源实例故障转移到辅助可用区,则任何关联的只读副本都将切换为使用辅助可用区作为其复制源。

对于 MySQL 和 MariaDB 数据库实例,在某些情况下,如果某些二进制日志事件在故障期间未刷新,只读副本将无法切换到辅助可用区。在这些情况下,必须手动删除并重新创建只读副本。您可通过设置 sync_binlog=1innodb_support_xa=1 动态变量,降低在 MySQL 5.5 中发生这种情况的可能性。这些设置可能降低性能,因此,请先测试其影响,然后再实施对生产环境的更改。如果使用的是 MySQL 5.6 及更高版本或 MariaDB,则不大可能出现这些问题。对于运行 MySQL 5.6 及更高版本或 MariaDB 的实例,这些参数在默认情况下设置为 sync_binlog=1innodb_support_xa=1

通常在 Amazon RDS 数据库实例之间配置复制,但可配置复制以从在 Amazon RDS 外部运行的 MySQL 或 MariaDB 实例导入数据库,或将数据库导出到此类实例。有关更多信息,请参阅 将数据导入到 Amazon RDS MySQL 或 MariaDB 数据库实例中,同时减少停机时间使用复制导出 MySQL 数据

可通过调用系统存储过程 mysql.rds_stop_replicationmysql.rds_start_replication,在 Amazon RDS 数据库实例上停止再重新开始复制过程。对于长时间运行的操作 (如创建大型索引),在两个 Amazon RDS 实例之间进行复制时可以这样做。在导入或导出数据库时,也需要停止再开始复制。有关更多信息,请参阅 将数据导入到 Amazon RDS MySQL 或 MariaDB 数据库实例中,同时减少停机时间使用复制导出 MySQL 数据

必须使用与删除数据库实例相同的机制显式地删除只读副本。如果只删除源数据库实例而不删除副本,则各个副本将提升为独立的单可用区数据库实例。

如果所提升的 MySQL 或 MariaDB 只读副本进而复制到其他只读副本,则这些只读副本仍有效。设想一个示例,其中 MyDBInstance1 复制到 MyDBInstance2,然后 MyDBInstance2 复制到 MyDBInstance3。如果提升 MyDBInstance2,则将不再从 MyDBInstance1 复制到 MyDBInstance2,但 MyDBInstance2 仍将复制到 MyDBInstance3。

如果手动停止或因复制错误停止复制连续 30 天以上,则 Amazon RDS 将终止主数据库实例和所有只读副本之间的复制,以阻止增大主数据库实例的存储需要和较长的故障转移时间。只读副本数据库实例仍可用,但无法恢复复制,因为在终止复制后,已从主数据库实例中删除只读副本所需的二进制日志。您可以为主数据库实例创建新的只读副本来重新建立复制

创建只读副本

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

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

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

准备使用 MyISAM 的 MySQL 数据库实例

如果 MySQL 数据库实例使用的是 MyISAM 等非事务性引擎,则将需要执行以下步骤才能成功地设置只读副本。需要执行这些步骤来确保只读副本具有数据的一致副本。如果您的所有表使用的都是事务性引擎 (如 InnoDB),则无需执行这些步骤。

  1. 停止源数据库实例中的非事务性表上的所有数据操作语言 (DML) 和数据定义语言 (DDL) 操作,然后等待它们完成。SELECT 语句可以继续运行。

  2. 刷新并锁定源数据库实例中的表。

  3. 使用以下各节中的某种方法创建只读副本。

  4. 使用 (例如) DescribeDBInstances API 操作检查只读副本创建的进度。有只读副本可用后,即解除对源数据库实例的表的锁定,然后继续进行正常的数据库操作。

AWS 管理控制台

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

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

  2. 在导航窗格中,选择 DB Instances

  3. Instances 窗格中,选择要用作只读副本源的 MySQL、MariaDB 或 PostgreSQL 数据库实例,然后从 Instance Actions 中选择 Create Read Replica

  4. 选择要使用的实例规格。这是为只读副本使用相同的数据库实例类和存储类型的最佳实践。

  5. 选择要使用的设置。对于 DB Instance Identifier,键入该只读副本的名称。根据需要,调整其他设置。

  6. 选择要使用的网络、安全性、数据库和维护设置。

  7. 选择 Create Read Replica

CLI

要从源 MySQL、MariaDB 或 PostgreSQL 数据库实例创建只读副本,请使用 AWS CLI 命令 create-db-instance-read-replica

针对 Linux、OS X 或 Unix:

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

对于 Windows:

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

API

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

Copy
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 或 PostgreSQL 只读副本提升到独立的单可用区数据库实例中。提升只读副本时,数据库实例将在重启后变得可用。

出于多种原因,您可能要将只读副本转换成单可用区数据库实例:

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

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

  • 执行故障恢复 – 如果源数据库实例出现故障,可以使用只读副本提升作为数据恢复方案;然而,如果您的使用案例需要同步复制、自动故障检测和故障转移,我们建议您将数据库实例转而当作多可用区部署运行。如果您了解异步复制的影响和限制,并且仍然要使用只读副本提升功能实现数据恢复,则您可能要首先创建一个只读副本,然后监控源数据库实例的故障情况。如果出现故障,请执行以下操作:

    1. 提升只读副本。

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

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

    您可以使用 Amazon Relational Database Service API Reference执行所有这些操作,并使用 Amazon Simple Workflow Service 开发人员指南实现此过程的自动化。

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

我们建议在提升只读副本之前禁用只读副本的自动备份。此方法可确保不会在提升过程中执行备份。实例提升为主实例之后,会基于备份设置执行备份。

以下步骤展示将只读副本提升为单可用区数据库实例的一般过程:

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

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

  3. 在 Amazon RDS 控制台中使用 Promote Read Replica 选项,使用 promote-read-replica AWS CLI 命令或 PromoteReadReplica Amazon RDS API 操作提升只读副本。

    注意

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

AWS 管理控制台

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

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

  2. 在 Amazon RDS 控制台中,选择 Read Replicas

  3. Read Replicas 窗格中,找到您要提升的只读副本,并选中它旁边的复选框。

  4. 选择 Promote Read Replica

  5. 提升只读副本对话框中,输入新提升的数据库实例的备份保留期和备份时段。

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

  7. 在确认页上,选择 Yes, Promote

CLI

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

针对 Linux、OS X 或 Unix:

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

对于 Windows:

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

API

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

Copy
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>

跨区域复制只读副本

借助 Amazon Relational Database Service (Amazon RDS),您可以在与源数据库实例不同的 AWS 区域中创建 MySQL、PostgreSQL 或 MariaDB 只读副本。您可创建只读副本以用于以下目的:

  • 完善灾难恢复功能。

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

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

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

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

注意

您也可以在不同的区域创建 Amazon Aurora 数据库群集的副本。有关更多信息,请参阅 跨 AWS 区域复制 Amazon Aurora 数据库群集

您可通过以下信息了解如何根据不同 AWS 区域中的源 MySQL、MariaDB 或 PostgreSQL 数据库实例创建只读副本。

AWS 管理控制台

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

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

  1. 登录 AWS 管理控制台,并打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 DB Instances

  3. Instances 窗口中,选择要用作只读副本源的 MySQL、MariaDB 或 PostgreSQL 数据库实例,然后从 Instance Actions 中选择 Create Read Replica。要创建加密的只读副本,必须对源数据库实例进行加密。要了解关于加密源数据库实例的更多信息,请参阅 加密 Amazon RDS 资源

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

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

    • 对于 DB Instance Identifier,键入该只读副本的名称。

    • Network & Security 部分中,选择 Designation RegionDesignation DB Subnet Group 的值。

    • 要在另一区域创建加密的只读副本,请选择Enable Encryption,然后选择Master Key。对于 Master Key,选择目标区域的 KMS 密钥标识符。

    • 选择要使用的其余的网络、安全性、数据库和维护设置。

  6. 选择 Create Read Replica

AWS CLI

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

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

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

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

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

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

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

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

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

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

针对 Linux、OS X 或 Unix:

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

对于 Windows:

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

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

针对 Linux、OS X 或 Unix:

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

对于 Windows:

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

API

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

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

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

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

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

Copy
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>

跨区域复制注意事项

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

  • 只有在使用 MariaDB、PostgreSQL (版本 9.4.7 和 9.5.2 及更高版本) 或 MySQL 5.6 及更高版本的 Amazon RDS 数据库实例时,才能在区域之间进行复制。

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

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

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

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

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

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

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

跨区域复制成本

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

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

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

对于 MySQL 和 MariaDB 实例,可以通过减少创建的跨区域只读副本的数量来降低数据传输费用。例如,如果您在一个区域有一个源数据库实例,并且希望在另一个区域创建三个只读副本,则只需从源数据库实例创建第一个只读副本,然后从该只读副本 (而不是源数据库实例) 创建另外两个只读副本。例如,如果您在一个区域有 source-instance-1,则可以执行以下操作:

  • 在新的区域创建 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 到另外两个副本的数据传输费用,因为它们位于同一区域。如果从 source-instance-1 直接创建所有三个副本,则需要为传输到所有三个副本的数据付费。

Amazon RDS 如何执行跨区域复制

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

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

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

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

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

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

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

    对于 MySQL、MariaDB 和 PostgreSQL 只读副本,您可以通过查看 Amazon RDS ReplicaLag 指标来监控 Amazon CloudWatch 中的复制滞后。对于 MySQL 和 MariaDB,ReplicaLag 指标报告 SHOW SLAVE STATUS 命令的 Seconds_Behind_Master 字段的值。对于 PostgreSQL,ReplicaLag 指标报告 SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS slave_lag 的值。

    MySQL 和 MariaDB 的复制滞后的常见原因如下所示:

    • 网络中断。

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

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

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

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

跨区域复制示例

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

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

针对 Linux、OS X 或 Unix:

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

对于 Windows:

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

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

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

针对 Linux、OS X 或 Unix:

Copy
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-cn:rds:us-east-1:123456789012:db:SimcoProd01

对于 Windows:

Copy
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-cn:rds:us-east-1:123456789012:db:SimcoProd01

监控只读复制

可通过多种方式监控只读副本的状态。Amazon RDS 控制台显示只读副本的状态;还可使用 AWS CLI describe-db-instances 命令或 Amazon RDS API DescribeDBInstances 操作查看只读副本的状态。

 只读副本状态

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

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

  • Error 复制出错。选中 Amazon RDS 控制台或者事件日志中的 Replication Error 字段,准确地确定出错误。有关复制错误故障诊断的详细信息,请参阅 解决 MySQL 或 MariaDB 只读副本问题

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

  • Terminated - 终止复制。如果复制连续终止超过三十天,不论是手动还是由于复制错误,将会出现这种情况。此时,Amazon RDS 终止主数据库实例与所有只读副本之间的复制,以防止增加主数据库实例上的存储需求以及长故障转移时间。

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

可通过查看 MySQL 或 MariaDB 命令返回的 Seconds_Behind_MasterShow Slave Status 数据,或 CloudWatch 副本滞后统计数据,来监控 MySQL 或 MariaDB 只读副本滞后源数据库实例多长时间。如果某个副本远远滞后于您所处的环境,则考虑删除并重新创建该只读副本。还要考虑扩大只读副本的规模以加快复制。

解决 MySQL 或 MariaDB 只读副本问题

MySQL 和 MariaDB 的复制技术是异步的。由于它们是异步的,因此源数据库实例上偶发的 BinLogDiskUsage 会增多,而只读副本上应有 ReplicaLag。例如,可并行向源数据库实例执行大量写入操作,同时使用一个 IO 线程将向只读副本执行的写入操作序列化,这会导致源实例与只读副本之间产生滞后。有关 MySQL 文档中只读副本的更多信息,请参阅复制实施详细信息。有关 MariaDB 文档中的只读副本的更多信息,请转到复制概述

可通过多种方式来减少对源数据库实例的更新与对只读副本的后续更新之间的滞后,例如:

  • 将只读副本的存储大小和数据库实例类调整到与源数据库实例类似。

  • 确保源数据库实例和只读副本使用的数据库参数组中的参数设置相兼容。有关更多信息和示例,请参阅本部分后面的有关 max_allowed_packet 参数的讨论。

Amazon RDS 监控只读副本的复制状态,如果复制因任何原因 (如在只读副本上运行的 DML 查询与在源数据库实例上作出的更新有冲突) 停止,则还会将只读副本实例的 Replication State 字段更新为 Error。您可通过查看 Replication Error 字段,检查 MySQL 或 MariaDB 引擎引发的关联错误的详细信息。还生成指示只读副本状态的事件,包括 RDS-EVENT-0045RDS-EVENT-0046RDS-EVENT-0047。有关这些事件和事件订阅的详细信息,请参阅 使用 Amazon RDS 事件通知。如果返回 MySQL 错误消息,则检查 MySQL 错误消息文档中的错误编号。如果返回 MariaDB 错误消息,则检查 MariaDB 错误消息文档中的错误。

一个可导致复制出错的常见问题是只读副本的 max_allowed_packet 参数的值小于源数据库实例的 max_allowed_packet 参数的值。max_allowed_packet 参数是可在数据库参数组中进行设置的自定义参数,用于指定可在数据库上执行的最大 DML 大小。如果与源数据库实例关联的数据库参数组中的 max_allowed_packet 参数值小于与源的只读副本关联的数据库参数组中的 max_allowed_packet 参数值,则复制过程会导致出现错误 (Packet bigger than 'max_allowed_packet' bytes) 并停止复制。可通过让源和只读副本使用 max_allowed_packet 参数值相同的数据库参数组来纠正该错误。

其他可导致复制错误的常见情况包括:

  • 对只读副本上的表进行写入操作。如果是在只读副本上创建索引,则需要将 read_only 参数设置为 0 才能创建索引。如果对只读副本上的表进行写入操作,则可能会中断复制。

  • 使用非事务性存储引擎,如 MyISAM。只读副本需要使用事务性存储引擎。只有 MySQL 上 InnoDB 存储引擎和 MariaDB 上的 XtraDB 存储引擎支持复制。

  • 使用不安全的不确定性查询,如 SYSDATE()。有关详细信息,请参阅 Determination of Safe and Unsafe Statements in Binary Logging (确定二进制日志记录中的安全和不安全语句)。

如果您确定可安全跳过错误,那么可以按照跳过当前的复制错误部分中描述的步骤操作。否则,可删除只读副本,然后使用相同的数据库实例标识符创建实例,以使终端节点保持与旧只读副本的终端节点相同。如果复制错误得到纠正,则 Replication State 将更改为 replicating

解决 PostgreSQL 只读副本问题

PostgreSQL 对跨区域复制使用复制槽,因此用于解决相同区域和跨区域的复制问题的过程是不同的。

解决区域中的 PostgreSQL 只读副本问题

PostgreSQL 参数 wal_keep_segments,该参数指示保留多少个提前写入日志 (WAL) 文件以便为只读副本提供数据。 该参数值指定要保留的日志的数量。如果将该参数值设置为一个太小的值,则可能导致只读副本在流式复制停止后大幅滞后。在此情况下,Amazon RDS 将通过重播源数据库实例的已存档 WAL 日志来报告复制错误并开始在只读副本上执行恢复操作。在只读副本赶上进度可继续流式复制之前,该恢复过程将继续。

PostgreSQL 只读副本日志将指明 Amazon RDS 何时通过重放已存档 WAL 文件恢复处于此状态的只读副本。

Copy
2014-11-07 19:01:10 UTC::@:[23180]:DEBUG:  switched WAL source from archive to stream after failure 2014-11-07 19:01:10 UTC::@:[11575]:LOG:  started streaming WAL from primary at 1A/D3000000 on timeline 1 2014-11-07 19:01:10 UTC::@:[11575]:FATAL:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000001A000000D3 has already been removed 2014-11-07 19:01:10 UTC::@:[23180]:DEBUG:  could not restore file "00000002.history" from archive: return code 0 2014-11-07 19:01:15 UTC::@:[23180]:DEBUG:  switched WAL source from stream to archive after failure recovering 000000010000001A000000D3 2014-11-07 19:01:16 UTC::@:[23180]:LOG:  restored log file "000000010000001A000000D3" from archive

在 Amazon RDS 重播副本上足够多的已存档 WAL 文件来赶上并允许只读副本再次开始流式处理后,PostgreSQL 将恢复流式处理并将与以下内容类似的行写入日志文件中:

Copy
2014-11-07 19:41:36 UTC::@:[24714]:LOG:  started streaming WAL from primary at 1B/B6000000 on timeline 1

可通过查看日志中的检查点信息来确定应保留的 WAL 文件的数量。PostgreSQL 日志在每个检查点显示以下信息。通过查看这些日志语句的“# recycled”事务日志文件,用户可了解在某个时间范围内将回收的事务文件的数目,并根据此信息来调整 wal_keep_segments 参数。

Copy
2014-11-07 19:59:35 UTC::@:[26820]:LOG:  checkpoint complete: wrote 376 buffers (0.2%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=35.681 s, sync=0.013 s, total=35.703 s; sync files=10, longest=0.013 s, average=0.001 s

例如,如果 PostgreSQL 日志显示 5 分钟内通过“checkpoint completed”日志语句回收了 35 个文件,则可了解到,在利用此使用模式的情况下,只读副本可在 5 分钟内依赖 35 个事务文件,如果将源数据库实例的 wal_keep_segments 参数值设置为默认值 32,则只读副本将无法在非流式处理状态下保留 5 分钟。

解决跨区域的 PostgreSQL 只读副本问题

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

如果数据库实例上的工作负载生成大量 WAL 数据,则您可能需要将源数据库实例和只读副本的数据库实例类更改为具有较高/10Gb 网络性能的数据库实例类以使副本保持同步。Amazon CloudWatch 指标 Transaction Logs Generation 可帮助您了解工作负载生成 WAL 数据的速率。

要确定跨区域只读副本的状态,您可以在源实例上查询 pg_replication_slots,如以下示例所示:

Copy
postgres=# select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | active | active_pid | xmin | catalog_xmin | restart_lsn _______________________________________________________________________________________________________________________________________________ rds_us_east_1_db_uzwlholddgpblksce6hgw4nkte | | physical | | | t | 12598 | | | 4E/95000060 (1 row)