跨区域复制是在不同OSS地域之间自动、异步复制文件,将源存储空间中文件的改动(新建、覆盖、删除操作)同步到目标存储空间中。该功能用于满足异地容灾和数据复制的需求。

开启跨区域复制

以下代码用于开启跨区域复制:

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的历史数据,且此后将源Bucket执行的所有操作都将实时同步到目标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)
    }
}            

查看跨区域复制配置

以下代码用于查看跨区域复制配置:

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)
        os.Exit(-1)
    }

    // 填写源Bucket名称。
    srcbucketName := "yourSourceBucket"
    result,err := client.GetBucketReplication(srcbucketName)
    if err != nil {
        HandleError(err)
        os.Exit(-1)
    }
    fmt.Println(result)
}
            

查看跨区域复制进度

跨区域复制进度分为历史数据同步进度和实时数据同步进度。

  • 历史数据同步进度用百分比表示,仅对开启了历史数据同步的存储空间有效。
  • 实时数据同步进度用新写入数据的时间点表示,代表这个时间点之前的数据已同步完成。

以下代码用于查看跨区域复制进度:

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 := "yourSourceBucket"
    // 填写GetBucketReplication接口返回的跨区域复制规则ID。
    result,err := client.GetBucketReplicationProgress(srcbucketName,"e047ce28-6806-4131-b1da-30142116****")
    if err != nil {
        HandleError(err)
    }

    fmt.Println(result)
}

查看可同步的目标地域

以下代码用于查看源Bucket可同步到的目标地域列表:

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)

func HandleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}

// 查看源Bucket可同步到的目标地域。
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 := "yourSourceBucket"    
    result,err := client.GetBucketReplicationLocation(srcbucketName)
    if err != nil {
        HandleError(err)
    }

    fmt.Println(result)
}

            

关闭跨区域复制关系

以下代码用于关闭跨区域复制:

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 := "yourSourceBucket"
    // 填写GetBucketReplication接口返回的跨区域复制规则ID。
    err = client.DeleteBucketReplication(srcbucketName,"e047ce28-6806-4131-b1da-30142116****")
    if err != nil {
        HandleError(err)
    }
}

相关文档