You need to enable JavaScript to run this app.
导航

管理跨区域复制(Python SDK)

最近更新时间2024.02.04 18:31:04

首次发布时间2023.02.02 17:32:41

TOS 支持跨区域复制,您可以将一个地域的对象复制到不同地域的存储桶中。开启跨区域复制规则后,当您在源存储桶中上传新文件时,TOS 会自动将文件同步至目的桶内。该功能用于满足异地容灾和数据复制的需求。

设置跨区域复制规则

注意事项

  • 开启跨区域规则之后,才会同步相应文件。
  • 跨区域复制采用异步复制机制,根据您的文件大小,需要的时间为几分钟至几小时不等。
  • 一个存储桶最多可创建 100 条跨区域复制规则。
  • 仅当源桶和目标桶的版本控制状态相同时,才能开启跨区域复制。
  • 要设置桶的跨区域复制规则,默认您必须为桶所有者。
  • CRR 任务执行时,当同时设置了 StorageClassTypeStorageClassInheritDirectiveType 时,以 StorageClassType 的配置为准。
  • 只设置了 StorageClassInheritDirectiveType 时,该配置值为 Storage_Class_ID_Source_Object 时与源对象一致, 该配置项值为 Storage_Class_ID_Destination_Bucket 时与目标桶一致。
  • StorageClassTypeStorageClassInheritDirectiveType 均未设置时,使用默认策略即与目标桶的存储类型保持一致。

示例代码

以下代码用于设置桶 bucket-test 的跨区域复制规则。

import os
import tos
from tos import StatusType, StorageClassInheritDirectiveType, StorageClassType
from tos.models2 import ReplicationRule, Destination


# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
# your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。
endpoint = "your endpoint"
region = "your region"
dest_region = "your crr dest region"
bucket_name = "bucket-test"
dest_bucket_name = "bucket-crr"

try:
    # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
    client = tos.TosClientV2(ak, sk, endpoint, region)
    # 设置跨区域公共规则
    rule = ReplicationRule(
        # 规则ID
        id='1',
        # 指定是否开启跨区域复制规则
        status=StatusType.Status_Enable,
        # 指定数据要复制到的目标
        destination=Destination(
            # 指定数据要复制到的目标Bucket
            bucket=dest_bucket_name,
            # 指定目标Bucket所在的Region
            location=dest_region),
        historical_object_replication=StatusType.Status_Enable
    )
    # 指定跨区域复制匹配对象的前缀, 只有匹配该前缀的对象才会被复制到目标bucket
    # prefix_set = ['prefix1', 'prefix2']
    # 设置跨区域复制规则。
    # replica_config = ReplicationRule(
    #     # 规则ID
    #     id='1',
    #     # 指定开启Status_Enable或关闭Disabled跨区域复制规则
    #     status=StatusType.Status_Enable,
    #     # 指定数据要复制到的目标
    #     destination=Destination(
    #         # 指定数据要复制到的目标Bucket
    #         bucket=dest_bucket_name,
    #         # 指定目标Bucket所在的Region
    #         location=dest_region,
    #         # 指定存储类型
    #         storage_class=StorageClassType.Storage_Class_Ia,
    #         # 指定复制对象的存储类型, 继承元对象Storage_Class_ID_Source_Object、继承目标桶 Storage_Class_ID_Destination_Bucket
    #         storage_class_inherit_directive=StorageClassInheritDirectiveType.Storage_Class_ID_Source_Object
    #     ),
    #     # 指定匹配规则的对象前缀
    #     prefix_set=prefix_set,
    #     # 指定是否开启历史对象的复制
    #     historical_object_replication=StatusType.Status_Enable,
    # )
    # 设置跨区域复制规则
    # 配置跨区域复制规则时您必须在访问配置中创建相应的角色,并授权TOS资源的访问权限
    # 其中role_name为上述创建的角色名称    
    client.put_bucket_replication(bucket_name, 'your role', [rule])
except tos.exceptions.TosClientError as e:
    # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
    print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
    # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
    print('fail with server error, code: {}'.format(e.code))
    # request id 可定位具体问题,强烈建议日志中保存
    print('error with request id: {}'.format(e.request_id))
    print('error with message: {}'.format(e.message))
    print('error with http code: {}'.format(e.status_code))
    print('error with ec: {}'.format(e.ec))
    print('error with request url: {}'.format(e.request_url))
except Exception as e:
    print('fail with unknown error: {}'.format(e))

查看跨区域复制规则

注意

要获取桶的跨区域复制规则,默认您必须为桶所有者。

示例代码

以下代码用于获取桶 bucket-test 的跨区域复制规则。

import os
import tos

# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
# your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。
endpoint = "your endpoint"
region = "your region"
bucket_name = "bucket-test"

try:
    # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
    client = tos.TosClientV2(ak, sk, endpoint, region)
    # 不指定 rule_id返回所有对象的跨区域复制规则
    out = client.get_bucket_replication(bucket_name)
    # 通过指定rule_id='your rule id' 查询指定id的复制规则
    # out = client.get_bucket_replication(bucket_name, rule_id='your rule id')
    # 输出当前桶配置的所有跨区域复制规则
    for rule in out.rules:
        # 输出当前rule id跨区域复制规则配置信息
        print('rule id', rule.id)
        print('prefix set', rule.prefix_set)
        print('status', rule.status)
        print('historical object replication', rule.historical_object_replication)
        print('location', rule.destination.location)
        print('targe bucket', rule.destination.bucket)
        print('storage_class', rule.destination.storage_class)
        print('storage class inherit directive', rule.destination.storage_class_inherit_directive)
except tos.exceptions.TosClientError as e:
    # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
    print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
    # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
    print('fail with server error, code: {}'.format(e.code))
    # request id 可定位具体问题,强烈建议日志中保存
    print('error with request id: {}'.format(e.request_id))
    print('error with message: {}'.format(e.message))
    print('error with http code: {}'.format(e.status_code))
    print('error with ec: {}'.format(e.ec))
    print('error with request url: {}'.format(e.request_url))
except Exception as e:
    print('fail with unknown error: {}'.format(e))

查看跨区域复制进度

注意

  • 要获取桶的跨区域复制进度,默认您必须为桶所有者。
  • 历史数据复制进度用占比表示,仅对开启了历史数据复制的存储空间有效。
  • 新写入数据复制进度用新写入数据的时间点表示。

示例代码

以下代码用于获取桶 bucket-test 的跨区域复制进度。

import os
import tos


# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
# your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。
endpoint = "your endpoint"
region = "your region"
bucket_name = "bucket-test"

try:
    # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
    client = tos.TosClientV2(ak, sk, endpoint, region)
    # 不指定 rule_id 返回所有对象的跨区域复制任务进度
    out = client.get_bucket_replication(bucket_name)
    # 通过指定rule_id='your rule id' 查询指定id的跨区域复制进度
    # out = client.get_bucket_replication(bucket_name, rule_id='your rule id')

    # 输出当前桶配置的所有跨区域复制进度
    for rule in out.rules:
        # 输出当前rule id的跨区域复制进度
        print('rule id', rule.id)
        print('new object progress', rule.progress.new_object)
        print('historical object progress', rule.progress.historical_object)

except tos.exceptions.TosClientError as e:
    # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
    print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
    # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
    print('fail with server error, code: {}'.format(e.code))
    # request id 可定位具体问题,强烈建议日志中保存
    print('error with request id: {}'.format(e.request_id))
    print('error with message: {}'.format(e.message))
    print('error with http code: {}'.format(e.status_code))
    print('error with ec: {}'.format(e.ec))
    print('error with request url: {}'.format(e.request_url))
except Exception as e:
    print('fail with unknown error: {}'.format(e))

删除跨区域复制规则

注意

删除桶的跨区域复制规则,默认您必须为桶所有者。

示例代码

以下代码用于删除桶 bucket-test 的跨区域复制规则。

import os
import tos


# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
# your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。
endpoint = "your endpoint"
region = "your region"
bucket_name = "bucket-test"

try:
    # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
    client = tos.TosClientV2(ak, sk, endpoint, region)
    # 删除跨区域复制规则
    client.delete_bucket_replication(bucket_name)
except tos.exceptions.TosClientError as e:
    # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
    print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
    # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
    print('fail with server error, code: {}'.format(e.code))
    # request id 可定位具体问题,强烈建议日志中保存
    print('error with request id: {}'.format(e.request_id))
    print('error with message: {}'.format(e.message))
    print('error with http code: {}'.format(e.status_code))
    print('error with ec: {}'.format(e.ec))
    print('error with request url: {}'.format(e.request_url))
except Exception as e:
    print('fail with unknown error: {}'.format(e))

相关文档

关于设置跨区域复制规则的更多介绍,请参见跨区域复制规则