使用 S3 Replication Time Control 满足合规性要求
S3 Replication Time Control(S3 RTC)可以帮助您满足数据复制的合规性要求或业务要求,并提供对 Amazon S3 复制时间的可见性。S3 RTC 会在几秒钟内复制您上传到 Amazon S3 的大多数对象,并在 15 分钟内复制 99.99% 的对象。
默认情况下,S3 RTC 包括两种跟踪复制进度的方法:
-
S3 复制指标 – 可以使用 S3 复制指标,来监控待复制的 S3 API 操作的总数、待复制的对象的总大小、到目标区域的最长复制时间以及复制失败的操作总数。然后,您可以监控单独复制的每个数据集。也可以独立于 S3 RTC 启用 S3 复制指标。有关更多信息,请参阅 使用 S3 复制指标。
启用了 S3 Replication Time Control(S3 RTC)的复制规则可发布 S3 复制指标。复制指标在启用 S3 RTC 之后的 15 分钟内可用。复制指标可通过 Amazon S3 控制台、Amazon S3 API、Amazon SDK、Amazon Command Line Interface(Amazon CLI)和 Amazon CloudWatch 提供。有关 CloudWatch 指标的更多信息,请参阅使用 Amazon CloudWatch 监控指标。有关通过 Amazon S3 控制台查看复制指标的更多信息,请参阅查看复制指标。
S3 复制指标的费率与 Amazon CloudWatch 自定义指标费率相同。有关信息,请参阅 Amazon CloudWatch 定价
。 -
Amazon S3 事件通知 – S3 RTC 提供
OperationMissedThreshold
和OperationReplicatedAfterThreshold
事件,如果对象复制超过 15 分钟阈值或在 15 分钟阈值后发生,这些事件会通知存储桶拥有者。借助 S3 RTC,当对象在 15 分钟内未复制(这种情况很罕见)以及当这些对象在 15 分钟阈值之后复制时,Amazon S3 事件通知可以通知您。复制事件在启用 S3 RTC 之后的 15 分钟内可用。Amazon S3 事件通知可通过 Amazon SQS、Amazon SNS 或 Amazon Lambda 提供。有关更多信息,请参阅 使用 Amazon S3 事件通知接收复制失败事件。
S3 RTC 的最佳实践和准则
在 Amazon S3 中在启用 S3 Replication Time Control(S3 RTC)的情况下复制数据时,请遵循这些最佳实践准则,来为您的工作负载优化复制性能。
Amazon S3 复制和请求速率性能准则
当从 Amazon S3 上传和检索存储时,您的应用程序可以实现每秒数千个事务的请求性能。例如,应用程序在 S3 存储桶中对于每个前缀每秒可实现至少 3500 个 PUT
/COPY
/POST
/DELETE
请求或 5500 个 GET
/HEAD
请求,包括 S3 复制代表您发出的请求。对存储桶中的前缀数量没有限制。您可以通过并行读取来增加读取或写入性能。例如,如果您在 S3 存储桶中创建 10 个前缀来并行处理读取,则可以将读取性能扩展到每秒 55000 个读取请求。
Amazon S3 根据高于这些准则的持续请求速率或与 LIST
请求并行的持续请求速率自动扩展。尽管 Amazon S3 在内部针对新的请求速率进行优化,但您可能暂时会收到 HTTP 503 请求响应,直至优化完成。随着每秒请求速率增大,或者当您首次启用 S3 RTC 时,可能会发生这种行为。在这些期间,您的复制延迟可能会增加。S3 RTC 服务等级协议 (SLA) 不适用于超出 Amazon S3 每秒请求性能准则的时间段。
在复制数据传输速率超过默认 1 千兆位/秒(Gbps)配额的时间段内,S3 RTC SLA 也不适用。如果您预计复制传输速率超过 1 Gbps,则可以联系 Amazon Web Services Support 中心
估算您的复制请求速率
总请求速率(包括 Amazon S3 复制代表您发出的请求)不得超出复制源存储桶和目标存储桶的 Amazon S3 请求速率准则。对于每个已复制的对象,Amazon S3 复制向源存储桶发出最多五个 GET
/HEAD
请求和一个 PUT
请求,并向每个目标存储桶发出一个 PUT
请求。
例如,如果您预期每秒复制 100 个对象,则 Amazon S3 复制可能会代表您执行额外 100 个 PUT
请求,每秒总计向源 S3 存储桶发出 200 个 PUT
请求。Amazon S3 复制也可能最多执行 500 个 GET
/HEAD
请求(每个已复制的对象有 5 个 GET
/HEAD
请求)。
注意
每个已复制的对象只会产生一个 PUT
请求的费用。有关更多信息,请参阅 Amazon S3 有关复制的常见问题
超过 S3 RTC 数据传输速率配额
如果您预期 S3 RTC 数据传输速率会超过默认的 1 Gbps 配额,请联系 Amazon Web Services Support 中心
Amazon KMS 加密对象复制请求速率
当您复制通过具有 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)来加密的对象时,每秒 Amazon KMS 请求配额适用。因为请求速率超过了每秒请求数的配额,所以 Amazon KMS 可能会拒绝其它有效的请求。如果请求受到限制,Amazon KMS 将返回 ThrottlingException
错误。Amazon KMS 请求速率配额适用于您直接发出的请求和 Amazon S3 复制代表您发出的请求。
例如,如果您预期每秒复制 1000 个对象,则可以从 Amazon KMS 请求速率配额中减去 2000 个请求。生成的每秒请求速率可用于除复制之外的 Amazon KMS 工作负载。您可以使用 Amazon CloudWatch 中的 Amazon KMS 请求指标来监控Amazon Web Services 账户的总 Amazon KMS 请求速率。
要申请增加每秒 Amazon KMS 请求配额,请联系 Amazon Web Services Support 中心
启用 S3 Replication Time Control
您可以基于新的或现有的复制规则开始使用 S3 Replication Time Control(S3 RTC)。可以选择将复制规则应用于整个存储桶,或应用于具有特定前缀或标签的对象。启用 S3 RTC 时,也会在复制规则上启用 S3 复制指标。
还可以使用 Amazon S3 控制台、Amazon S3 API、Amazon SDK 和 Amazon Command Line Interface(Amazon CLI)配置 S3 RTC。
主题
如需分步指导,请参阅 针对同一账户中的存储桶配置复制。本主题提供了在源存储桶和目标存储桶由相同和不同的 Amazon Web Services 账户拥有时,在复制配置中启用 S3 RTC 的说明。
要在启用 S3 RTC 的情况下使用 Amazon CLI 复制对象,您需要创建存储桶,对存储桶启用版本控制,创建一个 IAM 角色(该角色向 Amazon S3 赋予复制对象的权限),并将复制配置添加到源存储桶。复制配置必须启用了 S3 RTC,如以下示例所示。
有关使用 Amazon CLI 设置复制配置的分步说明,请参阅针对同一账户中的存储桶配置复制。
以下示例复制配置启用并设置复制规则的 ReplicationTime
和 EventThreshold
值。启用和设置这些值可以对规则启用 S3 RTC。
{ "Rules": [ { "Status": "Enabled", "Filter": { "Prefix": "
Tax
" }, "DeleteMarkerReplication": { "Status": "Disabled" }, "Destination": { "Bucket": "arn:aws:s3:::amzn-s3-demo-destination-bucket
", "Metrics": { "Status": "Enabled", "EventThreshold": { "Minutes": 15 } }, "ReplicationTime": { "Status": "Enabled", "Time": { "Minutes": 15 } } }, "Priority": 1 } ], "Role": "IAM-Role-ARN
" }
重要
Metrics:EventThreshold:Minutes
和 ReplicationTime:Time:Minutes
只能将 15
作为有效值。
以下 Java 示例在启用 S3 Replication Time Control(S3 RTC)的情况下添加复制配置。
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.model.DeleteMarkerReplication; import software.amazon.awssdk.services.s3.model.Destination; import software.amazon.awssdk.services.s3.model.Metrics; import software.amazon.awssdk.services.s3.model.MetricsStatus; import software.amazon.awssdk.services.s3.model.PutBucketReplicationRequest; import software.amazon.awssdk.services.s3.model.ReplicationConfiguration; import software.amazon.awssdk.services.s3.model.ReplicationRule; import software.amazon.awssdk.services.s3.model.ReplicationRuleFilter; import software.amazon.awssdk.services.s3.model.ReplicationTime; import software.amazon.awssdk.services.s3.model.ReplicationTimeStatus; import software.amazon.awssdk.services.s3.model.ReplicationTimeValue; public class Main { public static void main(String[] args) { S3Client s3 = S3Client.builder() .region(Region.US_EAST_1) .credentialsProvider(() -> AwsBasicCredentials.create( "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY") ) .build(); ReplicationConfiguration replicationConfig = ReplicationConfiguration .builder() .rules( ReplicationRule .builder() .status("Enabled") .priority(1) .deleteMarkerReplication( DeleteMarkerReplication .builder() .status("Disabled") .build() ) .destination( Destination .builder() .bucket("destination_bucket_arn") .replicationTime( ReplicationTime.builder().time( ReplicationTimeValue.builder().minutes(15).build() ).status( ReplicationTimeStatus.ENABLED ).build() ) .metrics( Metrics.builder().eventThreshold( ReplicationTimeValue.builder().minutes(15).build() ).status( MetricsStatus.ENABLED ).build() ) .build() ) .filter( ReplicationRuleFilter .builder() .prefix("testtest") .build() ) .build()) .role("role_arn") .build(); // Put replication configuration PutBucketReplicationRequest putBucketReplicationRequest = PutBucketReplicationRequest .builder() .bucket("source_bucket") .replicationConfiguration(replicationConfig) .build(); s3.putBucketReplication(putBucketReplicationRequest); } }