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

在不同的 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 区域中的源 MariaDB、MySQL、Oracle 或 PostgreSQL 数据库实例创建只读副本。

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

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

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

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

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

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

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

  6. 选择目标区域

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

  8. 在其他 AWS 区域中创建加密只读副本:

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

    2. 对于 Master key (主密钥),请选择目标 AWS 区域的客户主密钥 (CMK) 的 AWS Key Management Service (AWS KMS) 密钥标识符。

    注意

    要创建加密的只读副本,必须对源数据库实例进行加密。要了解关于加密源数据库实例的更多信息,请参阅 加密 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 中创建的资源。

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

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

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

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

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

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

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

例 跨区域只读副本

以下代码从 美国东部(弗吉尼亚北部) 区域中的源数据库实例,在 美国西部(俄勒冈) 区域中创建只读副本。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier myreadreplica \ --region us-west-2 \ --source-db-instance-identifier arn:aws-cn: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-cn:rds:us-east-1:123456789012:db:mydbinstance

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

  • --source-region – 源数据库实例的 AWS 区域。

    如果未指定 --source-region,则必须指定 --pre-signed-url 值。预签名 URL 包含签名版本 4 签名的请求,该请求用于在源 AWS 区域中调用 CreateDBInstanceReadReplica 操作。有关预签名 URL 的更多信息,请参阅 CreateDBInstanceReadReplica

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

例 加密的跨区域只读副本

以下代码从 美国东部(弗吉尼亚北部) 区域中的源数据库实例,在 美国西部(俄勒冈) 区域中创建加密的只读副本。

对于 Linux、macOS 或 Unix:

aws rds create-db-instance-read-replica \ --db-instance-identifier myreadreplica \ --region us-west-2 \ --source-db-instance-identifier arn:aws-cn:rds:us-east-1:123456789012:db:mydbinstance \ --source-region us-east-1 \ --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-cn:rds:us-east-1:123456789012:db:mydbinstance ^ --source-region us-east-1 ^ --kms-key-id my-us-west-2-key

要从不同 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

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

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

有关 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%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=arn:aws: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 区域中设置指定的只读副本,并将状态设置为正在创建

  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。

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

跨区域复制注意事项

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

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

    • MariaDB(所有版本)。

    • MySQL 版本 5.6 及更高版本。

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

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

    • PostgreSQL(所有版本)。

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

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

  • 您可以在 AWS GovCloud(美国东部) 和 AWS GovCloud (US-West) 区域之间进行复制,但无法复制到 AWS GovCloud (US) 中或从其中复制。

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

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

  • 您可以创建具有以下特征的跨区域只读副本:

    • 在位于另一个 AWS 区域中的 VPC 中的源数据库实例中的 VPC 中

    • 在不在 VPC 中的源数据库实例中的 VPC 中

    • 不在位于 VPC 中的源数据库实例中的 VPC 中

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

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

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

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

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

请求跨区域只读副本

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

请求者的 IAM 策略中的某些条件可能会导致请求失败。以下示例假定源数据库实例位于美国东部(俄亥俄州),只读副本在美国东部(弗吉尼亚北部)中创建。这些示例显示了请求者的 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-cn:rds:us-east-1:123456789012:db:myreadreplica" ...

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

    ... "Effect": "Allow", "Action": "rds:CreateDBInstanceReadReplica", "Resource": [ "arn:aws-cn:rds:us-east-1:123456789012:db:myreadreplica", "arn:aws-cn: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:SourceVpceaws:CalledVia,如下所示:

... "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 区域中有效。在 AWS STS 中使用来自 assumeRole API 操作的凭证时, 如果源区域是选择加入区域,请使用区域终端节点。否则,请求将失败。发生这种情况的原因是,您的凭证必须在两个区域都有效,而在使用区域 AWS STS 终端节点时,仅选择加入区域有效。

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

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

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

跨区域复制成本

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

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

  • 对于源数据库中做出的每个数据修改,Amazon RDS 都会将数据从源 AWS 区域传输到只读副本 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 直接创建所有三个副本,则需要为传输到所有三个副本的数据付费。