資料複製是以非同步(近即時)方式將源Bucket中的檔案(Object)以及對Object的建立、更新和刪除等操作自動複製到目標Bucket。OSS支援跨地區複製(Cross-Region Replication)和同地區複製(Same-Region Replication)。
注意事項
本文範例程式碼以華東1(杭州)的地區ID
cn-hangzhou
為例,預設使用外網Endpoint,如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱。本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
阿里雲帳號預設擁有資料複製的相關許可權。如果您希望通過RAM使用者或者STS的方式執行資料複製相關操作,例如:
開啟資料複製,您必須擁有
oss:PutBucketReplication
許可權。開啟或關閉資料複製時間控制(RTC)功能,您必須擁有
oss:PutBucketRtc
許可權。查看資料複製規則,您必須擁有
oss:GetBucketReplication
許可權。查看可複製的目標地區,您必須擁有
oss:GetBucketReplicationLocation
許可權。查看資料複製進度,您必須擁有
oss:GetBucketReplicationProgress
許可權。關閉資料複製,您必須擁有
oss:DeleteBucketReplication
許可權
範例程式碼
開啟資料複製
開啟資料複製前,請確保源儲存空間與目標儲存空間同時處於非版本化或已啟用版本控制狀態。
以下代碼用於開啟資料複製,將源Bucket中的資料複製到相同或不同地區下的目標Bucket。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
var (
targetBucket = "target bucket name" // 目標儲存空間名稱
targetLocation = "oss-cn-beijing" // 目標儲存地區
)
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立開啟儲存空間資料複製的請求
request := &oss.PutBucketReplicationRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
ReplicationConfiguration: &oss.ReplicationConfiguration{
Rules: []oss.ReplicationRule{
{
RTC: &oss.ReplicationTimeControl{
Status: oss.Ptr("enabled"), // 在配置跨地區複製規則時,開啟資料複製時間控制(RTC)功能
},
Destination: &oss.ReplicationDestination{
Bucket: oss.Ptr(targetBucket), // 目標儲存空間名稱
Location: oss.Ptr(targetLocation), // 目標儲存地區
TransferType: oss.TransferTypeOssAcc, // 傳輸類型
},
HistoricalObjectReplication: oss.HistoricalObjectReplicationEnabled, // 開啟歷史資料複製功能
},
},
},
}
// 執行開啟儲存空間資料複製的請求
result, err := client.PutBucketReplication(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket replication %v", err)
}
// 列印開啟儲存空間資料複製的結果
log.Printf("put bucket replication result:%#v\n", result)
}
查看資料複製規則
以下代碼用於查看Bucket的資料複製規則。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立擷取儲存空間資料複製規則的請求
request := &oss.GetBucketReplicationRequest{
Bucket: oss.Ptr(bucketName),
}
// 執行擷取儲存空間資料複製規則的操作
getResult, err := client.GetBucketReplication(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket replication %v", err)
}
// 列印擷取儲存空間資料複製規則的結果
log.Printf("get bucket replication result:%#v\n", getResult)
}
設定資料複製時間控制(RTC)
以下代碼用於為已有的跨地區複製規則開啟或關閉資料複製時間控制(RTC)功能。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
var (
ruleId = "replication id"
)
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立設定儲存空間資料複製時間控制(RTC)的請求
request := &oss.PutBucketRtcRequest{
Bucket: oss.Ptr(bucketName),
RtcConfiguration: &oss.RtcConfiguration{
RTC: &oss.ReplicationTimeControl{
Status: oss.Ptr("enabled"),
},
ID: oss.Ptr(ruleId), //填寫資料複製規則ID
},
}
// 執行設定儲存空間資料複製時間控制(RTC)的請求
result, err := client.PutBucketRtc(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket rtc %v", err)
}
// 列印設定儲存空間資料複製時間控制(RTC)的結果
log.Printf("put bucket rtc result:%#v\n", result)
}
查看可複製的目標地區
以下代碼用於查看Bucket的資料可複製的目標地區列表。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立查看源Bucket可複製到的目標地區的請求
request := &oss.GetBucketReplicationLocationRequest{
Bucket: oss.Ptr(bucketName),
}
// 執行擷取儲存空間可複製到的目標地區的請求
result, err := client.GetBucketReplicationLocation(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket replication location %v", err)
}
// 列印目標地區資訊
for _, location := range result.ReplicationLocation.Locations {
log.Printf("Bucket Replication Location: %s", location)
}
// 列印RTC位置資訊
for _, rtcLocation := range result.ReplicationLocation.LocationRTCConstraint.Locations {
log.Printf("Bucket Replication Location RTC Location: %s", rtcLocation)
}
}
查看資料複製進度
資料複製進度分為歷史資料複製進度和新寫入資料複製進度。
歷史資料複製進度用百分比表示,僅對開啟了歷史資料複製的儲存空間有效。
新寫入資料複製進度用新寫入資料的時間點表示,代表這個時間點之前的資料已複製完成。
以下代碼用於查看Bucket中指定規則ID的資料複製進度。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 設定複製規則ID
var ruleId = "replication id"
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立擷取儲存空間資料複製進度的請求
request := &oss.GetBucketReplicationProgressRequest{
Bucket: oss.Ptr(bucketName),
RuleId: oss.Ptr(ruleId), //指定規則ID
}
// 執行擷取儲存空間資料複製進度的操作
result, err := client.GetBucketReplicationProgress(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket replication progress %v", err)
}
// 列印資料複製進度的資訊
for _, repProgressRule := range result.ReplicationProgress.Rules {
log.Printf("Rule Id: %s", repProgressRule.ID)
log.Printf("Status: %s", repProgressRule.Status)
log.Printf("Replication Progress Rule Destination Bucket: %s", *repProgressRule.Destination.Bucket)
log.Printf("Replication Progress Rule Destination Location: %s", *repProgressRule.Destination.Location)
log.Printf("Replication Progress Rule Destination TransferType: %v", repProgressRule.Destination.TransferType)
log.Printf("Replication Progress Rule Historical Object Replication: %s", *repProgressRule.HistoricalObjectReplication)
}
}
關閉資料複製
通過刪除儲存空間的複製規則,您可以關閉源儲存空間到目標儲存空間的資料複製關係。
以下代碼用於刪除Bucket中指定規則ID的資料複製關係。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定義全域變數
var (
region string // 儲存地區
bucketName string // 儲存空間名稱
)
// init函數用於初始化命令列參數
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// 解析命令列參數
flag.Parse()
// 設定資料複製規則ID
var ruleId = "replication id"
// 檢查bucket名稱是否為空白
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 檢查region是否為空白
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 載入預設配置並設定憑證提供者和地區
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 建立OSS用戶端
client := oss.NewClient(cfg)
// 建立刪除儲存空間資料複製規則的請求
request := &oss.DeleteBucketReplicationRequest{
Bucket: oss.Ptr(bucketName), // 儲存空間名稱
ReplicationRules: &oss.ReplicationRules{
IDs: []string{ruleId}, // 複製規則ID列表
},
}
// 執行刪除儲存空間資料複製規則的操作
result, err := client.DeleteBucketReplication(context.TODO(), request)
if err != nil {
log.Fatalf("failed to delete bucket replication %v", err)
}
// 列印刪除儲存空間資料複製規則的結果
log.Printf("delete bucket replication result:%#v\n", result)
}
相關文檔
關於開啟資料複製的API介面說明,請參見PutBucketReplication。
關於為已有的跨地區複製規則開啟或關閉資料複製時間控制(RTC)功能的API介面說明,請參見PutBucketRTC。
關於查看資料複製規則的API介面說明,請參見GetBucketReplication。
關於查看可複製的目標地區的API介面說明,請參見GetBucketReplicationLocation。
關於查看資料複製進度的API介面說明,請參見GetBucketReplicationProgress。
關於關閉資料複製的API介面說明,請參見DeleteBucketReplication。