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

管理跨区域复制(Node.js SDK)

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

首次发布时间2023.12.19 18:47:29

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

设置跨区域复规则

注意事项

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

示例代码

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

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError, StatusType, StorageClassInheritDirectiveType } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

const bucketName = 'node-sdk-test-bucket';
async function main() {
  try {
    const rule = {
      // 规则 ID
      ID: 'rule_id',
      // 指定是否开启跨区域复制规则
      Status: StatusType.Enabled,
      // 指定跨区域复制匹配对象的前缀,空则代表复制全部对象。
      PrefixSet: [],
      // 指定复制到的目标信息
      Destination: {
        // 目标桶名
        Bucket: 'dst_bucket',
        // 目标 Region 信息
        Location: 'dst_region',
        // 指定复制对象的存储类型规则
        // StorageClassInheritDirectiveSourceObject: 与源对象保持一致
        // StorageClassInheritDirectiveDestinationBucket: 与目标桶保持一致
        StorageClassInheritDirective: StorageClassInheritDirectiveType.StorageClassInheritDirectiveSourceObject,
      },
      // 是否需要复制历史对象
      HistoricalObjectReplication: StatusType.Disabled,
    };
    // 设置 Role
    const role = 'your role';
    const { requestId: putReplicationRequestId } = await client.putBucketReplication({
      bucket: bucketName,
      role,
      rules: [rule],
    });
    console.log('putBucketReplication Request ID: ', putReplicationRequestId);
  } catch (error) {
    handleError(error);
  }
}

main();

查看跨区域复制规则

注意

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

示例代码

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

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

const bucketName = 'node-sdk-test-bucket';
async function main() {
  try {
    const { data, requestId: getReplicationRequestId } = await client.getBucketReplication({
      bucket: bucketName,
      // 不指定 ruleId 查询当前桶所有跨区域复制规则
      // 指定 ruleId 时,返回指定规则
      // ruleId: 'ruleId',
    });
    console.log('getBucketReplication Request ID: ', getReplicationRequestId);
    console.log('Replication rules length:  ', data.Rules.length);
    // 查看跨域访问规则详细信息
    for (const rule of data.Rules) {
      // 规则 ID
      console.log('rule id:', rule.ID);
      // 规则状态
      console.log('rule status:', rule.Status);
      for (const prefix of rule.PrefixSet || []) {
        // 规则前缀
        console.log('rule prefix:', prefix);
      }
      // 目标桶
      console.log('rule dst bucket:', rule.Destination.Bucket);
      // 目标地域
      console.log('rule dst location:', rule.Destination.Location);
      // 存储类型
      console.log('rule dst storage class:', rule.Destination.StorageClass);
      // 存储类型规则
      console.log('rule dst storage class inherit directive:', rule.Destination.StorageClassInheritDirective);
    }
  } catch (error) {
    handleError(error);
  }
}

main();

查询跨区域复制进度

注意事项

注意

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

示例代码

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

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

const bucketName = 'node-sdk-test-bucket';
async function main() {
  try {
    const { data, requestId: getReplicationRequestId } = await client.getBucketReplication({
      bucket: bucketName,
      // 不指定 ruleId 查询当前桶所有跨区域复制规则
      // 指定 ruleId 时,返回指定规则
      // ruleId: 'ruleId',
    });
    console.log('getBucketReplication Request ID: ', getReplicationRequestId);
    console.log('Replication rules length:  ', data.Rules.length);
    // 查看跨域访问规则详细信息
    for (const rule of data.Rules) {
      // 规则 ID
      console.log('rule id:', rule.ID);
      // 历史复制进度
      console.log('rule historical object:', rule.Progress.HistoricalObject);
      // 增量进度时间点
      console.log('rule new object:', rule.Progress.NewObject);
    }
  } catch (error) {
    handleError(error);
  }
}

main();

删除跨区域复制规则

注意

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

示例代码

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

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

const bucketName = 'node-sdk-test-bucket';
async function main() {
  try {
    const { requestId: deleteReplicationRequestId } = await client.deleteBucketReplication({
      bucket: bucketName,
    });
    console.log('deleteBucketReplication Request ID: ', deleteReplicationRequestId);
  } catch (error) {
    handleError(error);
  }
}

main();

相关文档

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