跨区域复制(Cross-Region Replication)是跨不同OSS数据中心(地域)的存储空间(Bucket)自动、异步(近实时)复制文件(Object),它会将Object的创建、更新和删除等操作从源存储空间复制到不同区域的目标存储空间。
使用场景
跨区域复制功能满足Bucket跨区域容灾或用户数据复制的需求。目标Bucket中的Object是源Bucket中Object的精确副本,它们具有相同的Object名、版本信息、元数据以及内容,例如创建时间、拥有者、用户定义的元数据、Object ACL、Object内容等。您可以通过配置跨区域复制规则实现以下场景需求。
- 合规性要求
虽然OSS默认对每个存储的Object在物理盘上有多份副本,但合规性要求所规定的数据需要跨一定距离保存一份副本。通过跨区域复制,可以在远距离的OSS数据中心之间复制数据以满足这些合规性要求。
- 最大限度减少延迟
客户处于两个地理位置。为了最大限度缩短访问Object时的延迟,可以在地理位置与用户较近的OSS数据中心维护Object副本。
- 数据备份与容灾
您对数据的安全性和可用性有极高的要求,对所有写入的数据,都希望在另一个数据中心显式地维护一份副本,以备发生特大灾难(如地震、海啸等)导致一个OSS数据中心损毁时,还能启用另一个OSS数据中心的备份数据。
- 数据迁移
由于业务原因,需要将数据从OSS的一个数据中心迁移到另一个数据中心。
- 操作原因
您在两个不同数据中心中拥有分析同一组Object的计算集群。您可以选择在两个不同区域中维护Object副本。
功能特性
跨区域复制支持特性如下:
- 数据复制时间控制RTC
开启RTC后,OSS会在几秒内复制您上传到OSS的大多数Object,并在10分钟内复制99.99%的Object。此外,RTC功能还提供数据复制的实时监控,方便您查看复制任务的各项指标。
- 准实时复制数据
对于数据的新增、删除、修改等操作能够准实时复制到目标Bucket,并保证两端数据的最终一致。
- 历史数据迁移
迁移历史数据,让源Bucket中历史数据也能进行复制,形成相同的两份数据。
- 获取复制进度
能够针对复制数据展示最近复制的时间节点,针对历史数据的迁移展示迁移的百分比。
- 版本控制
对同时处于开启版本控制状态的源Bucket和目标Bucket,保证其数据版本的最终一致性。如果数据复制方式为写(增、改)同步,则源Bucket指定版本删除的操作不会复制到目标Bucket,源Bucket创建的删除标记会复制到目标Bucket。
- 传输加速
支持通过传输加速功能提高中国内地各地域与非中国内地各地域之间进行跨区域复制时的数据传输速度。传输加速功能详情请参见传输加速。
- 复制加密数据
支持复制未加密的Object和使用SSE-KMS、SSE-OSS方式进行服务器端加密的Object。详情请参见跨区域复制结合服务器端加密。
- 配置事件通知以及实时日志查询
注意事项
- 相关费用
- 进行跨区域复制时,OSS会根据复制文件产生的流量收取跨区域复制流量费用。计费方式,请参见跨区域复制流量费用。
- 每复制1个Object,OSS会计算请求次数并收取请求费用。计费方式,请参见请求费用。
- 如果开启传输加速功能,会额外产生传输加速费用。计费方式,请参见传输加速费用。
- 如果开启数据复制时间控制RTC,会额外产生跨区域复制RTC费用。计费方式,请参见跨区域复制RTC费用。
- 复制时间
跨区域复制采用异步(近实时)复制,数据复制到目标Bucket需要一定的时间,通常几分钟到几小时不等,取决于数据的大小。
使用限制
- 地域限制
- 华东1(杭州)、华东2(上海)、华东5(南京-本地地域)、华东6(福州-本地地域)、华北1(青岛)、华北2(北京)、华北 3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国香港、美国(硅谷)、美国(弗吉尼亚)、日本(东京)、新加坡、澳大利亚(悉尼)、马来西亚(吉隆坡)、印度尼西亚(雅加达)、菲律宾(马尼拉)、印度(孟买)、德国(法兰克福)、英国(伦敦)、阿联酋(迪拜)地域支持设置跨区域复制。
- 中国内地各地域与非中国内地各地域之间进行跨区域复制时,必须开启传输加速功能。
- 目前仅在以下地域进行跨区域复制时支持设置标签规则:
- 源地域为华东1(杭州),目标地域为除华东1(杭州)以外的任意地域。
- 源地域为澳大利亚(悉尼),目标地域为除中国内地和澳大利亚(悉尼)以外的任意地域。
- 规则数量
源Bucket中的数据可以复制到多个目标Bucket。单个Bucket关联的复制规则数量不能超过100条。这些规则中,该Bucket既可以作为源Bucket,也可以作为目标Bucket。
如果您的业务场景涉及更大数量的复制规则,请联系技术支持。
- 操作限制
- 仅允许对同时处于非版本化或开启版本控制状态的两个Bucket开启跨区域复制。
- 处于复制状态下的两个Bucket不允许改变其版本控制状态。
- 对于处于复制状态的两个Bucket,由于您可以同时操作这两个Bucket,源Bucket复制过去的Object可能存在覆盖目标Bucket中同名Object的风险。
- 源Bucket中的数据可以复制到多个目标Bucket。单个Bucket关联的复制规则数量不能超过100条。这些规则中,该Bucket既可以作为源Bucket,也可以作为目标Bucket。如果您的业务场景涉及更大数量的复制规则,请联系技术支持。
- 不支持将源Bucket中冷归档存储类型Object复制到目标Bucket。
- 不支持将源Bucket中Appendable类型的Object复制到冷归档存储类型的目标Bucket。
使用OSS控制台
使用阿里云SDK
以下仅列举常见SDK的开启跨区域复制示例。关于其他SDK的开启跨区域复制示例,请参见SDK简介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.AddBucketReplicationRequest;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 指定数据要复制到的目标Bucket。
String targetBucketName = "yourTargetBucketName";
// 指定目标Bucket对应的Region ID。例如oss-cn-beijing。
String targetBucketLocation = "oss-cn-beijing";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
AddBucketReplicationRequest request = new AddBucketReplicationRequest(bucketName);
request.setTargetBucketName(targetBucketName);
request.setTargetBucketLocation(targetBucketLocation);
// 默认复制历史数据。此处设置为false,表示禁止复制历史数据。
request.setEnableHistoricalObjectReplication(false);
// 指定授权OSS进行数据复制的角色名称。如果指定使用SSE-KMS加密目标对象,则必须指定该元素。
//request.setSyncRole("yourRole");
// 指定OSS是否复制通过SSE-KMS加密创建的对象。
//request.setSseKmsEncryptedObjectsStatus("Enabled");
// 指定SSE-KMS密钥ID。如果指定Status为Enabled,则必须指定该元素。
//request.setReplicaKmsKeyID("3542abdd-5821-4fb5-a425-90adca***");
//List prefixes = new ArrayList();
//prefixes.add("image/");
//prefixes.add("video");
//prefixes.add("a");
//prefixes.add("A");
// 指定待复制Object的前缀Prefix。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。
//request.setObjectPrefixList(prefixes);
//List actions = new ArrayList();
//actions.add(AddBucketReplicationRequest.ReplicationAction.ALL);
// 指定可以被复制到目标Bucket的操作。默认值为ALL,表示源Bucket的所有操作都会复制到目标Bucket。
//request.setReplicationActionList(actions);
ossClient.addBucketReplication(request);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
# -*- coding: utf-8 -*-
import oss2
from oss2.models import ReplicationRule
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# 填写源Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。关于其他Region对应的Endpoint信息,请参见访问域名和数据中心。
# 填写源Bucket名称,例如srcexamplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'srcexamplebucket')
replica_config = ReplicationRule(
# 指定数据要复制到的目标Bucket。
target_bucket_name='destexamplebucket',
# 指定目标Bucket所在的Region。
target_bucket_location='oss-cn-beijing'
)
# 指定待复制Object的前缀Prefix。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。
# prefix_list = ['prefix1', 'prefix2']
# 设置跨区域复制规则。
# replica_config = ReplicationRule(
# prefix_list=prefix_list,
# 指定可以被复制到目标Bucket的操作。默认值为ALL,表示源Bucket的所有操作都会复制到目标Bucket。
# action_list=[ReplicationRule.ALL],
# 指定数据要复制到的目标Bucket。
# target_bucket_name='destexamplebucket1',
# 指定目标Bucket所在的Region。
# target_bucket_location='oss-cn-shanghai',
# 默认复制历史数据。此处设置为False,表示禁止复制历史数据。
# is_enable_historical_object_replication=False,
# 指定数据复制时使用的数据传输链路。
# target_transfer_type='oss_acc',
# 授权OSS使用哪个角色来进行数据复制。如果指定使用SSE-KMS加密目标对象,则必须指定该元素。
# sync_role_name='roleNameTest',
# 复制通过SSE-KMS加密创建的对象。
# sse_kms_encrypted_objects_status=ReplicationRule.ENABLED
# 指定SSE-KMS密钥ID。如果指定复制通过SSE-KMS加密创建的对象,则必须指定该元素。
# replica_kms_keyid='9468da86-3509-4f8d-a61e-6eab1eac****',
#)
# 开启跨区域复制。
bucket.put_bucket_replication(replica_config)
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 开启跨区域复制。
func main() {
// yourEndpoint填写源Bucket对应的Endpoint,以杭州为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
HandleError(err)
}
// 填写源Bucket名称。
srcbucketName := "srcexamplebucket"
// 指定仅复制规则创建后新写入的数据,不复制源Bucket的历史数据。
putXml := `<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration>
<Rule>
<PrefixSet>
<! --指定待复制Object的前缀prefix_1和prefix_2。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。-->
<! --如果您需要将源Bucket中的所有Object复制到目标Bucket,则无需设置Prefix。
<Prefix>prefix_1</Prefix>
<Prefix>prefix_2</Prefix>
</PrefixSet>
<! --指定可以被复制到目标Bucket的操作。默认值为ALL,表示源Bucket的所有操作都会复制到目标Bucket。-->
<Action>ALL</Action>
<Destination>
<! --指定数据要复制到的目标Bucket。-->
<Bucket>destexamplebucket</Bucket>
<! --指定目标Bucket所在的Region。-->
<Location>oss-cn-beijing</Location>
<! --指定数据复制时使用的数据传输链路。此处设置为oss_acc,表示使用了传输加速链路。-->
<TransferType>oss_acc</TransferType>
</Destination>
<! --默认复制历史数据。此处设置为disabled,表示禁止复制历史数据。-->
<HistoricalObjectReplication>disabled</HistoricalObjectReplication>
<! --指定授权OSS进行数据复制的角色名称。如果指定使用SSE-KMS加密目标对象,则必须指定该元素。-->
<SyncRole>aliyunramrole</SyncRole>
<SourceSelectionCriteria>
<SseKmsEncryptedObjects>
<! --指定OSS是否复制通过SSE-KMS加密创建的对象。-->
<Status>Enabled</Status>
</SseKmsEncryptedObjects>
</SourceSelectionCriteria>
<EncryptionConfiguration>
<! --指定SSE-KMS密钥ID。如果指定Status为Enabled,则必须指定该元素。-->
<ReplicaKmsKeyID>c4d49f85-ee30-426b-a5ed-95e9139d****</ReplicaKmsKeyID>
</EncryptionConfiguration>
</Rule>
</ReplicationConfiguration>`
err = client.PutBucketReplication(srcbucketName,putXml)
if err != nil {
HandleError(err)
}
}
使用命令行工具ossutil
关于使用ossutil开启跨区域复制的具体步骤,请参见replication(跨区域复制)。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketReplication。
常见问题
暂停版本控制状态下的Bucket是否支持跨区域复制?
不支持。仅允许对同时处于非版本化或开启版本控制状态的两个Bucket开启跨区域复制。
跨区域复制是否支持复制传递?
不支持。例如,Bucket A配置了复制到Bucket B的跨区域复制规则,Bucket B配置了复制到Bucket C的跨区域复制规则,则Bucket A的数据仅复制到Bucket B,不会复制到Bucket C。
如果要将Bucket A的数据复制到Bucket C,则您还需要为Bucket A配置复制到Bucket C的跨区域复制规则。
为什么历史数据复制进度长时间显示为0%?
历史数据复制进度并非实时更新,需要等待所有文件扫描完成后才会复制更新。如果您Bucket内的文件数量较多(例如达到上亿级别),则可能需要等待数小时才会更新历史数据复制进度。历史数据复制进度未更新,并不代表历史数据没有复制到目标Bucket。
您可以通过查看目标Bucket的存储容量以及跨区域复制流入和流出流量产生的变化,确认源Bucket内的历史数据是否已开始复制到目标Bucket。关于查看目标Bucket的存储容量以及跨区域复制流入和流出流量的具体步骤,请参见用量查询。