You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

大数量大体积文件通过rsync跨网传输的提速及安全方案咨询

大数量大体积文件通过rsync跨网传输的提速及安全方案咨询

Hi Khaled, 碰到这种大量大体积文件跨网传输的慢问题确实头疼,结合你的场景(AWS到本地数据中心,200MB带宽,rsync速率掉得厉害),我整理了几个实用的提速+安全方案,你可以根据实际情况尝试:

一、先优化rsync本身的参数(最快见效)

rsync默认配置其实不太适合跨网大文件/多文件传输,尤其是它的校验机制和SSH加密开销会拖慢速度,你可以试试这些参数组合:

  • 调整块大小+禁用不必要校验:如果是首次全量备份,不需要对比本地和远端的文件差异,直接用
    rsync -av --no-checksum --block-size=4M -e 'ssh -o Compression=no -o Ciphers=aes128-gcm@openssh.com' user@aws-server:/path/to/backups/ /local/backup/path/
    
    • --block-size=4M:大文件用更大的块减少校验次数,比默认的32KB效率高很多
    • --no-checksum:跳过文件哈希校验(首次备份不需要,增量备份再去掉这个参数)
    • SSH参数:禁用SSH压缩(避免重复压缩浪费CPU),改用更轻量的加密算法,减少加密带来的CPU负载
  • 并行传输多文件:rsync默认单线程,多文件场景下可以用parallel工具配合,比如
    ls /remote/backup/path/ | parallel -j 5 rsync -av --block-size=4M -e 'ssh -o ...' user@aws-server:/remote/backup/path/{} /local/path/
    
    -j 5表示同时开5个rsync进程,根据你的CPU和带宽调整数量,别开太多导致资源耗尽

二、先打包再传输(解决多文件TCP连接开销)

1000+小文件的话,每个文件都要建立TCP连接、做校验,开销极大,打包成大文件能大幅提升传输效率:

  • 在AWS服务器上打包备份文件:如果备份已经是压缩格式(比如.gz/.xz),直接打包成tar包就行
    tar -cf backup_batch_$(date +%Y%m%d).tar /path/to/backups/
    
    如果备份未压缩,用zstd做轻量压缩(比gzip快,压缩率也不错)
    tar -c -I zstd -f backup_batch_$(date +%Y%m%d).tar.zstd /path/to/backups/
    
  • 然后用优化后的rsync传输这个大文件:
    rsync -av --no-checksum --block-size=4M -e 'ssh -o Compression=no -o Ciphers=aes128-gcm@openssh.com' user@aws-server:/path/to/backup_batch_*.tar.zstd /local/path/
    
  • 传输完成后在本地解压:tar -xf backup_batch_*.tar.zstd(如果用zstd的话需要先装zstd工具)

三、换用更适合大文件的传输工具

如果rsync优化后还是不够快,可以试试这些工具,它们在跨网大文件传输上做了更多优化:

  • rclone:非常适合云存储到本地的同步,支持AWS S3(如果你的备份存在S3的话),自带多线程、带宽优化,安全方面支持加密传输。比如先把AWS服务器的备份同步到S3,再从S3同步到本地:
    rclone sync aws_s3:your-backup-bucket /local/backup/path --transfers=10 --checkers=20 --fast-list
    
    --transfers控制并行传输数,--fast-list减少S3 API调用,提升列表效率
  • aria2c:多线程下载工具,如果能把备份文件放到S3并生成预签名HTTPS URL,用
    aria2c -x 10 -s 10 https://your-presigned-s3-url/backup.tar.zstd
    
    -x是线程数,-s是分块数,能充分利用你的带宽,而且HTTPS本身是安全的

四、网络层面的优化(从底层提升带宽利用率)

  • 启用TCP BBR拥塞控制:跨网长距离传输时,默认的TCP拥塞算法(比如CUBIC)容易丢包、降速,BBR能更好地利用带宽。在AWS服务器和本地服务器上都执行:
    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    sysctl -p
    
  • 测试链路带宽:用iperf3测试AWS到本地的实际带宽,AWS上跑iperf3 -s,本地跑iperf3 -c aws-server-ip -P 10,看多线程带宽能不能接近你的200MB(约25MB/s),如果差很多,可能是链路瓶颈,需要联系运营商或AWS排查

安全注意事项

不管用哪种方法,都要确保传输是加密的:

  • 用rsync/scp时,始终通过SSH传输(默认就是),不要用明文的rsync协议
  • 用rclone/aria2时,用HTTPS或加密的云存储协议
  • 避免在命令行里明文写密码,用SSH密钥登录或者配置文件存储凭证

备注:内容来源于stack exchange,提问作者Khaled Hussein

火山引擎 最新活动