以前同步数据习惯用rsync,最近使用AWS的Transfer Family服务,即SFTP,发现rsync无法用了,因为必须结合ssh,但是SFTP跟ssh不一样。曾经尝试将sftp挂载为本地盘使用rsync,但是发现这样的挂载不稳定,sftp会莫名断开。查询后发现rclone,测试后发现也不错。
安装:
sudo apt install unzip
sudo -v ; curl https://rclone.org/install.sh | sudo bash
这种安装方式会自动安装最新版,如果使用ubuntu命令安装:apt install rclone
默认安装的是1.50.2的旧版,这个版本会有很多莫名其妙的问题。例如与sftp使用key验证的时候,会提示:failed to parse private key file: ssh: key is not password protected
安装完成后,查看版本信息:
rclone --version

输入安装命令:sudo -v ; curl https://rclone.org/ | sudo bash后,如果提示rclone.org网站证书有问题,则可能是curl太旧导致,需要更新curl
在Synology NAS中安装rclone
在Synology或者其它Linux下安装的话,可以先下载安装包然后将rclone copy到对应目录下即可。
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64
##将rclone copy到对应文件夹
sudo cp rclone /usr/bin/
sudo chown root:root /usr/bin/rclone
sudo chmod 755 /usr/bin/rclone
##验证
which rclone
rclone配置
##创建配置文件是交互式,按照提示一步步输入即可
rclone config
##完成后的配置文件可通过命令找到保存位置:
rclone config file
##具体文件内容,后续可以通过修改文件实现更改配置的目的
vim /config-file-path
##这里最后一行我添加了1条规则,忽略修改S3云端文件创建时间,不然报错
set_modtime = false


具体命令:
rclone copy -P --no-update-modtime --size-only /share/Test/ aff:/Test/
解析:
-P 即显示过程,类似rsync -v
--no-update-modtime --size-only 无法根据文件修改时间检查是否同步,因为sftp上的时间是文件上传时间,始终跟本地上文件的时间不一致,如果不加会导致文件不断被重复上传,因此改为通过检查文件大小来决定是否同步旧文件,因为文件如果被修改过,size肯定会发生变化
/share/Test/ 指定本地需要同步的文件夹
aff:/Test/ aff是创建的配置的名字,:/Test/是SFTP上对应的文件夹
文件或文件夹过滤
--filter-from filter-list.txt
- /dir1/
- /dir2/
- **
这里- 或者 + 表示包括+ 还是排除 - 的意思
##查看远程连接目录
rclone lsd remote:
安装的时候如果提示这个错误:
unzip: invalid option -- 'a' BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) multi-call binary.
表示本机当前没有安装unzip,通过 apt install unzip 安装即可
参数
--transfers=30: 默认同时传输4个文件,用此参数指定同时传30个文件,适用大量小文件需要上传的情况
--no-traverse:不检查远程服务器端是否已有本地文件,能加速本地数据上传,但是会导致数据重复传
--multi-thread-streams=5: 单线程和5线程,对比如下,适用需要上传大文件大情况
--inplace: 不产生临时文件
--min-age 1d: 传输超过1天的旧文件(即不传最新的文件)
--max-depth 3: 检查文件夹的层级,例如此为检查当前文件夹下3层内文件夹,超过的话则不同步
rclone sync
-delete-during: 如果源中文件已删除,则目的文件也删除,保持2边一致
rclone sync -P --delete-during --no-update-modtime --size-only --transfers=60 sync: /test-us-east-1/
--checkers=80:多线程对比文件
--fast-list: 快速扫描,实际测试不如checkers快
--no-traverse --retries 1:当目标端存在大量文件的时候,只检测源端而不检查目标端,不作对比,这样节省同步对比文件的时间,加上retries是防止中断时所有文件又重新再传一遍
2025-1-17 遇到一个新情况,配置pem文件,确认是正确的,也重新生成了几次,但是用同步命令时,却提示:failed to parse private key file ssh: no key found
目前原因未明,通过修改参数中的key_pem, 为 key_file, 使用默认生成的rsa key解决
优化建议
##并发与带宽优化
--transfers=30 # 已经设了30个并发传输,根据实际带宽和目标存储能力可调整
--checkers=16 # 增加检查并发数(默认8),加快文件比对速度
--buffer-size=64M # 增大每个传输的内存缓冲(默认16M)
--s3-upload-concurrency=8 # 如果目标是S3,增加分片上传并发
--s3-chunk-size=64M # S3分片大小,大文件场景下增大可减少请求数
##网络稳定性
--retries=5 # 失败重试次数(默认3)
--retries-sleep=10s # 重试间隔,避免瞬间重试打爆服务端
--low-level-retries=10 # 底层HTTP重试
--timeout=300s # 连接超时,大文件传输适当加大
--contimeout=60s # 连接建立超时
##性能调优
--fast-list # 用更少的API调用获取目录列表(适合大量文件场景,会多用内存)
--multi-thread-streams=4 # 单个大文件多线程下载
--no-traverse # 如果源文件数远少于目标文件数,跳过目标目录遍历
##size-only的风险,如果只是日志文件(只追加不修改),--size-only 没问题
--size-only #只比较文件大小,如果文件内容变了但大小没变就会漏传。如果数据完整性要求高,建议改用:
--checksum # 用校验和比对,最准确但最慢
##日志与监控
--log-file=rclone.log # 输出日志到文件,方便排查
--log-level=NOTICE # 日志级别,调试时用 DEBUG
--stats=30s # 统计信息输出间隔
8150

被折叠的 条评论
为什么被折叠?



