Rclone异网迁移600T对象存储数据
需求:
业务发展需求,从公有云(移动云)上把近600T数据(低频存储),迁移到线下私有对象存储(深信服厂商);
迁移准备:
迁移工具选择:考虑到费用问题,使用开源工具Rclone,在源端公有云上架设服务器作为Rclone部署使用;
网络准备:源端(公有云)->目标端(本地),复用之前专线线路;
方案拓扑:

公有云Rclone主机配置:8C16G 100G系统盘,操作系统centos7.9 2m弹性IP(用于远程操作)
密钥:源和目的端对象存储access_key_id、secret_access_key,提前准备好
endpoint:源和目的端
本地转发服务搭建:
本文采用的是IPTABLES做转发,不做过多赘述,使用其他工具也可以。
源端对象名称导出和整理:
1、因源端对象约:1500多万个,采用rclone --files-from 方法进行迁移,并先获取源对象存储的对象名称,可以使用rclone,或其他工具进行导出
rclone ls source-region:ksgxx > eostitle.txt
2、因rclone服务器性能问题,单次加载txt服务器性能有限,对eostitle.txt进行切割;
a、推荐工具:txt文本在线拆分工具:https://www.lddgo.net/file/text-file-split
b、切割成多个txt,分别引用

Rclone服务搭建:
1、官网下载:https://rclone.org/downloads/ ,根据操作系统选择对应的版本进行安装,如下图表示已完成安装;

2、正确安装后,进行rclone配制,可以选择命令步骤一步一步走,也可以使用配置文件,本文直接配置文件进行配置,默认目录在: /root/.config/rclone/rclone.conf
3、进行配置,并验证:
# 源端 [source-region] type = s3 provider = ChinaMobile access_key_id = ********** secret_access_key = ********** endpoint = eos-wuxi-5-internal.cmecloud.cn # 添加以下兼容性参数 list_chunk = 500 no_head = true no_check_bucket = true # 目的端 [target-region] type = s3 provider = Other access_key_id = ********** secret_access_key = ********** endpoint = http://oss1.local.cloud.scp:12001 # 添加以下兼容性参数 list_chunk = 500 no_head = true no_check_bucket = true [root@eos-qianyi-test ~]#
进行验证配置是否成功,能罗列出桶就表示配置成功,可以下一步走:
[root@eos-qianyi-test ~]# rclone lsd source-region: -1 2023-01-04 09:34:43 -1 ksgxx [root@eos-qianyi-test ~]# rclone lsd target-region: -1 2024-11-26 13:54:07 -1 ksgxx [root@eos-qianyi-test ~]#
4、搭配命令进行迁移,需要注意下,需要不断的调配参数,适用当前服务器和网络环境即可,不能因为迁移影响其他业务;
rclone copy source-region:ksgxx target-region:ksgxx -P -v --checksum --checkers 7 --progress --transfers 7 --retries 3 --no-traverse --no-check-dest --files-from /var/eos/new1/1.1.txt --config ./.config/rclone/rclone.conf --log-file /var/log/eos1.2.log
注意点:--transfers 7 --checkers 7 传输并发,根据自己服务器来做调整。

5、若有多台服务器,可以多跑些,至此,等上一个进程完备,依次引用txt文件即可。
Rclone参数说明
copy 指令与 sync 指令在多数场景下迁移效果是一样的,唯一的区别是 copy 指令不会删除目的桶中的对象。如果期望迁移前后数据完全一致,建议使用 sync 指令。
--checkers N,表示同时有 N 个 checker 并发执行。在迁移/同步的过程中,checker 用于比较源端和目的端的对象是否相同,默认值为 8。
--transfers N,表示同时有 N 个 transfer 并发执行。在迁移/同步的过程中,transfer 用于实际的对象传输,默认值为 4。
--retries N,表示如果操作失败,重试 N 次,默认值为 3。
--checksum,携带此参数时,checker 通过对象的哈希值和大小来判断两个对象是否相同。不携带不会报错。
--fast-list,携带此参数时,迁移工具会尝试一次性地读取所有的对象信息并索引到内存中,此时对象数据会处理的更快, 代价是使用更多的内存。实际使用中,对于以桶为单位的迁移任务,可以按照桶中每个对象占用 1k 内存进行粗略估计,如果估算值不超过物理内存,建议携带此参数。
如果对分块上传有特殊要求,可以使用以下参数:
--s3-upload-cutoff,对象大于这个值时会使用分块上传。默认值是 200Mi,最大值是 5GiB,最小值是 0 表示永远使用分块上传。
--s3-chunk-size,在对象大小大于 s3-upload-cutoff 时,使用分块上传,这个值用来指定分块大小。默认值是 5Mi。
如果需要对迁移任务中间状态、带宽使用等进行管控,或者需要对命令进行一定的调试,可以在执行命令时使用以下参数:
--dry-run,执行一次尝试性的操作;该操作不会产生实际的影响,在调试命令时会比较有用。
--progress,携带此参数时,在迁移过程中会在终端上打印传输的实时概况,每 500ms 刷新一次;可以用于追踪迁移/同步进度。
--bwlimit,此参数用来控制迁移服务的带宽使用。上行和下行的带宽可以一起控制,比如:--bwlimit 10M 表示限制上下行带宽为 10 MiByte/s;也可以对上行和下行的带宽分开控制,比如:--bwlimit 10M:100k,表示限制上行带宽为 10 MiByte/s,下行带宽为100 KiByte/s。也可以使用off表示不限制带宽,比如:--bwlimit 10M:off,表示只限制上行带宽为 10 MiByte/s。
踩得坑:
1、本地对象存储通过转发服务器来转发,Rclone服务器加hosts解析
[root@eos-qianyi-test ~]# more /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.53.2.215 oss1.local.cloud.scp
2、在配置rclone迁移命令时,少加--no-traverse --no-check-dest,一直报源端错误,如下:
2025/04/02 14:52:08 ERROR : S3 bucket ksgxx: error reading source root directory: operation error S3: ListObjects, https response error StatusCode: 200, RequestID: b3636d49-4999-4261-8c03-35dfefda5cc9-0067ecde98-1b4442282-wuxi5-zone1, HostID: 1b4442282-wuxi5-zone1-wuxi5, deserialization failed, failed to decode response body, XML syntax error on line 1: illegal character code U+0002 2025/04/02 14:52:08 ERROR : Attempt 1/3 failed with 1 errors and: operation error S3: ListObjects, https response error StatusCode: 200, RequestID: b3636d49-4999-4261-8c03-35dfefda5cc9-0067ecde98-1b4442282-wuxi5-zone1, HostID: 1b4442282-wuxi5-zone1-wuxi5, deserialization failed, failed to decode response body, XML syntax error on line 1: illegal character code U+0002
3、--transfers 7 --checkers 7 传输并发参数设置,刚开始都调到32,Rclone服务器CPU直接到400%,需要不断的磨合尝试,调到最优值;
4、txt文本文件格式问题,通过以下命令来核实,建议改成文件编码utf-8,可以以上通过在线工具切割https://www.lddgo.net/file/text-file-split
检查:grep -l $'\x02' file.txt