并行rsync


30

经过反复试验,我只是移动并发现在我的房屋和远程服务器之间的某个地方,正在发生一些节流...但是节流不是很聪明。它仅限制单个连接。因此,如果我复制一个1 GB的文件,它将以150 kBps的速度愉快地进行。但是,如果我初始化10个副本,则每个副本将以150 kBps的速度运行(即,我通过多个连接获得了更高的聚合带宽)。

我经常使用rsync将一些大型数据集从工作同步到家中(幸运的是以许多文件的形式)。有没有办法告诉rsync使用多个连接下载?从理论上讲应该是可行的,因为据我所知,rsync首先进行一次传递以确定必要的更改,然后执行实际的传输。如果有一种神奇的方法告诉rsync将单个文件切成N个片段,然后将它们重新拼接在一起,便可以得到奖励。我相信CuteFTP实际上足够聪明,可以实现这一目标。

Answers:


13

我只是有一个类似的问题,必须将数个TB的存储空间从一个NAS移到另一个NAS,而没有备份/恢复功能,这将使我只能将1个数据集馈送到另一个NAS。

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

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

我想到的另一个可能的选项是:在--list-only模式下运行rsync。

这将为您提供所有需要更新的文件,然后如果您使用xargs管理您要进行的rsync的数量,则对列表中的每个文件运行1 rsync,这可能非常优雅。实际上,可能是比我这里的小脚本更优雅的解决方案...

#! /bin/bash
SRC_DIR=$1
DEST_DIR=$2
LIST=$3
CPU_CNT=`cat /proc/cpuinfo|grep processor |wc -l`
#  pseudo random heuristic
let JOB_CNT=CPU_CNT*4
[ -z "$LIST" ] && LIST="-tPavW --exclude .snapshot --exclude hourly.?"
echo "rsyncing From=$SRC_DIR To=$DEST_DIR DIR_LIST=$LIST"
mkdir -p /{OLD,NEW}_NAS/home
[ -z "$RSYNC_OPTS" ] && RSYNC_OPTS="-tPavW --delete-during --exclude .snapshot --exclude hourly.?"
cd $SRC_DIR
echo $LIST|xargs -n1 echo|xargs -n1 -P $JOB_CNT -I% rsync ${RSYNC_OPTS} ${SRC_DIR}/%/ ${DEST_DIR}/%/

2
这行得通-您可以对其工作方式进行很多改进,但是使用xargs并行化应用程序的概念非常新颖。
MattPark 2013年

6

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/

1
您介意将“示例:并行化rsync”部分粘贴到您的答案中吗?以防万一将来链接断开。
picobit

3

是。存在这样的特征。

有一个称为pssh的实用程序,提供了所描述的功能。

该软件包提供了openssh工具的并行版本。包括在发行版中:

  • 并行SSH(PSSH)
  • 并行SCP(PSCP)
  • 并行rsync(prsync)
  • 平行核(Pnuke)
  • 平行饮(pslurp)

我不确定设置起来有多容易,但可能就可以解决问题!


26
pssh实用程序用于在多个服务器上分布命令,而不是在一台服务器上多次执行同一命令。特别是,prsync仅支持将本地计算机上的文件发送到多台外部计算机。它不支持下载具有多个连接的远程文件。
Derek Dahmer

1
鉴于@DerekDahmer的评论,此答案的发布者可能希望撤回它?
mc0e

3

我无法发表评论,因此我添加了一个新答案,它的代码比以前的(漂亮而精巧的)代码要好一些

检查该rsync行,因为它包含可选的ionice调整项。

#!/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
DST_BASE=user@hostname.domain.local:/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下列出的“并行大文件”版本更好的实现:

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

另外,lftp可以通过ftp,ftps,http,https,hftp,fish,sftp并行化文件传输。很多时候,使用lftp会有一些优势,因为为rsync管理权限,限制访问等可能会充满挑战。


在这种情况下,它可能会迅速导致大量磁盘碎片,因为您不只是使用多个连接来下载同一文件。
bparker

1

否。不存在此类功能。rsync如果确实需要,可以将同步分为多个调用。

我建议您找到造成此速率限制的原因,并与维护/管理它的人进行认真的交谈。


4
这些限制通常来自Comcast之类的ISP。与他们进行任何合理的对话,祝您好运。
詹姆斯·摩尔

1

我想同时传输几个目录(包含许多文件),所以我创建了这个小脚本:

#!/bin/bash
# Transfer files in parallel using rsync (simple script)
# MAXCONN: maximum number "rsync" processes running at the same time:
MAXCONN=10
# Source and destination base paths. (not need to end with "/")
SRC_BASE=/home/sites
DST_BASE=user@example.com:/var/www
RSYNC_OPTS="--stats -ilrtpog"
# 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 10
    done
    DIR=`basename $FULLDIR`
    rsync $RSYNC_OPTS $SRC_BASE/${DIR}/ $DST_BASE/${DIR}/ & 
    sleep 1 
done
echo "Done."

我非常快地完成了此脚本,因此在生产环境中使用之前,请对其进行修改和测试


0

我创建了以下脚本来并行上传许多带有图片的文件夹。首先运行同步目标,然后复制所有文件夹名称。

#!/bin/sh

dest="$1"
shift

if [ "$dest" = "" ]; then
    echo "USAGE: $0 TARGET:/foo/bar <dir1> [dir2] [dir3]"
    exit 1
fi

RCol='\x1B[0m' # Text Reset
BYel='\x1B[1;33m';

for i in "$@"; do
    prefix=`printf "$BYel%50s:$RCol" "$i"`
    echo "$prefix * Starting $i"
    echo "$prefix -> syncing '$i/' to '$dest/$i/'"
    (rsync -rv "$i/" "$dest/$i/") 2>&1 | sed "s/^/$prefix /g" &
    sleep 0.5
done

echo "* Waiting for all to complete"
wait

它在所有rsync控制台输出的黄色文件夹名称之前添加前缀,以使其看起来很漂亮。


-1

Aria2是一个很好的客户端程序,可以使用来自许多镜像的许多连接下载数据。它不支持SFTP。因此,我已经安装了FTP服务器-vsftpd。我的3g连接可以通过5个与FTP服务器的连接全功率工作。


1
您是否愿意对此进行扩展以使您的答案有用?
Tog 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.