rsync 병렬화


30

몇 번의 시행 착오 끝에 집과 원격 서버 사이에 스로틀이 발생하지만 스로틀이 지능적이지 않다는 것을 알았습니다. 개별 연결 만 조절합니다. 따라서 1GB 파일 하나를 복사하면 150kBps에서 잘 진행됩니다. 그러나 10 개의 복사본을 초기화하면 각각의 사본은 150kBps가됩니다 (즉, 여러 연결을 통해 훨씬 더 높은 총 대역폭을 얻습니다).

나는 rsync를 상당히 자주 사용하여 직장에서 집으로 (많은 파일 형태로) 큰 데이터 세트를 동기화합니다. 여러 연결을 사용하여 rsync에 다운로드하도록 지시하는 방법이 있습니까? 이론적으로는 rsync가 먼저 필요한 변경을 결정하기 위해 패스를 수행 한 다음 실제 전송을 수행하기 때문에 가능해야합니다. rsync에게 개별 파일을 N 조각으로 자르고 다시 결합하도록 지시하는 마법의 방법이 있다면 보너스 포인트. 나는 CuteFTP가 실제로 그것을 없애기에 충분히 똑똑하다고 생각합니다.

답변:


13

방금 한 세트를 다른 세트로 공급할 수있는 백업 / 복원 기능이없는 한 NAS에서 다른 NAS로 여러 TB를 이동해야하는 비슷한 문제가있었습니다.

따라서이 스크립트는 각 디렉토리마다 1 개의 rsync를 실행하도록 작성했습니다. 소스 디렉토리를 나열 할 수 있는지에 달려 있지만 (ARG 3을 피하십시오) 파일과 디렉토리를 적절한 수준으로 복사 한 비 재귀 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

6

GNU Parallel에는 해결책이 있습니다. 

1Gbps를 통해 15TB를 이동했으며 1Gbps 링크를 포화시킬 수 있습니다.

다음은 서버 fooserver에서 src-dir의 큰 파일 당 하나의 rsync를 dest-dir로 시작합니다.

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

작성된 dirs가 잘못된 권한으로 끝나고 더 작은 파일이 전송되지 않을 수 있습니다. 마지막으로 rsync를 실행하여 문제를 해결하려면 다음을 수행하십시오.

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

1
"EXAMPLE : Parallelizing rsync"섹션을 답변에 붙여 넣으시겠습니까? 나중에 링크가 끊어지는 경우를 대비하여.
picobit

3

예. 이러한 기능이 존재합니다.

설명 된 기능을 제공하는 pssh 라는 유틸리티가 있습니다.

이 패키지는 openssh 도구의 병렬 버전을 제공합니다. 배포에 포함 :

  • 병렬 ssh (pssh)
  • 병렬 scp (pscp)
  • 병렬 rsync (prsync)
  • 병렬 핵무기
  • 병렬 슬러 프 (pslurp)

설치가 얼마나 쉬운 지 잘 모르겠지만 트릭을 할 수도 있습니다!


26
pssh 유틸리티는 한 서버에서 여러 번 동일한 명령을 수행하지 않고 여러 서버에 명령을 분산시키는 데 사용됩니다. 특히 prsync는 로컬 시스템의 파일을 여러 외부 시스템으로 보내는 것만 지원합니다. 여러 연결로 원격 파일 다운로드를 지원하지 않습니다.
Derek Dahmer

1
@DerekDahmer의 의견을 감안할 때이 답변의 포스터는 그것을 철회하고 싶습니까?
mc0e

3

나는 언급 할 수 없으므로 이전 (nice & smart) 코드 보다 조금 더 나은 코드로 새로운 답변을 추가했습니다 .

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를 통해 파일 전송을 병렬화 할 수 있습니다. 많은 경우에 rftp를 사용하면 몇 가지 장점이 있습니다. rsync에 대한 권한 관리, 제한된 액세스 등은 어려울 수 있기 때문입니다.


이 기능이 작동하는 동안 단순히 여러 연결을 사용하여 동일한 파일을 다운로드하지 않기 때문에 대량의 디스크 조각화가 빠르게 발생할 수 있습니다.
bparker

1

아니요. 해당 기능이 없습니다. 원하는 경우 동기화를 여러 통화로 분할 할 수 rsync있습니다.

이 속도 제한을 수행하는 것이 무엇이든 발견하고 유지 관리 / 관리하는 사람과 진지하게 이야기하는 것이 좋습니다.


4
이러한 제한은 Comcast와 같은 일부 ISP의 경우가 많습니다. 그들과 합리적인 대화를 나누는 행운을 빕니다.
James Moore

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 연결은 FTP 서버에 5 번 연결되어 최대 전력으로 작동합니다.


1
답을 유용하게 만들기 위해 그것을 확장 하시겠습니까?
Tog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.