项目场景

需要将旧的阿里云账号里的OSS资源迁移至新的阿里云主账号内的OSS。

使用工具OssImport

OssImport工具可以将本地、其它云存储的数据迁移到OSS,它有以下特点:

支持的丰富的数据源,有本地、七牛、百度BOS、AWS S3、Azure Blob、又拍云、腾讯云COS、金山KS3、HTTP、OSS等,并可根据需要扩展;
支持断点续传;
支持流量控制;
支持迁移指定时间后的文件、特定前缀的文件;
支持并行数据下载、上传;
支持单机模式和分布式模式,单机模式部署简单使用方便,分布式模式适合大规模数据迁移。

OssImport有 单机模式 和 分布式模式 两种部署方式。

对于小于 30TB 的小规模数据迁移,单机模式即可完成。
对于大规模的数据迁移,请使用分布式模式。

运行环境

java version "1.8.0_162"

CentOS Linux release 7.4.1708 (Core)
内核版本    3.10.0-693.2.2.el7.x86_64

下载安装工具

# wget http://gosspublic.alicdn.com/ossimport/standalone/ossimport-2.3.1.zip?spm=a2c4g.11186623.2.4.Y7BlCt&file=ossimport-2.3.1.zip
# cd /usr/local && mkdir ossimport
# unzip ossimport-2.3.1.zip -d ossimport/

单机模式下文件结构如下:

ossimport
├── bin
│ └── ossimport2.jar  # 包括Master、Worker、Tracker、Console四个模块的总jar
├── conf
│ ├── local_job.cfg   # 单机Job配置文件
│ └── sys.properties  # 系统运行参数配置文件
├── console.bat         # Windows命令行,可以分布执行调入任务
├── console.sh          # Linux命令行,可以分布执行调入任务
├── import.bat          # Windows一键导入,执行配置文件为conf/local_job.cfg配置的数据迁移任务,包括启动、迁移、校验、重试
├── import.sh           # Linux一键导入,执行配置文件为conf/local_job.cfg配置的数据迁移任务,包括启动、迁移、校验、重试
├── logs                # 日志目录
└── README.md           # 说明文档,强烈建议使用前仔细阅读

其中:

Job:用户通过提交的数据迁移任务,对用户来说一个任务对应一个配置文件job.cfg。
Task:Job按照 “数据大小” 和 “文件个数” 可以分成多个 Task ,每个 Task 迁移部分文件。Job切分成Task的最小单位是文件,同一个文件不会切分到多个Task中。

注意:
执行命令时请保证工作目录为 `import.sh` 的同级目录,即直接执行 bash import.sh

sys.properties 系统运行参数

/usr/local/ossimport/conf/sys.properties

参照 官方文档

local_job.cfg 数据迁移任务配置

/usr/local/ossimport/conf/sys.properties

参照 官方文档

配置文件示例

根据实际项目选择对应的job.cfg 官方文档

需要用到能操作OSS资源的授权AccessKey

这里仅仅以源OSS为例,目标OSS刚需要授权读写OSS权限。
[实战]生产环境阿里云-OSS资源迁移_第1张图片

[实战]生产环境阿里云-OSS资源迁移_第2张图片

以下配置为本次迁移的实际配置文件

迁移具体场景
从A账号迁入B账号

A 账号下的OSS Bucket为wdbox >> B 账号下的OSS Bucket为sili-pr

#是否打开增量模式
isIncremental=false

#同步源类型
srcType=oss

#源access key,可以在阿里云-访问控制-用户管理  新建立一个用户并创建AccessKey,并授权对OSS只读即可。这里填写AccessKey ID
srcAccessKey=L**********m

#源secrect key,这里填写AccessKeySecret
srcSecretKey=9****************7

#源endpoint
#1.oss: 从控制台获取域名(非带bucket前缀的二级域名),域名列表参考https://help.aliyun.com/document_detail/31834.html; 例:"srcDomain=http://oss-cn-hangzhou-internal.aliyuncs.com"; 如果用阿里云ecs虚拟机做迁移的,请使用internal域名,不计费且不受虚拟机带宽限制(非虚拟机无法使用);例:http://oss-cn-hangzhou-internal.aliyuncs.com  
#内网流量不计费。
srcDomain=http://oss-cn-shenzhen-internal.aliyuncs.com

#源bucket名字,不需要加上"/"
srcBucket=wdbox

#源前缀,默认为空,如果srcType=local,则此目录是本地目录,如果是其他类型,则是源Bucket里需要同步的Object的前缀,注意如果是本地目录,需要完整目录路径(以'/'进行分割并且以'/'结尾,例: c:/example/)
destPrefix=

##############################################################同步目的端设置################################################################
#目的 access key
destAccessKey=L*************P

#目的 AccessKeySecret
destSecretKey=n***********************e

#目的endpoint,请根据您的实际oss区域填写,默认为杭州的域名,如果用阿里云ecs虚拟机做迁移的,请使用internal域名,不计费且不受虚拟机带宽限制(非虚拟机无法使用);例:http://oss-cn-hangzhou-internal.aliyuncs.com
#注意:域名里不要带上bucket前缀,oss域名帮助页面:https://help.aliyun.com/document_detail/31837.html  这里是采用了目标OSS所在的VPC网络内的ECS主机,所以,采用内部地址则免流量。
destDomain=http://oss-cn-shenzhen-internal.aliyuncs.com

#目的bucket,不需要加上"/"
destBucket=sili-pr

#目标前缀,默认为空,直接放在bucket下(如果要将数据同步到oss的某个目录下,请以'/'结尾),注意:oss不支持以 '/' 作为文件的开头,所以destPrefix请不要配置以'/'做为开头
#一个本地文件路径为 srcPrefix + relativePath的文件,迁移到oss的路径为destDomain/destBucket/destPrefix + relativePath
#一个云端文件路径为 srcDomain/srcBucket/srcPrefix + relativePath的文件,迁移到oss的路径为destDomain/destBucket/destPrefix + relativePath
destPrefix=

##############################################################任务配置,没有特殊需求不需要修改#################################################
#job名字,每个任务唯一,单机模式下请不要修改此项
jobName=local_test

#job类型(import/audit),import为同步数据到oss,audit为校验源端数据和oss数据是否一致
jobType=import

#只导入源文件最后修改时间大于该时间的数据,默认为0,这个时间为unix时间戳(秒数)
importSince=0

#在校验时,如果文件的最后修改时间大于该值,则跳过此文件的校验,默认值0为关闭该功能,所有文件都需要校验,这个时间为unix时间戳(秒数),jobType为audit时此项不生效
lastModify=0

#数据迁移时,是否跳过已经存在的文件。当设置为true时,根据文件的size和LastModifedTime判断是否跳过;为false时,总是覆盖OSS上已有文件。jobType为audit时此项不生效。
isSkipExistFile=false

# 每个子任务最大的文件个数限制,这个会影响到任务执行的并行度,一般配置为总的文件数/120
taskObjectCountLimit=4

#每个子任务下载的最大文件大小限制(bytes)
taskObjectSizeLimit=1000000000

#并行扫描文件列表的线程数,只影响扫描文件的效率,没有特殊需求不要修改
scanThreadCount=1

#最大允许并行扫描目录的深度,默认为1就是只能在顶级目录间并行扫描,没有特殊需求不要修改,随意配置的过大会导致任务无法正常运行
maxMultiThreadScanDepth=1

#单个大文件分片上传并发数,默认超过150MB为大文件,分片为50MB,srcType=local时有效,其它情况该配置项无效
uploadThreadNumPerLargeFile=3

#大于该值的文件使用分片上传,否则使用普通上传,请配置大于1MB以上;有效配置值如:50m/1024m/5g
multipartUploadThreshold=150m

#分配上传时分片大小,请配置大于100k的数据,否则无效,采用默认值50MB;有效配置值如:500k/50m/2g
multipartUploadPartSize=50m

#存储在OSS上的数据否加密,默认不加密
isServerSideEncryption=false

#local模式时,链接文件是否上传,默认不上传
isAllowSymbolicLink=false

# 七牛云存储获取Meta的方式,有效值head和stat,默认使用stat;head通过HTTP HEAD请求获取,stat通过BucketManager.stat
getObjectMetaMode=stat

#数据迁移后是否进行数据的正确性校验,默认校验
isAuditAfterImport=true 

#数据校验方式,有效值为simple/general/detailed,默认值general;simple只校验文件的size,general校验文件的size/lastModify/header,detailed检验文件的CRC或MD5,开发中
auditMode=general

运行任务

# bash import.sh

[实战]生产环境阿里云-OSS资源迁移_第3张图片

可以看到新账号下的sili-pr 已经有数据存在了

[实战]生产环境阿里云-OSS资源迁移_第4张图片

[实战]生产环境阿里云-OSS资源迁移_第5张图片

迁移完成,删除新创建的源OSS授权账号

计量项和计费项

https://help.aliyun.com/document_detail/59636.html?spm=a2c4g.11186623.2.3.vXRqXS