qscamel
功能概述
qscamel 是一个用于在不同的端点 (Endpoint) 间高效迁移数据的工具。作为端点间数据迁移的工具,qscamel 有着如下特性:
- 简单,便于使用的任务管理
- 支持从任务中断处续传,从而节省用户的时间
- 提供完全自动化的重试机制,无须人工介入
- 基于 Goroutine 池实现的并发机制,提高迁移效率
- 支持 copy,fetch,delete 等迁移机制
- 支持数据校验
安装
- 
在 releases 页面分别获取适用于 Linux,macOS 以及 Windows 操作系统的最新版本的 qscamel工具,并进行解压。 
- 
进入 qscamel 工具所在文件夹,执行如下命令查看 qscamel 版本信息: ./qscamel-xxxx version命令行回显如下所示时,说明安装成功。 qscamel version xxxx说明 - 需进入 qscamel 工具所在文件夹下执行命令使用该工具。
- qscamel-xxxx 为工具下载后解压的文件名称,可根据实际情况进行修改。
 
- 
执行步骤2中命令后,会自动生成 qscamel.yaml配置文件,修改配置文件可参考配置。
配置
执行如下命令,修改配置文件:
vim ~/.qscamel/qscamel.yaml
说明
qscamel 默认从
~/.qscamel/qscamel.yaml读取配置文件,用户也可以通过-c或者--config参数来指定配置文件的位置。
qscamel 配置示例:
concurrency: 0
log_level: info
pid_file: ~/.qscamel/qscamel.pid
log_file: ~/.qscamel/qscamel.log
database_file: ~/.qscamel/db
说明
concurrency用于控制同时启用的任务并发数量。若没有设置,或者设置为 0, qscamle 将会使用逻辑 CPU 数量 * 100作为该项的值。
log_level用于控制日志的级别。日志内容显示从多到少依次可设置为:debug,info,warn,error,fatal,panic。
pid_file用于控制在何处创建 PID 文件。
log_file用于控制在何处创建日志文件。
database_file用于控制在何处创建数据库。- 以上配置字段均有默认值,默认值如示例文件所示。用户可根据需求,修改相应参数。若无特殊需求,用户无需对其进行修改。
任务
用户可通过任务文件来定义一个数据迁移任务,支持如下命令新建任务文件:
vim example-task.yaml
任务文件配置示例:
type: copy
source:
  type: fs
  path: "/path/to/source"
destination:
  type: qingstor
  path: /aaa
  
  options:
    bucket_name: example_bucket
    access_key_id: example_access_key_id
    secret_access_key: example_secret_access_key
ignore_existing: last_modified
说明
type用于定义该任务的类型。可选值: copy,fetch,delete。
copy 将会从source指定的端点读取文件,并写入到destination指定的端点;
fetch 将会从source指定的端点获取文件的下载链接,并使用destination指定的端点的 fetch 功能对其进行拉取;
delete 将会从source指定的端点获取文件的信息,并在destination指定的端点将其删除。
source:标识后续字段为任务的源端点,即:source 端点信息。
destination标识后续字段为任务的目标端点,即 destination 端点信息。
type当前端点的类型。可选值: aliyun,azblob,cos,fs,filelist,gcs,hdfs,qingstor,qiniu,s3,upyun。
path当前端点的路径。须为目录名。
options标识后续字段为可选字段。不同端点的可选字段,会有区别,详情可参考 端点信息。
ignore_existing用于控制是否跳过已经存在的文件,为空或未配置时将会禁用该配置,即总是覆盖。可选值为:last_modified 与 md5sum。
last_modified 将会检查目标的 LastModified 是否比源站要大;
md5sum 将会对文件做完整的 MD5 计算,当 MD5 相同时会跳过。
使用
Run
qscamel 最主要的命令。用户可通过该命令来创建或者恢复一个迁移任务。
当使用该命令创建或恢复一个任务时,qscamel 会根据任务名查询数据库,检查任务文件内容是否有更新。若任务文件内容有更新,qscamel 会报错并退出;若无同名任务,qscamel 会对任务内容的 sha256 校验和进行计算,并将结果保存于数据库中;若有同名任务,且任务文件没有更新,qscamel 将恢复该任务,继续执行。
换句话说,数据迁移任务在创建成功后就不能修改。若用户需修改一个任务,请先 删除 该任务后,再创建一个新任务,或直接创建一个新任务。创建后的任务,无论执行完成或执行失败,均不会自动从数据库中删除,须人为执行 删除 或 Clean 操作。
详细操作步骤如下:
- 
用户可执行如下命令行,查看 run的使用教程:./qscamel-xxxx run -h说明 qscamel-xxxx为工具下载后解压的文件名称,可根据实际情况进行修改。 命令行回显: Create or resume a task Usage: qscamel run [task name or task path] [flags] Flags: -h, --help help for run -t, --task string task path Global Flags: -c, --config string config path (default "~/.qscamel/qscamel.yaml")
- 
用户如需创建一个新的数据迁移任务,可执行如下命令行: ./qscamel-xxxx run task-name -t /path/to/task/file说明: qscamel-xxxx 为工具下载后解压的文件名称,可根据实际情况进行修改。 
- 
在任务文件没有更新的前提下,若用户需要恢复一个数据迁移任务,可执行如下命令行: ./qscamel-xxxx run task-name说明: - qscamel-xxxx 为下载后解压的文件名称,可根据实际情况进行修改。
- 由于该操作用于恢复一个历史任务,故 task-name须为原任务名。
- 由于任务文件没有更新,故命令行中省略了任务文件,qscamel 会自动调用历史任务文件。
- 命令行中也可添加原任务文件 -t /path/to/task/file,若添加该参数,则须确保任务文件没有变更,否则该操作会报错。
 
- 
更新任务文件后,再次创建该任务时,可执行如下操作: # step 1:删除任务 ./qscamel-xxxx delete task-name # step 2:创建任务 ./qscamel-xxxx run task-name -t /path/to/task/file
- 
若需要同时进行多个任务,可执行如下命令行: ./qscamel-xxxx run task-name1 -t example1-task.yaml -c example1-qscamel.yaml ./qscamel-xxxx run task-name2 -t example2-task.yaml -c example2-qscamel.yaml ……说明: 
Delete
用户可使用该命令删除一个已经创建的任务。
./qscamel-xxxx delete task-name
Status
该命令用于查询展示所有任务的状态。
./qscamel-xxxx status
Clean
用户可通过该命令删除所有已经完成的任务。
./qscamel-xxxx clean
Version
Version 命令用于查询当前 qscamel 的版本信息。
./qscamel-xxxx version
快速入门
- 
安装 qscamel 工具。 
- 
(可选)更新 qscamel 配置。 
- 
根据如下内容创建任务文件,并保存为 example-task.yaml:type: copy source: type: fs path: /path/to/source destination: type: qingstor path: /path/to/destination options: bucket_name: example_bucket access_key_id: example_access_key_id secret_access_key: example_secret_access_key说明 - 该任务即为:将本地目录 /path/to/source下的文件 copy 至 QingStor 对象存储的example_bucket下的/path/to/destination目录。
- access_key_id与- secret_access_key可参考 获取 Access Key。
 
- 该任务即为:将本地目录 
- 
执行如下命令,创建数据迁移任务: ./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file
- 
执行如下命令,查看数据迁移任务的状态: ./qscamel-xxxx status
端点信息
Endpoint qingstor
QingStor 是青云提供的对象存储服务。能够用做 qscamel 数据迁移任务中的 source 与 destination 端点。
使用 qingstor 作为端点时,可添加如下配置内容:
source:
  type: qingstor
  path: /path/to/source
	options:
  	protocol: https
  	host: qingstor.com
 		port: 443
  	zone: pek3b
  	bucket_name: example_bucket
  	access_key_id: example_access_key_id
  	secret_access_key: example_secret_access_key
  	user_define_meta: true
  	storage_class: STANDARD
  	disable_uri_cleaning: false
  	timeout_config: 
    	connect_timeout: 30
    	read_timeout: 30
    	write_timeout: 30
multipart_boundary_size: 2147483648
ignore_existing: last_modified
说明
path若迁移指定 bucket 内所有数据,该参数配置为path:/;若迁移指定目录/dir1/dir2下的数据,该参数配置为path:/dir1/dir2。若需迁移的数据较多,建议分成多个任务进行迁移,详细可参考 Run。
protocol用于控制访问 QingStor 对象存储的协议类型。可选值: https, http;默认值: https。
host标识访问 QingStor 对象存储的云服务器名。默认值: qingstor.com。
port标识访问 QingStor 对象存储的端口号。默认值: 443。
zone标识访问 QingStor 对象存储的区域。自动检测,无需手动配置。
bucket_name标识操作的 QingStor 对象存储的 Bucket 名称。无默认值,须手动配置。
access_key_idQingStor 对象存储的 access_key_id。无默认值,须手动配置。
secret_access_keyQingStor 对象存储的 secret_access_key。无默认值,须手动配置。
user_define_meta用于控制 QingStor 对象存储在迁移数据时是否同步迁移自定义元数据。源端点与目标端点均配置为true时,表示是。v2.0.21及以后版本支持。
storage_class标识 QingStor 对象存储所使用的存储级别。可选值: STANDARD, STANDARD_IA;默认值: STANDARD。
disable_uri_cleaning是否自动清理 url,默认为false,即转换abc//bcd为abc/bcd。
timeout_config请求过期时间.
connect_timeout连接过期时间,默认30秒。
read_timeout读过期时间,默认30秒。
write_timeout写过期时间,默认30秒。
multipart_boundary_size用于控制 QingStor 对象存储何时使用分段上传,单位为 Byte,当文件大于该数值时,将会使用分段上传。可选值: 1 ~ 5368709120 (5G)。默认值: 2147483648 (2G)。
ignore_existing用于控制是否跳过已经存在的文件,为空或未配置时将会禁用该配置,即总是覆盖。可选值为:last_modified 与 md5sum。
last_modified 将会检查目标的 LastModified 是否比源站要大;
md5sum 将会对文件做完整的 MD5 计算,当 MD5 相同时会跳过。- 综上,除
bucket_name,access_key_id与secret_access_key以外,均有默认值,故除此三个参数外,其他参数均为可选参数。
Endpoint s3
S3 是 AWS 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 source 和 destination 端点。
使用 s3 作为端点,可添加如下配置内容:
source:
  type: s3
  path: /path/to/source
	options:
  	bucket_name: example_bucket
  	endpoint: example_endpoint
  	region: example_region
  	access_key_id: example_access_key_id
  	secret_access_key: example_secret_access_key
  	disable_ssl: false
  	use_accelerate: false
  	path_style: false
  	enable_list_object_v2: false
  	enable_signatrue_v2: false
  	disable_uri_cleaning: false
说明
bucket_nameS3 的 Bucket 名称。
endpointS3 的接口端点地址。
regionS3 bucket 所在的区域。
access_key_id访问 S3 的 access_key_id。
secret_access_key访问 S3 的 secret_access_key。
disable_ssl是否禁用 SSL。
use_accelerate是否启用加速。
path_style是否强制请求使用路径样式寻址,即http://s3.amazonaws.com/BUCKET/KEY。默认为false,即使用http://s3.amazonaws.com/BUCKET/KEY。
enable_list_object_v2是否使用ListObjectsV2。默认为false,即使用ListObjects。
enable_signature_v2是否强制客户端使用v2.SignRequestHandler。默认为false,即使用v4.SignRequestHandler。
disable_uri_cleaning是否自动清理 url,默认为false,即转换abc//bcd为abc/bcd。
Endpoint aliyun
Aliyun 是阿里云提供的对象存储服务。可作为 qscamel 数据迁移任务中的 source 端点。
Aliyun 作为 source 端点时,须添加如下配置内容:
source:
  type: aliyun
  path: /path/to/source
	options:
  	endpoint: example_endpoint
  	bucket_name: example_bucket
  	access_key_id: example_access_key_id
  	access_key_secret: example_access_key_secret
说明
endpoint用于标识访问的接口端点地址。无默认值,须手动配置。
bucket_name标识操作的 Aliyun 的 Bucket 名称。无默认值,须手动配置。
access_key_idAliyun 的 access_key_id。无默认值,须手动配置。
secret_access_keyAliyun 的 secret_access_key。无默认值,须手动配置。
Endpoint fs
fs 是指符合 POSIX 标准的文件系统 (local fs, nfs, s3fs 等)。可作为 qscamel 数据迁移任务中的 source 端点与 destination 端点。
fs 作为端点有着如下配置内容,用于控制遇到软连接时,是否上传指向的文件。默认值为 false:
source:
  type: fs
  path: /path/to/source
	options:
  	enable_link_follow: false
Endpoint azblob
Azure Blob 是 Microsoft 提供的存储服务。可作为 qscamel 数据迁移任务中的 source 端点。
azblob 作为 source 端点时,须添加如下配置内容:
source:
  type: azblob
  path: /path/to/source
	options:
  	account_name: example_account_name
  	account_key: example_account_key
  	bucket_name: example_bucket
  	endpoint: example_endpoint
说明
account_name访问 Azure Blob 的账号。无默认值,须手动配置。
account_key访问 Azure Blob 的密码。无默认值,须手动配置。
bucket_name标识操作的 Azure Blob 的 Bucket 名称。无默认值,须手动配置。
endpoint用于标识访问的接口端点地址。无默认值,须手动配置。
Endpoint cos
Tencent COS 是 Tencent 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 source 端点。
COS 作为 source 端点时,须添加如下配置内容:
source:
  type: cos
  path: /path/to/source
	options:
  	bucket_url: example_bucket_url
  	secret_id: example_secret_id
  	secret_key: example_secret_key
说明
bucket_urlTencent COS 的 Bucket URL 地址。无默认值,须手动配置。
secret_id访问 Tencent COS 的 secret_id。无默认值,须手动配置。
secret_key访问 Tencent COS 的 secret_key。无默认值,须手动配置。
Endpoint filelist
filelist 是本地文件列表。可作为 qscamel 数据迁移任务中的 source 端点。
filelist 作为 source 端点时,须添加如下配置项,用于指定待迁移的文件列表,qscamel 将会逐行来读取该列表。
source:
  type: filelist
  path: /path/to/source
	options:
  	list_path: /path/to/list
Endpoint gcs
GCS(Google Cloud Storage) 是 Google 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 source 端点。
使用 gcs 作为 source 端点时,须添加如下配置项,
source:
  type: gcs
  path: /path/to/source
	options:
  	api_key: example_api_key
  	bucket_name: exmaple_bukcet
说明
api_key访问 GCS 的 api_key。无默认值,须手动配置。
bucket_nameGCS 的 bucket 名。无默认值,须手动配置。
Endpoint hdfs
能够用做 source 端点。
hdfs 是 Hadoop 的分布式文件系统,可作为 qscamel 数据迁移任务中的 source 端点。
使用 hdfs 作为 source 端点时,须添加如下配置项,
source:
  type: hdfs
  path: /path/to/source
	options:
  	address: example_address
Endpoint qiniu
Qiniu 是 Qiniu 提供的对象存储服务。可用作 qscamel 数据迁移任务中的 source 端点。
使用 qiniu 作为 source 端点,须添加如下配置内容:
source:
  type: qiniu
  path: /path/to/source
	options:
  	bucket_name: example_bucket
  	access_key: example_access_key
  	secret_key: example_secret_key
  	domain: example_domain
  	use_https: false
  	use_cdn_domains: false
说明
bucket_name标识 qiniu 的 bucket 名称。
access_key标识 qiniu 的 access_key。
secret_key标识 qiniu 的 secret_key。
domain标识用于访问 qiniu bucket 的域名。
use_https控制是否使用 https 来访问 qiniu。默认值: false。
use_cdn_domains控制是否使用 CDN 加速域名来访问 qiniu。默认值: false。
Endpoint upyun
upyun 是 Upyun 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 source 端点。
使用 upyun 作为 source 端点,须配置如下内容:
options:
  bucket_name: example_bucket
  operator: example_operator
  password: example_password
说明
bucket_nameupyun 的 bucket 名称。
operatorupyun 的 operator。
passwordupyun 的 password。
使用示例
将数据从 s3 迁移到 QingStor
- 
安装 qscamel 工具。 
- 
(可选)更新 qscamel 配置。 
- 
根据如下内容创建任务文件,并保存为 example-task.yaml:type: copy source: type: s3 path: /path/to/source options: bucket_name: bucket_name endpoint: s3.pek3b.qingstor.com region: pek3b access_key_id: s3_access_key_id secret_access_key: s3_secret_access_key disable_ssl: false use_accelerate: false path_style: false enable_list_object_v2: false enable_signatrue_v2: false disable_uri_cleaning: false destination: type: qingstor path: /path/to/destination options: protocol: https host: qingstor.com port: 443 zone: zone_id bucket_name: bucket_name access_key_id: qingstor_access_key_id secret_access_key: qingstor_secret_access_key storage_class: STANDARD disable_uri_cleaning: false timeout_config: connect_timeout: 30 read_timeout: 30 write_timeout: 30 multipart_boundary_size: 2147483648 ignore_existing: last_modified说明 - 该任务即为:将 s3 的 bucket_name下/path/to/source下的文件 copy 至 QingStor 对象存储的bucket_name下的/path/to/destination目录。
- options标识后续字段为可选字段。详情可参考 Endpoint s3 及 Endpoint qingstor。
- access_key_id与- secret_access_key可参考 获取 Access Key。
 
- 该任务即为:将 s3 的 
- 
执行如下命令,创建数据迁移任务: ./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file
- 
执行如下命令,查看数据迁移任务的状态: ./qscamel-xxxx status
将数据从QingStor同区域不同账户间进行迁移
使用源账户的AK/SK和目标账户的AK/SK
- 
安装 qscamel 工具。 
- 
(可选)更新 qscamel 配置。 
- 
根据如下内容创建任务文件,并保存为 example-task.yaml:type: copy source: type: qingstor path: /path/to/source options: protocol: https host: qingstor.com port: 443 zone: zone_id bucket_name: source_bucket access_key_id: source_access_key_id secret_access_key: source_secret_access_key storage_class: STANDARD disable_uri_cleaning: false timeout_config: connect_timeout: 30 read_timeout: 30 write_timeout: 30 destination: type: qingstor path: /path/to/destination options: protocol: https host: qingstor.com port: 443 zone: zone_id bucket_name: destination_bucket access_key_id: destination_access_key_id secret_access_key: destination_secret_access_key storage_class: STANDARD disable_uri_cleaning: false timeout_config: connect_timeout: 30 read_timeout: 30 write_timeout: 30 multipart_boundary_size: 2147483648 ignore_existing: last_modified说明 - 该任务即为:将QingStor 对象存储源账户的 source_bucket下/path/to/source下的文件 copy 至 QingStor 对象存储目标账户的destination_bucket下的/path/to/destination目录。
- options标识后续字段为可选字段。详情可参考 Endpoint qingstor。
- access_key_id与- secret_access_key可参考 获取 Access Key。- source字段的- access_key_id与- secret_access_key填写源账户的AK/SK,- destination字段的- access_key_id与- secret_access_key填写目标账户的AK/SK。
 
- 该任务即为:将QingStor 对象存储源账户的 
- 
执行如下命令,创建数据迁移任务: ./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file
- 
执行如下命令,查看数据迁移任务的状态: ./qscamel-xxxx status
仅使用目标账户的AK/SK
前提条件
源账户已授权目标账户可读访问权限。详细操作请参考存储空间访问控制 bucket-acl。
操作步骤
- 
安装 qscamel 工具。 
- 
(可选)更新 qscamel 配置。 
- 
根据如下内容创建任务文件,并保存为 example-task.yaml:type: copy source: type: qingstor path: /path/to/source options: protocol: https host: qingstor.com port: 443 zone: zone_id bucket_name: source_bucket access_key_id: destination_access_key_id secret_access_key: destination_secret_access_key storage_class: STANDARD disable_uri_cleaning: false timeout_config: connect_timeout: 30 read_timeout: 30 write_timeout: 30 destination: type: qingstor path: /path/to/destination options: protocol: https host: qingstor.com port: 443 zone: zone_id bucket_name: destination_bucket access_key_id: destination_access_key_id secret_access_key: destination_secret_access_key storage_class: STANDARD disable_uri_cleaning: false timeout_config: connect_timeout: 30 read_timeout: 30 write_timeout: 30 multipart_boundary_size: 2147483648 ignore_existing: last_modified说明 - 该任务即为:将 QingStor 对象存储源账户的 source_bucket下/path/to/source下的文件 copy 至 QingStor 对象存储目标账户的destination_bucket下的/path/to/destination目录。
- options标识后续字段为可选字段。详情可参考 Endpoint qingstor。
- access_key_id与- secret_access_key可参考 获取 Access Key。- source字段的- access_key_id与- secret_access_key,- destination字段的- access_key_id与- secret_access_key均填写目标账户的AK/SK。
 
- 该任务即为:将 QingStor 对象存储源账户的 
- 
执行如下命令,创建数据迁移任务: ./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file
- 
执行如下命令,查看数据迁移任务的状态: ./qscamel-xxxx status