并行化 rsync

并行化 rsync

我刚刚搬家,经过反复试验后发现,在我家和远程服务器之间的某个地方,存在一些限制……但限制不是很智能。它只会限制单个连接。因此,如果我复制一个 1 GB 的文件,它将以 150 kBps 的速度顺利进行。但如果我初始化 10 个副本,每个副本的速度都会达到 150 kBps(即,我通过多个连接获得了更高的总带宽)。

我经常使用 rsync 将一些大型数据集从工作地点同步到家中(幸运的是,这些数据集以许多文件的形式存在)。有没有办法告诉 rsync 使用多个连接进行下载?理论上应该可以,因为据我所知,rsync 首先会确定必要的更改,然后执行实际传输。如果有一种神奇的方法可以告诉 rsync 将单个文件切成 N 块,然后再将它们拼接在一起,那就更好了。我相信 CuteFTP 实际上足够聪明,可以做到这一点。

答案1

我刚刚遇到了类似的问题,必须将几 TB 的数据从一个 NAS 移动到另一个 NAS,并且没有备份/恢复功能,这使得我只能将一组数据提供给另一组。

因此我编写了这个脚本,使用 xargs go 对遇到的每个目录运行多个 rsync。这取决于能否列出源目录(小心避开 ARG 3),但我认为您可以使用非递归 rsync 设置该阶段,该阶段仅将文件和目录复制到适当的级别。

它还根据处理器的数量确定运行多少个 rsync,但您可能需要对其进行调整。

#!/bin/bash
start_time=$(date +%s.%N)
# Transfer files in parallel using rsync (simple script)
# MAXCONN: maximum number "rsync" processes running at the same time:
MAXCONN=6
# Source and destination base paths. (not need to end with "/")
SRC_BASE=/home/user/public_html/images
[email protected]:/home/user/public_html/images
RSYNC_OPTS="-ah --partial"
# Main loop:
for FULLDIR in $SRC_BASE/*; do
    NUMRSYNC=`ps -Ao comm | grep '^'rsync'$' | wc -l `
    while [ $NUMRSYNC -ge $MAXCONN ]; do
        NUMRSYNC=`ps -Ao comm | grep '^'rsync'$' | wc -l `
        sleep 1
    done
    DIR=`basename $FULLDIR`
    echo "Start: " $DIR
    ionice -c2 -n5 rsync $RSYNC_OPTS $SRC_BASE/${DIR}/ $DST_BASE/${DIR}/ &
    # rsync $RSYNC_OPTS $SRC_BASE/${DIR}/ $DST_BASE/${DIR}/ &
    sleep 5
done

execution_time=$(echo "$(date +%s.%N) - $start" | bc)
printf "Done. Execution time: %.6f seconds\n" $execution_time

答案2

GNU Parallel 有一个解决方案。 

我已经通过 1 Gbps 移动了 15 TB,它会使 1 Gbps 链路饱和。

下面将在服务器 fooserver 上针对 src-dir 中的每个大文件到 dest-dir 启动一个 rsync:

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{}

创建的目录可能最终具有错误的权限,并且较小的文件无法传输。要修复这些问题,请最后一次运行 rsync:

rsync -Havessh src-dir/ fooserver:/dest-dir/

答案3

是的。有这样的功能。

有一个名为密码提供所述功能。

此软件包提供了 openssh 工具的并行版本。发行版中包含:

  • 并行 ssh (pssh)
  • 并行 scp (pscp)
  • 并行 rsync (prsync)
  • 平行核弹 (pnuke)
  • 并行 slurp (pslurp)

我不确定设置起来有多么简单,但它可能确实有用!

答案4

似乎有人为你编写了这个实用程序。它将传输分解为并行块。这比 GNU Parallel 下列出的“并行大文件”版本更好:

https://gist.github.com/rcoup/5358786

此外,lftp 还可以并行通过 ftp、ftps、http、https、hftp、fish、sftp 进行文件传输。很多时候,使用 lftp 有一些优势,因为管理 rsync 的权限、限制访问等可能具有挑战性。

相关内容