跨区域复制(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。详情请参见跨区域复制结合服务器端加密

  • 配置事件通知以及实时日志查询
    您可以通过以下两种方式准确获取跨区域复制过程中源Bucket以及目标Bucket内Object的新增、更新、删除、覆盖等变化情况。
    • 在设置事件通知规则中将事件类型配置为ObjectReplication:ObjectCreatedObjectReplication:ObjectRemoved以及ObjectReplication:ObjectModified。详情请参见事件通知概述
    • 在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。1

    如果您的业务场景涉及更大数量的复制规则,请联系技术支持

  • 操作限制
    • 仅允许对同时处于非版本化或开启版本控制状态的两个Bucket开启跨区域复制。
    • 处于复制状态下的两个Bucket不允许改变其版本控制状态。
    • 对于处于复制状态的两个Bucket,由于您可以同时操作这两个Bucket,源Bucket复制过去的Object可能存在覆盖目标Bucket中同名Object的风险。
    • 源Bucket中的数据可以复制到多个目标Bucket。单个Bucket关联的复制规则数量不能超过100条。这些规则中,该Bucket既可以作为源Bucket,也可以作为目标Bucket。如果您的业务场景涉及更大数量的复制规则,请联系技术支持
    • 不支持将源Bucket中冷归档存储类型Object复制到目标Bucket。
    • 不支持将源Bucket中Appendable类型的Object复制到冷归档存储类型的目标Bucket。

使用OSS控制台

  1. 登录OSS管理控制台
  2. 单击Bucket列表,然后单击任意待开启跨区域复制的Bucket。
  3. 在左侧导航栏,选择数据管理 > 跨区域复制
  4. 跨区域复制页签,单击跨区域复制
  5. 跨区域复制面板,按以下说明配置各项参数。
    区域 参数 说明
    设置目标Bucket 源Bucket地域 显示您当前Bucket所在地域。
    源Bucket 显示您当前Bucket名称。
    目标地域 选择目标Bucket所在地域。
    目标Bucket 选择开启数据复制的目标Bucket。
    设置复制策略 数据复制对象 选择需要复制的源数据。
    • 全部文件进行同步:将该Bucket内所有的Object复制到目标存储空间。
    • 指定文件名前缀进行同步:将该Bucket内指定前缀的Object复制到目标Bucket。最多可以添加10个前缀。
    Object标签 复制拥有指定标签的Object到目标Bucket。设置方法为选中设置规则后添加标签(键-值对),最多可添加10个标签。

    要设置该参数,必须满足以下条件:

    • 已设置Object标签。具体操作,请参见设置对象标签
    • 源Bucket和目标Bucket均已开启版本控制。
    • 数据复制策略为增/改 同步
    • 源地域为华东1(杭州),目标地域为除华东1(杭州)以外的任何一个地域;或者源地域为澳大利亚(悉尼),目标地域为除中国内地和澳大利亚(悉尼)以外的任何一个地域。
    数据复制策略 选择数据复制的方式。
    • 增/改 同步:将该Bucket内Object新增和更新操作复制到目标Bucket。
    • 增/删/改 同步:将该Bucket内Object的新增、更新、删除操作复制到目标Bucket。

    如果某个Object是通过分片上传的方式上传至源Bucket,则每个分片的上传操作都会复制至目标Bucket。最终,对所有分片执行CompleteMultipartUpload后生成的Object,也会被复制到目标Bucket。

    有关跨区域复制结合版本控制的复制行为说明,请参见跨区域复制结合版本控制

    复制历史数据 选择是否复制跨区域复制规则生效前源Bucket中已有的历史数据。
    • 复制:将历史数据复制至目标Bucket。
      重要 复制历史数据时,从源Bucket复制的Object可能会覆盖目标Bucket中同名的Object。为避免这部分文件丢失,建议您对源Bucket和目标Bucket开启版本控制。
    • 不复制:仅复制跨区域复制规则生效后上传或更新的Object。
    KMS加密目标对象复制 在源Object或者目标Bucket使用了KMS托管密钥加密方式(即SSE-KMS,指定CMK ID)的情况下,要将Object复制到目标Bucket,则必须选中复制,并配置以下参数:
    • 使用的KMS密钥:为目标Object指定加密的KMS密钥。

      您需要提前在KMS平台创建一个与目标Bucket相同地域的KMS密钥。具体操作,请参见创建密钥

    • 授权角色:授权一个RAM角色对目标Object执行KMS加密操作。
      • 新建角色:新建RAM角色对目标Object执行KMS加密,角色名称格式为kms-replication-源Bucket名称-目标Bucket名称
      • AliyunOSSRole:使用AliyunOSSRole角色对目标Object执行KMS加密。若您之前未创建AliyunOSSRole角色,当您选择此项时,OSS将自动创建AliyunOSSRole角色。
    说明
    设置复制加速 加速类型 加速类型仅支持传输加速。传输加速可用于提升在中国内地与非中国内地之间跨区域复制时的传输速度。开启传输加速功能,OSS还会额外收取传输加速费用。计费方式,请参见传输加速费用
    数据复制时间控制(RTC) 开启RTC后,OSS会在几秒内复制您上传到OSS的大多数Object,并在10分钟内复制99.99%的Object。关于RTC的更多信息,请参见使用数据复制时间控制(RTC)。开启RTC,将收取额外费用。更多信息,请参见跨区域复制RTC费用
  6. 单击确定
    • 当跨区域复制规则创建完成后,不允许对此规则进行编辑或删除。
    • 复制任务会在跨区域复制规则配置完成的3~5分钟后启动。您可以在源Bucket管理页面选择冗余与容错 > 跨区域复制查看复制进度。
    • 由于Bucket间的跨区域复制采用异步(近实时)复制,数据复制到目标Bucket需要的时间取决于数据的大小,通常几分钟到几小时不等。

使用阿里云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的存储容量以及跨区域复制流入和流出流量的具体步骤,请参见用量查询