Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 MariaDB、MySQL 和 PostgreSQL 数据库实例的只读副本

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

注意

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

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

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

MariaDB、MySQL 和 PostgreSQL 引擎支持只读副本。此部分提供了在所有这三种引擎上使用只读副本的一般信息。有关在特定引擎上使用只读副本的信息,请参阅以下部分:

Amazon RDS 只读副本概述

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

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

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

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

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

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

源数据库实例存储类型 源数据库实例存储分配 只读副本存储类型选项
PIOPS 100 GiB–3 TiB PIOPS、GP2、标准
GP2 100 GiB–3 TiB PIOPS、GP2、标准
GP2 小于 100 GiB GP2、标准
标准 100 GiB–3 TiB PIOPS、GP2、标准
标准 小于 100 GiB GP2、标准

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

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 版本允许并行复制线程。

创建只读副本

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

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

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

AWS 管理控制台

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

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

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

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

  4. 对于实例操作,请选择创建只读副本

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

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

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

  8. 选择创建只读副本

CLI

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

针对 Linux、OS X 或 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

API

要从源 MySQL、MariaDB 或 PostgreSQL 数据库实例创建只读副本,请调用 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 或 PostgreSQL 只读副本提升为独立的数据库实例。提升只读副本时,数据库实例将在重启后变得可用。

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

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

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

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

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

    1. 提升只读副本。

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

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

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

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

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

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

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

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

    注意

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

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

AWS 管理控制台

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

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

  2. 在 Amazon RDS 控制台中,选择实例

    此时将显示实例窗格。每个只读副本在复制角色列中显示副本

  3. 实例窗格中,选择要提升的只读副本。

  4. 选择实例操作,然后选择提升只读副本

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

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

  7. 在确认页面上,选择提升只读副本

CLI

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

针对 Linux、OS X 或 Unix:

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

对于 Windows:

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

API

要将只读副本提升为数据库实例,请调用 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 区域中创建 MySQL、PostgreSQL 或 MariaDB 只读副本。您可创建只读副本以用于以下目的:

  • 完善灾难恢复功能。

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

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

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

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

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

AWS 管理控制台

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

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

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

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

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

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

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

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

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

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

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

  6. 选择创建只读副本

CLI

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

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

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

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

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

  • --source-region — 创建加密只读副本的 AWS 区域。如果未指定 source-region,则必须指定 pre-signed-urlpre-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、OS X 或 Unix:

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:

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 命令的 AWS 区域是加密只读副本的目标 AWS 区域。

针对 Linux、OS X 或 Unix:

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:

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 区域中创建加密只读副本,可以在 AWS 目标区域使用 Amazon RDS APICreateDBInstanceReadReplica 操作。若要在另一个 AWS 区域中创建加密的只读副本,必须指定 PreSignedURL 的值。PreSignedURL 应包含对 CreateDBInstanceReadReplica 操作的请求,以便调用创建只读副本的源 AWS 区域。要了解有关 PreSignedUrl 的更多信息,请参阅CreateDBInstanceReadReplica

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

arn:aws-cn: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 区域内执行复制需要注意的事项都适用于跨区域复制。在执行跨区域复制时,还需要额外注意以下事项:

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

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

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

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

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

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

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

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

跨区域复制成本

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

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

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

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

  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 随后使用在只读副本上加载的初始数据的数据库快照副本。在此期间,只读副本位于目标区域的数据库实例列表中,状态为 creating。加载完成后,只读副本的状态将设置为可用,数据库快照副本则被删除。

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

    对于 MySQL、MariaDB 和 PostgreSQL 只读副本,您可以通过查看 Amazon RDS ReplicaLag 指标来监控 Amazon CloudWatch 中的复制滞后。对于 MySQL 和 MariaDB,ReplicaLag 指标报告 Seconds_Behind_Master 命令的 SHOW SLAVE STATUS 字段的值。对于 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:

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:

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:

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:

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 控制台在只读副本详细信息的可用性与持久性部分中显示只读副本的状态。要查看只读副本的详细信息,请在 Amazon RDS 控制台的实例列表中单击该只读副本的名称。


                只读副本状态

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

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

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

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

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

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

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

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

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