如何使用rsync迁移大文件?

场景:将本地Mac端数据传输至Linux服务端

本人将12G本地单文件(12G大小h5文件数据集)向Linux服务器进行大文件上传时传输失败。最初使用 scp 命令或 rsync 直接对大文件进行传输,会出现网络断开或服务器端管道破裂情况,而且一次性无法传输的话也会耗费很多时间。

步骤

为了解决此问题,可分为以下步骤进行操作:

# 打包压缩大文件
zip -r archive.zip ./bigfile

# 可选:将压缩包拆分成1G文件
# -b后输入子节 若要拆分为1G文件块 1G=1073741820 byte
split -b 1073741820 archive.zip archive_split

# 此时文件会分为很多带有字母后缀的archive_split{a, b..}之类的文件 对其进行rsync传输

# 在服务器端对传输来的文件块进行合并
cat archive_split* > new_archive.zip

rsync传输

# 传输文件
# -P,----partial     断点续传(保留那些因故没有完全传输的文件,以便加快随后的再次传输)
# -e                 以ssh方式进行数据传输, ssh -p2222 指定连接2222端口
# --progress         显示传输进度
# --bwlimit            限速, 字节/秒
# -r,--recursive     对子目录以递归模式处理
# -c, --checksum     打开校验开关,强制对文件传输进行校验。
# --delete             删除那些DST中SRC没有的文件。
# -z, --compress     对备份的文件在传输时进行压缩处理。
# --exclude=PATTERN 指定排除不需要传输的文件模式。
# --include=PATTERN 指定不排除而需要传输的文件模式。
# -v, --verbose 详细模式输出。
# -q, --quiet 精简输出模式。
# -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

# 在本地执行,将本地Mac端数据同步至远程Linux服务端
rsync -P -e "ssh -p2222" --progress --compress ./archive_split* root@ip:/xxx/xxx/

解释一下上面执行命令的参数:

  • -P支持断点续传,网络传输中网络断开是肯可能发生的
  • --progress显示进度,方便肉眼观察
  • --compress对备份文件在传输时进行压缩处理

那么以上场景适用于在本地Mac端将数据分块传输给服务器Linux端,之所以要给本地Mac端数据进行分开,是因为在实际场景中,我的本机上传带宽本来很高,但是服务端的下载带宽较低,反而成了瓶颈。

场景:将Linux服务端数据传输至本地Mac端

2022-12-27日更新:除此之外,我也遇到了新的场景,就是将服务器端的数据拷贝到我本地,因此我依旧对上述服务器端部分的数据进行了分块处理,只不过rsync这里稍有不同:

# 在本地执行以下命令,通过ssh登陆远程,将远程Linux服务端数据同步至本地Mac端文件下
rsync -av -e 'ssh -p [port_num]' gc@ip:/filepath/xxx/archive_splitaa ./
rsync -av -e 'ssh -p [port_num]' gc@ip:/filepath/xxx/archive_splitab ./
rsync -av -e 'ssh -p [port_num]' gc@ip:/filepath/xxx/archive_splitac ./
....

注意,上面的指令在服务端路径指定文件时,如果直接改为使用通配符 * 匹配,那就会报错,找不到对应文件,命令也不会执行成功,所以需要一个文件一个文件的指定,熟悉Shell脚本的同学也可以编写脚本去执行,省的每一次传输完一个块儿,又要去手动执行rsync继续传输另一个块。

由于从服务器端下载数据时,发现我这边下载带宽达到了平均8M/s,所以其实带宽并没有成为传输的瓶颈,传的还蛮快的,最后发现也不需要分那么多块去传输,split -b可以分的块大一些。

参考资料

posted @ 2022-09-12 11:23  miseryjerry  阅读(1705)  评论(0编辑  收藏  举报