文档

Go数据复制

更新时间:

数据复制是以异步(近实时)方式将源Bucket中的文件(Object)以及对Object的创建、更新和删除等操作自动复制到目标Bucket。OSS支持跨区域复制(Cross-Region Replication)和同区域复制(Same-Region Replication)。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 阿里云账号默认拥有数据复制的相关权限。如果您希望通过RAM用户或者STS的方式执行数据复制相关操作,例如:

    • 开启数据复制,您必须拥有oss:PutBucketReplication权限。

    • 开启或关闭数据复制时间控制(RTC)功能,您必须拥有oss:PutBucketRtc权限。

    • 查看数据复制规则,您必须拥有oss:GetBucketReplication权限。

    • 查看可复制的目标地域,您必须拥有oss:GetBucketReplicationLocation权限。

    • 查看数据复制进度,您必须拥有oss:GetBucketReplicationProgress权限。

    • 关闭数据复制,您必须拥有oss:DeleteBucketReplication权限

开启数据复制

重要

开启数据复制前,请确保源存储空间与目标存储空间同时处于非版本化或已启用版本控制状态。

以下代码用于开启数据复制,将华东1(杭州)地域下的srcexamplebucket中的数据复制到相同或不同地域下的destexamplebucket。

package main

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

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

// 开启数据复制。
func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 指定源Bucket名称。
	srcbucketName := "srcexamplebucket"
	// 指定数据要复制到的目标Bucket。
	destBucketName := "destexamplebucket"
	// 指定待复制Object的前缀prefix_1和prefix_2。指定Prefix后,只有匹配该Prefix的Object才会复制到目标Bucket。
	// 如果您需要将源Bucket中的所有Object复制到目标Bucket,则无需设置Prefix。
	prefix1 := "prefix_1"
	prefix2 := "prefix_2"
	// 指定SSE-KMS密钥ID。如果指定Status为Enabled,则必须指定该元素。
	keyId := "c4d49f85-ee30-426b-a5ed-95e9139d"
	// 指定OSS是否复制通过SSE-KMS加密创建的对象。
	source := "Enabled"
	prefixSet := oss.ReplicationRulePrefix{Prefix: []*string{&prefix1, &prefix2}}
	// 在配置跨区域复制规则时,开启数据复制时间控制(RTC)功能。
	enabled := "enabled"
	reqReplication := oss.PutBucketReplication{
		Rule: []oss.ReplicationRule{
			{
				PrefixSet: &prefixSet,
				//指定可以被复制到目标Bucket的操作。默认值为ALL,表示源Bucket的所有操作都会复制到目标Bucket。
				Action: "ALL",
				RTC:    &enabled,
				Destination: &oss.ReplicationRuleDestination{
					Bucket: destBucketName,
					// 指定目标Bucket所在的Region。
					// 如果您希望开启跨区域复制,则源Bucket与目标Bucket必须处于不同的地域。如果您希望开启同地域复制,则源Bucket与目标Bucket必须处于相同的地域。
					Location: "oss-cn-hangzhou",
					// 指定数据复制时使用的数据传输链路。此处设置为oss_acc,表示使用了传输加速链路。
					TransferType: "oss_acc",
				},
				// 默认复制历史数据。此处设置为disabled,表示禁止复制历史数据。
				HistoricalObjectReplication: "disabled",
				SyncRole:                    "aliyunramrole",
				EncryptionConfiguration:     &keyId,
				SourceSelectionCriteria:     &source,
			},
		},
	}

	xmlBody, err := xml.Marshal(reqReplication)
	if err != nil {
		HandleError(err)
	}
	err = client.PutBucketReplication(srcbucketName, string(xmlBody))

	if err != nil {
		HandleError(err)
	}

	fmt.Println("Put Bucket Replication Success!")
}

查看数据复制规则

以下代码用于查看examplebucket的数据复制规则。

package main

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

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

// 查看数据复制配置。
func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 填写源Bucket名称。
	bucketName := "srcexamplebucket"
	stringData, err := client.GetBucketReplication(bucketName)
	if err != nil {
		HandleError(err)
	}
	var repResult oss.GetBucketReplicationResult
	err = xml.Unmarshal([]byte(stringData), &repResult)
	if err != nil {
		HandleError(err)
	}
	for _, rule := range repResult.Rule {
		fmt.Printf("Rule Id:%s\n", rule.ID)
		if rule.RTC != nil {
			fmt.Printf("Rule RTC:%s\n", *rule.RTC)
		}
		if rule.PrefixSet != nil {
			for _, prefix := range rule.PrefixSet.Prefix {
				fmt.Printf("Rule Prefix:%s\n", *prefix)
			}
		}
		fmt.Printf("Rule Action:%s\n", rule.Action)
		fmt.Printf("Rule Destination Bucket:%s\n", rule.Destination.Bucket)
		fmt.Printf("Rule Destination Location:%s\n", rule.Destination.Location)
		fmt.Printf("Rule Destination TransferType:%s\n", rule.Destination.TransferType)
		fmt.Printf("Rule Status:%s\n", rule.Status)
		fmt.Printf("Rule Historical Object Replication:%s\n", rule.HistoricalObjectReplication)
		if rule.SyncRole != "" {
			fmt.Printf("Rule SyncRole:%s\n", rule.SyncRole)
		}
	}
}

设置RTC

以下代码用于为已有的跨区域复制规则开启或关闭数据复制时间控制(RTC)功能。

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() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 填写源Bucket名称。
	bucketName := "srcexamplebucket"
	// 开启RTC。如需关闭RTC,您需要将取值enabled替换为disabled。
	enabled := "enabled"
	// 填写跨区域复制规则ID。
	id := "564df6de-7372-46dc-b4eb-10f****"
	rtc := oss.PutBucketRTC{
		RTC: &enabled,
		ID:  id,
	}
	err = client.PutBucketRTC(bucketName, rtc)
	if err != nil {
		HandleError(err)
	}

	fmt.Println("Put Bucket RTC Success!")
}

查看可复制的目标地域

以下代码用于查看examplebucket的数据可复制的目标地域列表。

package main

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

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

func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 填写源Bucket名称。
	bucketName := "srcexamplebucket"
	// 查看源Bucket可复制到的目标地域。
	stringData, err := client.GetBucketReplicationLocation(bucketName)
	if err != nil {
		HandleError(err)
	}
	var repLocation oss.GetBucketReplicationLocationResult
	err = xml.Unmarshal([]byte(stringData), &repLocation)
	if err != nil {
		HandleError(err)
	}

	for _, location := range repLocation.Location {
		fmt.Printf("Bucket Replication Location: %s\n", location)
	}

	for _, transferType := range repLocation.LocationTransferType {
		fmt.Printf("Bucket Replication Location Transfer Type Location: %s\n", transferType.Location)
		fmt.Printf("Bucket Replication Location Transfer Type Type: %s\n", transferType.TransferTypes)
	}

	for _, rtcLocation := range repLocation.RTCLocation {
		fmt.Printf("Bucket Replication Location RTC Location: %s\n", rtcLocation)
	}
	fmt.Println("Get Bucket Replication Location Success!")
}

查看数据复制进度

数据复制进度分为历史数据复制进度和新写入数据复制进度。

  • 历史数据复制进度用百分比表示,仅对开启了历史数据复制的存储空间有效。

  • 新写入数据复制进度用新写入数据的时间点表示,代表这个时间点之前的数据已复制完成。

以下代码用于查看examplebucket中指定规则ID的数据复制进度。

package main

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

func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 填写源Bucket名称。
	bucketName := "srcexamplebucket"
	ruleId := "564df6de-7372-46dc-b4eb-10f****"
	// 查看数据复制进度。
	stringData, err := client.GetBucketReplicationProgress(bucketName, ruleId)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	var repProgress oss.GetBucketReplicationProgressResult
	err = xml.Unmarshal([]byte(stringData), &repProgress)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	for _, repProgressRule := range repProgress.Rule {
		fmt.Printf("Rule Id:%s\n", repProgressRule.ID)
		if repProgressRule.PrefixSet != nil {
			for _, prefix := range repProgressRule.PrefixSet.Prefix {
				fmt.Printf("Rule Prefix:%s\n", *prefix)
			}
		}
		fmt.Printf("Replication Progress Rule Action:%s\n", repProgressRule.Action)
		fmt.Printf("Replication Progress Rule Destination Bucket:%s\n", repProgressRule.Destination.Bucket)
		fmt.Printf("Replication Progress Rule Destination Location:%s\n", repProgressRule.Destination.Location)
		fmt.Printf("Replication Progress Rule Destination TransferType:%s\n", repProgressRule.Destination.TransferType)
		fmt.Printf("Replication Progress Rule Status:%s\n", repProgressRule.Status)
		fmt.Printf("Replication Progress Rule Historical Object Replication:%s\n", repProgressRule.HistoricalObjectReplication)
		if (*repProgressRule.Progress).HistoricalObject != "" {
			fmt.Printf("Replication Progress Rule Progress Historical Object:%s\n", (*repProgressRule.Progress).HistoricalObject)
		}
		fmt.Printf("Replication Progress Rule Progress NewObject:%s\n", (*repProgressRule.Progress).NewObject)
	}
	fmt.Println("Get Bucket Replication Progress Success!")
}

关闭数据复制

通过删除存储空间的复制规则,您可以关闭源存储空间到目标存储空间的数据复制关系。

以下代码用于删除examplebucket中指定规则ID的数据复制关系。

package main

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

// 关闭数据复制。
func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 填写源Bucket名称。
	srcbucketName := "yourSourceBucket"
	// 填写GetBucketReplication接口返回的数据复制规则ID。
	err = client.DeleteBucketReplication(srcbucketName, "e047ce28-6806-4131-b1da-30142116****")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

相关文档

  • 本页导读 (1)
文档反馈