在不同的 AWS 区域中创建只读副本
借助 Amazon RDS,您可以在与源数据库实例不同的 AWS 区域中创建只读副本。
您可在其他 AWS 区域创建只读副本,用于执行以下操作:
-
完善灾难恢复功能。
-
将读取操作扩展到与用户更接近的 AWS 区域。
-
使从一个 AWS 区域中的数据中心迁移到另一个 AWS 区域中的数据中心的操作变得更轻松。
在与源实例不同的 AWS 区域中创建只读副本与在同一 AWS 区域中创建副本非常相似。您可以使用 AWS Management Console、运行 create-db-instance-read-replica
命令或调用 CreateDBInstanceReadReplica
API 操作。
注意
要在与源数据库实例不同的 AWS 区域中创建一个加密的只读副本,源数据库实例必须加密。
区域和版本可用性
功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关跨区域复制的版本和区域可用性的更多信息,请参阅支持 Amazon RDS 中跨区域只读副本的区域和数据库引擎。
创建跨区域只读副本
以下过程演示如何根据不同 AWS 区域中的源 MariaDB、Microsoft SQL Server、MySQL、Oracle 或 PostgreSQL 数据库实例创建只读副本。
您可以使用 AWS Management Console 跨不同 AWS 区域创建只读副本。
使用控制台跨不同 AWS 区域创建只读副本
-
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择 Databases(数据库)。
-
选择要用作只读副本源的 MariaDB、Microsoft SQL Server、MySQL、Oracle 或 PostgreSQL 数据库实例。
-
对于 Actions (操作),选择 Create read replica (创建只读副本)。
-
对于数据库实例标识符,输入该只读副本的名称。
-
选择目标区域。
-
选择要使用的实例规格。我们建议您为只读副本使用相同或更大的数据库实例类和存储类型。
-
要在其他 AWS 区域中创建加密只读副本,请执行以下操作:
-
选择 Enable encryption(启用加密)。
-
对于 AWS KMS key,请选择目标 AWS 区域中的 KMS 密钥的 AWS KMS key 标识符。
注意
要创建加密的只读副本,必须对源数据库实例进行加密。要了解关于加密源数据库实例的更多信息,请参阅 加密 Amazon RDS 资源。
-
-
选择其他选项,例如存储自动扩展。
-
选择 Create read replica (创建只读副本)。
要从不同 AWS 区域中的源 MySQL、Microsoft SQL Server、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 资源名称(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
\ --regionus-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
^ --regionus-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
\ --regionus-west-2
\ --source-db-instance-identifier arn:aws:rds:us-east-1
:123456789012
:db:mydbinstance
\ --kms-key-idmy-us-west-2-key
对于 Windows:
aws rds create-db-instance-read-replica ^ --db-instance-identifier
myreadreplica
^ --regionus-west-2
^ --source-db-instance-identifier arn:aws:rds:us-east-1
:123456789012
:db:mydbinstance
^ --kms-key-idmy-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、Microsoft SQL Server、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 资源名称(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=®ion-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 区域和数据库中的数据量,此过程可能需要几个小时才能完成。在创建跨区域只读副本时,可使用此信息来确定过程进度:
-
Amazon RDS 开始将源数据库实例作为复制源配置,并将状态设置为 modifying。
-
Amazon RDS 开始在目标 AWS 区域中设置指定的只读副本,并将其状态设置为 creating(正在创建)。
-
Amazon RDS 在源 AWS 区域创建源数据库实例的自动数据库快照。数据库快照名称的格式为
rds:<InstanceID>-<timestamp>
,其中<InstanceID>
是源实例的标识符,<timestamp>
是复制开始的日期和时间。例如,rds:mysourceinstance-2013-11-14-09-24
是在mysourceinstance
从实例2013-11-14-09-24
创建的。在创建自动数据库快照期间,源数据库实例保持正在修改 状态,只读副本保持正在创建 状态,数据库快照处于正在创建 状态。控制台中数据库快照页面的进度栏可报告数据库快照创建进度。数据库快照创建完成后,数据库快照和源数据库实例的状态都将设置为 available (可用)。 -
Amazon RDS 开始为初始数据传输复制跨区域快照。快照复制在目标 AWS 区域作为自动快照列出,状态为 creating(正在创建)。其名称与源数据库快照相同。数据库快照的进度栏可显示复制进度。复制完成后,数据库快照的状态将被设置为 available (可用)。
-
Amazon RDS 随后使用对只读副本的初始数据加载的数据库快照副本。在此期间,只读副本位于目标区域的数据库实例列表中,状态为正在创建。加载完成后,只读副本的状态将设置为可用,数据库快照副本则被删除。
-
当只读副本为可用状态时,Amazon RDS 启动,并复制自创建只读副本操作启动以来对源实例所做的修改。在此期间,只读副本的复制滞后时间将大于 0。
有关使用复制滞后时间的信息,请参阅 监控只读复制。
跨区域复制注意事项
在一个 AWS 区域内执行复制需要注意的所有事项都适用于跨区域复制。在执行跨 AWS 区域复制时,还需要额外注意以下事项:
-
源数据库实例可在多个 AWS 区域具有跨区域只读副本。由于源 VPC 对访问控制列表(ACL)条目数有限制,因此 RDS 无法保证 5 个以上的跨区域只读副本数据库实例。
-
您可以在 GovCloud(美国东部)和 GovCloud(美国西部)区域之间进行复制,但无法复制到 GovCloud(美国)或从其中复制。
-
对于 Microsoft SQL Server、Oracle 和 PostgreSQL 数据库实例,您只能从未作为其他 Amazon RDS 数据库实例的只读副本的源 Amazon RDS 数据库实例创建跨区域的 Amazon RDS 只读副本。此限制不适用于 MariaDB 和 MySQL 数据库实例。
-
对于所在 AWS 区域与源实例不同的任何只读副本,其滞后时间将更长。产生此滞后时间是因为区域数据中心之间的网络通道更长。
-
对于跨区域只读副本,所有指定
--db-subnet-group-name
参数的只读副本创建命令必须从同一 VPC 指定数据库子网组。 -
大多数情况下,只读副本使用指定数据库引擎的默认数据库参数组和数据库选项组。
对于 MySQL 和 Oracle 数据库引擎,您可以在 AWS CLI 命令
create-db-instance-read-replica
的--db-parameter-group-name
选项中为只读副本指定自定义参数组。使用 AWS Management Console 时,无法指定自定义参数组。 -
只读副本使用默认安全组。
-
对于 MariaDB、Microsoft SQL Server、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:SourceVpc
或aws:SourceVpce
具有条件限制。这些请求可能会失败,因为 RDS 对远程区域进行调用时,它并非来自指定的 VPC 或 VPC 端点。
如果您需要使用可能导致请求失败的上述某个条件,则可以在策略中包含第二个带有 aws:CalledVia
的语句,以便请求成功。例如,您可以使用带有 aws:CalledVia
的 aws: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 端点时,仅选择加入区域有效。
要使用全局端点,请确保在操作中为两个区域都启用了该端点。在 AWS STS 账户设置中将全局端点设置为 Valid in all AWS 区域
。
同样的规则也适用于预签名 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-1
到 read-replica-1
的数据传输费用。您无需支付从 read-replica-1
到另外两个副本的数据传输费用,因为它们位于同一 AWS 区域。如果从 source-instance-1
直接创建所有三个副本,则需要为传输到所有三个副本的数据付费。