腾讯云对象存储COS Migration 工具实操详解

数据备份和迁移除了备份在本地服务器上或内外网,随着互联网的发展,各大云厂商也推出了自己的云存储,例如:腾讯cos,今天就拿腾讯的cos来实操一下官方给出的备份迁移工具COS Migration,实操内容根据腾讯cos官方文档详情见:https://cloud.tencent.com/document/product/436/15392

功能说明

COS Migration 是一个集成了 COS 数据迁移功能的一体化工具。通过简单的配置操作,用户可以将源地址数据快速迁移至 COS 中,它具有以下特点:

  • 丰富的数据源:
    • 本地数据:将本地存储的数据迁移到 COS。
    • 其他云存储:目前支持 AWS S3,阿里云 OSS,七牛存储迁移至 COS,后续会不断扩展。
    • URL 列表:根据指定的 URL 下载列表进行下载迁移到 COS。
    • Bucket 相互复制:COS 的 Bucket 数据相互复制,支持跨账号跨地域的数据复制。
  • 断点续传:工具支持上传时断点续传。对于一些大文件,如果中途退出或者因为服务故障,可重新运行工具,会对未上传完成的文件进行续传。
  • 分块上传:将对象按照分块的方式上传到 COS。
  • 并行上传:支持多个对象同时上传。
  • 迁移校验:对象迁移后的校验。

注意:

  • COS Migration 的编码格式只支持 UTF-8 格式。
  • 使用该工具上传同名文件,默认会覆盖较旧的同名文件,需要额外设置以跳过同名文件。

使用环境

系统环境

Windows、Linux 和 macOS 系统。

软件依赖

  • JDK 1.8 X64或以上,有关 JDK 的安装与配置请参见 Java 安装与配置
  • Linux 环境需要 IFUNC 支持,确保环境 binutils 版本大于 2.20 。

如何在Linux和windows下安装配置java请看我的另一篇文章:https://www.hao0564.com/2113.html

使用方法

本实例演示是从本地服务器备份到腾讯云cos

1. 获取工具

前往下载 COS Migration 工具

2. 解压缩工具包

Windows

下载好cos_migrate_tool_v5-1.4.6.然后上传到windows上,解压并保存到某个目录,例如:

D:\cos_migrate_tool_v5-1.4.6
COS Migration
COS Migration

Linux

下载好cos_migrate_tool_v5-1.4.6.然后上传到centso服务器上,解压并保存到某个目录,

本实例的环境是:

root@localhost Al]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@localhost Al]# uname -a
Linux localhost.localdomain 3.10.0-1160.62.1.el7.x86_64 #1 SMP Tue Apr 5 16:57:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost Al]# 

下载解压并保存到某个目录:

unzip cos_migrate_tool_v5-1.4.6.zip
 unzip 提示错误
unzip 提示错误

如何解压提示上面错误,我们需要安装unzip,很简单

# yum insatll unzip -y
yum insatll unzip -y
yum insatll unzip -y

然后在执行:unzip cos_migrate_tool_v5-1.4.6.zip

:unzip cos_migrate_tool_v5-1.4.6.zip
unzip cos_migrate_tool_v5-1.4.6.zip

接下来我们进入解压后的conf配置文件目录:

[root@localhost conf]# ll
总用量 12
-rw-r--r--. 1 root root 11462 5月  24 2021 config.ini
[root@localhost conf]# pwd
/Al/cos_migrate_tool_v5-1.4.6/conf
[root@localhost conf]# 

可以在本地编辑好然后再上传到服务器上面,覆盖config.ini,或用vim编辑器直接编辑也可以,个人习惯吧,我的具体配置如下:

# 配置迁移类型
# 目前支持四大类, 这里的存储类型和之后的分节名称一致
# 1 从本地迁移, migrateLocal(本地迁移工具, 同之前的本地同步工具)
# 2 从友商迁移, migrateAws(从aws迁移), migrateAli(从阿里迁移), migrateQiniu(从七牛迁移), migrateUpyun(从又拍云迁移)
# 3 从url列表迁移, migrateUrl(这些url都是可以直接下载的,将要迁移的url放到一个文件或者多个文件里)
# 4 COS的bucket复制. migrateBucketCopy(将COS一个bucket下的数据复制到另外一个bucket, 支持跨账号跨地域,前提是账户需要对源bucket源bucket有可读权限,对目的bucket有putObjectCopy权限)
[migrateType]
type=migrateLocal

# 迁移工具的公共配置分节,包含了要迁移到得目的COS的账户信息 
[common]
# 用户的秘钥 secret_id (可在 https://console.qcloud.com/capi 查看)
secretId=在腾讯云获取
# 用户的秘钥 secret_key  (可在 https://console.qcloud.com/capi 查看)
secretKey=在腾讯云获取
# 如果使用临时密钥访问存储桶,此处配置临时密钥的Token,该密钥需要有目的桶的PutObject权限(如果迁移类型是migrateBucketCopy,则该密钥需要有源桶的GetObject权限以及目的桶的PutObject权限)
# token=zzzzzzzzzzzzzzzzz
# 目的Bucket的名称, 命名规则为{name}-{appid},即bucket名必须包含appid, 例如movie-1251000000
bucketName=mydate-1259042419
# 目的bucket的region信息. COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
region=ap-nanjing
# 目的园区的endpoint suffix, 一般情况不用填写,适用于自定义域名CNAME到COS上传域名的客户.工具会在自动在在suffix前加上${bucketname}。最终形成的域名是
# ${bucketName}.${endPointsuffix}. endPoint的优先级比region高,如果设置了endpoint则会以enpoint来补充域名
# endPointSuffix=Standard
# 存储类型, 标准(Standard), 低频(Standard_IA), 归档(Archive), 多AZ标准(Maz_Standard), 多AZ低频(Maz_Standard_IA),这个endPointSuffix=Standard要注释掉,会出错的!
storageClass=Standard
# 要迁移到的cos路径, /表示迁移到bucket的根路径下, /aaa/bbb/表示要迁移到bucket的/aaa/bbb/下面, 如果/aaa/bbb/不存在,则会自动建立
cosPath=/docker/VMware_ssh/portainer_data/
# 是否使用HTTPS传输(传输速度较慢,适用于对传输安全要求高的场景), on开启, off关闭
https=off
# 临时目录,用于运行过程中,临时文件的存储, 主要用于友商数据迁移到COS, 因为迁移会现将数据下载到临时目录,再进行上传后删除.对于linux绝对路径, 如/a/b/c, 对于windows绝对路径,注意分隔符为两个反斜杠,如E:\\a\\b\\c
# 默认存储在工具下的tmp目录, 请确保磁盘空间充足,取决于要迁移的文件的大小与并发度。
tmpFolder=./tmp
# 小文件阈值的字节,大于等于这个阈值使用分块上传,否则使用简单上传, 默认5MB
# 注意:最大能上传5GB的小文件
smallFileThreshold=5242880
# 小文件(文件小于smallFileThreshold)的并发度,使用简单上传,此值对于带宽充足或小文件过多时,可以适当增大调整为128或者256等。
# 同时如果从友商或者URL迁移,下载是使用的线程池并发度也由smallFileExecutorNum来决定,因此可以通过增大下载速度。
smallFileExecutorNum=64
# 大文件(文件大于等于smallFileThreshold)的并发度,使用分块上传,此值不宜过大,建议不大于32
bigFileExecutorNum=8
# 用来指定分块上传时单个分块的大小, 单位字节,,默认分块大小是5MB
# 由于分块上传对单个文件块的数目有最大限制(10000块),所以对于超出5MB*10000大小的文件,需要根据具体情况调整该参数 
bigFileUploadPartSize=5242880
# 表示迁移工具将全文的MD5计算后,存入文件的自定义头部x-cos-meta-md5中, 用于后续的校验,因为COS的分块上传的大文件的etag不是全文的md5
# on 打开, off关闭
entireFileMd5Attached=on
# 表示是否启用damon模式,damon表示程序会循环不停的去执行同步,每一轮同步的间隔由damonModeInterVal参数设置
# 如果启用damon模式, 则设置为on, 否则为off
daemonMode=off
# 表示每一轮同步结束后,多久进行下一轮同步,单位为秒
daemonModeInterVal=60
# 表示任务执行的时间窗口, 满足部分客户要求在指定时间段内执行,比如03:30,21:00, 表示在凌晨03:30到晚上21:00之间执行任务。
# 如果当前时间不在时间窗口内,则会进入睡眠状态,暂停迁移,直到下一个时间窗口内自动再继续执行。
# 但每一个任务都是 先判断时间是否在迁移窗口,然后开始迁移,有可能判断的时候 在时间窗口,但是迁移过程中有可能跨过时间窗口, 即存在少量的迁移在时间窗口外执行。
executeTimeWindow=00:00,24:00

# 迁移成功的结果,按日期归档此目录,为空即不输出。格式每一行为:绝对路径\t文件大小\t最后修改时间,该目录需要存在。
outputFinishedFileFolder=./result

# 是否接着最后一次运行的结果,继续往下遍历源的文件列表
resume=false

# 如果 COS 已经有相同的文件,是否直接跳过。默认不跳过,即覆盖原有文件。
skipSamePath=false

# 从本地迁移到COS配置分节
[migrateLocal]
# 本地目录, 表示将该路径下的数据都迁移到COS, 对于linux绝对路径, 如/a/b/c, 对于windows绝对路径,注意分隔符为两个反斜杠,如E:\\a\\b\\c
localPath=/root/portainer_data/
# 要排除的目录或者文件的绝对路径, 表示将localPath下面某些目录或者文件不进行迁移,多个绝对路径之前用分号分割,不填表示localpath下面的全部迁移
excludes=
# 排除更新时间与当前时间相差不足一定时间段的文件,单位为秒
# 默认不设置, 表示不根据lastmodified时间进行筛选
# 适用于客户在更新文件的同时又在运行迁移工具, 不准备把正在更新的文件迁移上传到COS, 比如设置为300, 表示只上传更新了5分钟以上的文件
ignoreModifiedTimeLessThanSeconds=
# 多个后缀用;隔开,例如:.txt;.tmp;
ignoreSuffix=
# on:忽略空文件,off:不忽略。默认不忽略
ignoreEmptyFile=
# on: 使用列表文件指定所有待迁移文件的相对路径; off: migration递归遍历localPath, 添加待迁移文件; 默认off
# 可使用excludes, ignoreModifiedTimeLessThanSeconds, ignoreSuffix, ignoreEmptyFile忽略列表中的文件
#fileListMode=on
# 当fileListMode=on的时候,fileListPath参数为localPath下待迁移文件的相对路径列表
#fileListPath=/data/config/myFileList.txt

## 从阿里迁移到COS的配置分节
[migrateAli]
bucket=mybucket-test
accessKeyId=xxxxxxxxxx
accessKeySecret=yyyyyyyyyyy
#友商的地址
endPoint=oss-cn-shenzhen.aliyuncs.com
# 要迁移的路径的前缀, 如果是迁移bucket下所有的数据, 则prefix为空
prefix=
# 如果要使用代理进行访问,则填写代理IP地址
proxyHost=
# 代理的端口
proxyPort=
# 访问ali时, 是否使用HTTPS传输(传输速度较慢,适用于对传输安全要求高的场景), on开启, off关闭
srcHttps=off
# 访问ali时, 连接ali服务器的超时时间,单位ms, 默认5000
#srcConnectTimeout=5000
# 访问ali时, 读取ali响应的超时时间,单位ms, 默认10000
#srcSocketTimeout=10000

# 从七牛迁移到COS
[migrateQiniu]
# 从七牛迁移到COS的配置分节
# 七牛的bucket名称
bucket=mybucket
# 七牛的账户信息
accessKeyId=xxxxxxxxxx
accessKeySecret=yyyyyyyyyyyyyyyy
# 七牛的下载地址, 对应downloadDomain
endPoint=wwww.bkt.clouddn.com
# 要迁移的路径的前缀, 如果是迁移bucket下所有的数据, 则prefix为空
prefix=
# 如果要使用代理进行访问,则填写代理地址
proxyHost=
# 代理端口
proxyPort=
#公有读bucket可以填off, 其余填on. 默认on
needSign=on

# 从通过URL列表进行迁移,URL列表里面填写的源文件的下载路径,该路径可以直接下载下来,迁移工具会将其再上传到COS上去
[migrateUrl]
# 使用url列表迁移,如果urllistPath填的是目录,那么就会把这个目录下所有文件都当作urllist文件去扫描迁移
# 对于linux绝对路径, 如/a/b/c, 对于windows绝对路径,注意分隔符为两个反斜杠,如E:\\a\\b\\c
urllistPath=/data/mydata/url

#on:迁移时不去head url,off:会head url,默认off。不去head可能导致源更新了,迁移工具却不知道,适用于确定源不更新,加快迁移速度。
isSkipHead=

## 从AWS迁移到COS的配置分节
[migrateAws]
# aws的bucket
bucket=aws-emr-test
accessKeyId=xxxxxxxx
accessKeySecret=yyyyyyyyyy
# aws的endpoint地址, 必须使用域名, 不能使用region
endPoint=s3.us-east-1.amazonaws.com
# 要迁移的路径的前缀, 如果是迁移所有的,则prefix为空
prefix=
# 迁移的代理地址
proxyHost=
# 代理端口
proxyPort=
# 访问aws时, 是否使用HTTPS传输(传输速度较慢,适用于对传输安全要求高的场景), on开启, off关闭
srcHttps=off
# 访问aws时, 连接aws服务器的超时时间,单位ms, 默认5000
#srcConnectTimeout=5000
# 访问aws时, 读取aws响应的超时时间,单位ms, 默认10000
#srcSocketTimeout=10000

# bucket copy
[migrateBucketCopy]
# 源 bucket的region信息. COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
srcRegion=ap-shanghai
# 源 Bucket的名称, 命名规则为{name}-{appid},即bucket名必须包含appid, 例如movie-1251000000
srcBucketName=mysrcbucket-1251668555
# 源bucket的endpoint suffix, 一般情况不用填写,适用于自定义域名CNAME到COS上传域名的客户.工具会在自动在在suffix前加上${bucketname}。最终形成的域名是
# ${bucketName}.${srcEndPointSuffix}. srcEndPointSuffix的优先级比srcRegion高,如果设置了srcEndPointSuffix则会以srcEndPointSuffix来补充域名
srcEndPointSuffix=
# 源bucket隶属的用户的秘钥 secret_id (可在 https://console.qcloud.com/capi 查看)
# 因为bucket copy支持跨账号,所以如果是另外一个账户的数据,则srcSecretId和common中的secretId不同
# 如果是同一客户的数据, 则srcSecretId和common中的secretId相同
srcSecretId=xxxxxxxxxxx
# 源bucket隶属的用户的秘钥 secret_key(可在 https://console.qcloud.com/capi 查看)
srcSecretKey=yyyyyyyyyyyyyyyy
# 如果使用临时密钥访问存储桶,此处配置临时密钥的Token,该密钥需要有源桶的GetBucket(列出存储桶对象)和HeadObject权限
# srcToken=zzzzzzzzzzz
# 要迁移的cos路径的
srcCosPath=/
# 如果只需要迁移部分文件,可以通过srcFileList指定迁移文件列表,例如,只需要迁移aaa/1.jpg和bb/2.jpg,则:
# $cat /data/fileList.txt
# aaa/1.jpg
# bbb/2.jpg
#srcFileList=/data/fileList.txt

[migrateCsp]
bucket=xxx
accessKeyId=xxx
accessKeySecret=xxx
endPoint=xxx.com

#指定了uriList之后,就只迁uri列表中的数据,不指定则是自动list全部数据然后迁移。uri格式不带域名,如:/dir1/subdir2/a.txt
uriList=/data/uriList.txt
prefix=

[migrateUpyun]
# 从又拍迁移
bucket=xxx
accessKeyId=又拍云操作员id
accessKeySecret=又拍云操作员密码
prefix=
#获取文件列表的顺序,true为正序,false为逆序
acsendingOrder=true

#又拍云sdk限制,这个proxy会被设置成全局的proxy
proxyHost=
proxyPort=

关于secretIdsecretKey可以参考这边文章:https://cloud.tencent.com/developer/article/1849447

我在实际操作中如果不注释掉# endPointSuffix=Standard,执行会失败

注释掉#endPointSuffix=Standard
注释掉#endPointSuffix=Standard
最后我们就可以执行,Linux下:
sh start_migrate.sh
sh start_migrate.sh
sh start_migrate.sh
windows下:
双击 start_migrate.bat 即可运行。
双击 start_migrate.bat
双击 start_migrate.bat

COS Migration 工具目录结构如下所示:
COS_Migrate_tool
|——conf  #配置文件所在目录
|   |——config.ini  #迁移配置文件
|——db    #存储迁移成功的记录
|——dep   #程序主逻辑编译生成的JAR包
|——log   #工具执行中生成的日志
|——opbin #用于编译的脚本
|——src   #工具的源码
|——tmp   #临时文件存储目录
|——pom.xml #项目配置文件
|——README  #说明文档
|——start_migrate.sh  #Linux 下迁移启动脚本
|——start_migrate.bat #Windows 下迁移启动脚本

说明:

  • db 目录主要记录工具迁移成功的文件标识,每次迁移任务会优先对比 db 中的记录,若当前文件标识已被记录,则会跳过当前文件,否则进行文件迁移。
  • log 目录记录着工具迁移时的所有日志,若在迁移过程中出现错误,请先查看该目录下的 error.log。

3. 修改 config.ini 配置文件

在执行迁移启动脚本之前,需先进行 config.ini 配置文件修改(路径:./conf/config.ini),config.ini 内容可以分为以下几部分:

3.1 配置迁移类型

type 表示迁移类型,用户根据迁移需求填写对应的标识。例如,需要将本地数据迁移至 COS,则[migrateType]的配置内容是type=migrateLocal

[migrateType]
type=migrateLocal

目前支持的迁移类型如下:

migrateType描述
migrateLocal从本地迁移至 COS
migrateAws从 AWS S3 迁移至 COS
migrateAli从阿里 OSS 迁移至 COS
migrateQiniu从七牛迁移至 COS
migrateUrl下载 URL 迁移到 COS
migrateBucketCopy从源 Bucket 复制到目标 Bucket
migrateUpyun从又拍云迁移到 COS

说明:

如果想从上述未提及的源站进行迁移,若源站兼容 AWS S3 的API,即可使用 AWS 的配置进行迁移。

3.2 配置迁移任务

用户根据实际的迁移需求进行相关配置,主要包括迁移至目标 COS 信息配置及迁移任务相关配置。

# 迁移工具的公共配置分节,包含了需要迁移到目标 COS 的账户信息。
# 迁移工具的公共配置分节,包含了需要迁移到目标 COS 的账户信息。
[common]
secretId=COS_SECRETID
secretKey=COS_SECRETKEY
bucketName=examplebucket-1250000000
region=ap-guangzhou
storageClass=Standard
cosPath=/
https=off
tmpFolder=./tmp
smallFileThreshold=5242880
smallFileExecutorNum=64
bigFileExecutorNum=8
entireFileMd5Attached=on
daemonMode=off
daemonModeInterVal=60
executeTimeWindow=00:00,24:00
outputFinishedFileFolder=./result
resume=false
skipSamePath=false
名称描述默认值
secretId用户密钥 SecretId,请将COS_SECRETID替换为您的真实密钥信息。可前往 访问管理控制台 中的云 API 密钥页面查看获取
secretKey用户密钥 SecretKey,请将COS_SECRETKEY替换为您的真实密钥信息。可前往 访问管理控制台 中的云 API 密钥页面查看获取
bucketName目的 Bucket 的名称, 命名格式为 <BucketName-APPID>,即 Bucket 名必须包含 APPID,例如 examplebucket-1250000000
region目的 Bucket 的 Region 信息。COS 的地域简称请参照 地域和访问域名
storageClass数据迁移后的存储类型,可选值为 Standard(标准存储)、Standard_IA(低频存储)、Archive(归档存储)、Maz_Standard(标准存储多 AZ)、Maz_Standard_IA(低频存储多 AZ),相关介绍请参见 存储类型概述Standard
cosPath要迁移到的 COS 路径。/表示迁移到 Bucket 的根路径下,/folder/doc/ 表示要迁移到 Bucket的/folder/doc/ 下,若 /folder/doc/ 不存在,则会自动创建路径/
https是否使用 HTTPS 传输:on 表示开启,off 表示关闭。开启传输速度较慢,适用于对传输安全要求高的场景off
tmpFolder从其他云存储迁移至 COS 的过程中,用于存储临时文件的目录,迁移完成后会删除。要求格式为绝对路径:
Linux 下分隔符为单斜杠,例如/a/b/c
Windows 下分隔符为两个反斜杠,例如E:\\a\\b\\c
默认为工具所在路径下的 tmp 目录
./tmp
smallFileThreshold小文件阈值的字节,大于等于这个阈值使用分块上传,否则使用简单上传,默认5MB5242880
smallFileExecutorNum小文件(文件小于 smallFileThreshold)的并发度,使用简单上传。如果是通过外网来连接 COS,且带宽较小,请减小该并发度64
bigFileExecutorNum大文件(文件大于等于 smallFileThreshold)的并发度,使用分块上传。如果是通过外网来连接 COS,且带宽较小,请减小该并发度8
entireFileMd5Attached表示迁移工具将全文的 MD5 计算后,存入文件的自定义头部 x-cos-meta-md5 中,用于后续的校验,因为 COS 的分块上传的大文件的 etag 不是全文的 MD5on
daemonMode是否启用 daemon 模式:on 表示开启,off 表示关闭。daemon 表示程序会循环不停的去执行同步,每一轮同步的间隔由 daemonModeInterVal 参数设置off
daemonModeInterVal表示每一轮同步结束后,多久进行下一轮同步,单位为秒60
executeTimeWindow执行时间窗口,时刻粒度为分钟,该参数定义迁移工具每天执行的时间段。例如:
参数 03:30,21:00,表示在凌晨 03:30 到晚上 21:00 之间执行任务,其他时间则会进入休眠状态,休眠态暂停迁移并会保留迁移进度, 直到下一个时间窗口自动继续执行
00:00,24:00
outputFinishedFileFolder这个目录保存迁移成功的结果,结果文件会按照日期命名,例如./result/2021-05-27.out,其中./result 为已创建的目录。文件内容每一行的格式为:绝对路径\t文件大小\t最后修改时间。设置为空,则不输出结果。./result
resume是否接着最后一次运行的结果,继续往下遍历源的文件列表。默认从头开始。false
skipSamePath如果 COS 上已经有相同的文件名,是否直接跳过。默认不跳过,即覆盖原有文件。false

3.3 配置数据源信息

根据[migrateType]的迁移类型配置相应的分节。例如[migrateType]的配置内容是type=migrateLocal, 则用户只需配置[migrateLocal]分节即可。

3.3.1 配置本地数据源 migrateLocal

若从本地迁移至 COS,则进行该部分配置,具体配置项及说明如下:

# 从本地迁移到 COS 配置分节
[migrateLocal]
localPath=E:\\code\\java\\workspace\\cos_migrate_tool\\test_data
excludes=
ignoreModifiedTimeLessThanSeconds=
配置项描述
localPath本地目录,要求格式为绝对路径:Linux 下分隔符为单斜杠,例如/a/b/cWindows 下分隔符为两个反斜杠,例如E:\\a\\b\\c
excludes要排除的目录或者文件的绝对路径,表示将 localPath 下面某些目录或者文件不进行迁移,多个绝对路径之前用分号分割,不填表示 localPath 下面的全部迁移
ignoreModifiedTimeLessThanSeconds排除更新时间与当前时间相差不足一定时间段的文件,单位为秒,默认不设置,表示不根据 lastmodified 时间进行筛选,适用于客户在更新文件的同时又在运行迁移工具,并要求不把正在更新的文件迁移上传到 COS,例如设置为300,表示只上传更新了5分钟以上的文件

2 评论

  1. 报错提示:code404; Error Code:NoSuchBucket

    在TKE上核对是BucketName是存在

    疑问:
    1.需要特殊的权限吗 ?

    2.还是桶的名称不能提前创建,是动态创建的

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注