如何利用历史构建目录优化rsync基于SSH的传输效率?
核心方案:使用--link-dest参数
完全可以实现你的需求,rsync的--link-dest参数就是专门用来解决这类场景的。它允许rsync在远程端对比指定的历史目录,只传输与历史目录存在差异的文件;对于完全相同的文件,会直接在目标目录创建硬链接指向历史目录中的对应文件,既节省传输带宽,又能减少远程存储占用。
假设你要上传的是2023_02_02目录,远程的历史参考目录是builds/2023_02_01,可以修改命令为:
rsync -avzh -e "ssh" --link-dest=../2023_02_01 ./builds/2023_02_02 akamaicdn:builds/2023_02_02
这里../2023_02_01是相对远程目标目录builds/2023_02_02的路径——因为目标目录在builds目录下,上一级就是builds根目录,刚好能访问到前一天的历史目录。如果远程历史目录的绝对路径更明确,也可以直接写绝对路径,比如--link-dest=/home/user/builds/2023_02_01,避免路径歧义。
其他优化方案
本地预创建增量快照:如果本地也保留了每日构建目录,可以先在本地用硬链接生成当日目录的增量快照,再传输这个快照,能进一步减少本地存储占用:
cp -al ./builds/2023_02_01 ./builds/2023_02_02-snapshot rsync -avzh -e "ssh" --link-dest=../2023_02_01 ./builds/2023_02_02-snapshot akamaicdn:builds/2023_02_02传输时rsync会同时对比本地快照和远程历史目录,最大程度减少需要传输的文件量。
按需禁用压缩:如果你的网络带宽充足,
-z参数的压缩操作会消耗两端的CPU资源,可以去掉-z来提升传输速度。中断续传支持:添加
--partial --partial-dir=.rsync-partial参数,传输中断时未完成的文件会暂存到.rsync-partial目录,下次传输时直接续传,无需重新上传整个大文件。预校验传输内容:用
--dry-run参数模拟传输流程,提前查看哪些文件会被传输,确认配置是否正确:rsync -avzh -e "ssh" --link-dest=../2023_02_01 --dry-run ./builds/2023_02_02 akamaicdn:builds/2023_02_02
内容的提问来源于stack exchange,提问作者videoguy

