2014-05-22 2 views
4

scp를 사용하여 아래의 쉘 스크립트와 GNU 병렬을 사용하여 파일을 병렬로 복사했지만 제대로 작동합니다.아래의 쉘 스크립트에서 scp 대신 rsync를 사용하여 파일을 복사하는 방법은 무엇입니까?

scp 대신 아래 쉘 스크립트에서 rsync을 어떻게 사용할 수 있는지 잘 모르겠습니다. 나는 scp에 비해 전송 속도면에서 rsync이 더 나은 성능을 보일 것인지를 판단하려고합니다. 내가 machineA 내 아래에 쉘 스크립트를 실행하고 있습니다로

내가 machineAmachineBmachineC에서 파일을 복사하고 -

다음은 내 문제의 설명이다.

파일이 그 다음 내가 machineC에서 같은 파일을 복사하려고합니다 machineB에 존재하지 않는 경우 나, machineB 처음부터 파일을 복사하려고합니다 그래서 machineB는 다음 확실히 machineC에가 있어야에서이없는 경우.

GNU 병렬 라이브러리를 사용하여 파일을 병렬로 복사하고 있는데 문제가 없습니다. 현재 PRIMARY와 SECOND 모두 5 개의 파일을 병렬로 복사 중입니다.

#!/bin/bash 

export PRIMARY=/test01/primary 
export SECONDARY=/test02/secondary 
readonly FILERS_LOCATION=(machineB machineC) 
export FILERS_LOCATION_1=${FILERS_LOCATION[0]} 
export FILERS_LOCATION_2=${FILERS_LOCATION[1]} 
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers 
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers 

export dir3=/testing/snapshot/20140103 

do_Copy() { 
    el=$1 
    PRIMSEC=$2 
    scp [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp [email protected]$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. 
} 
export -f do_Copy 

parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" & 
parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" & 
wait 

echo "All files copied." 

rsync 내 위의 scp 명령을 대체 할 수있는 방법이 있나요하지만, 난 여전히 모두 동시에 PRIMARYSECONDARY 병렬로 5 개 개의 파일을 복사 할 -

아래 내가 가진 내 쉘 스크립트는 무엇입니까?

+1

그건 바보 같은 요구 사항입니다. 귀하의 작업은 I/O 경계이며 CPU 경계는 아닙니다. 병렬 처리를 추가하면 혼잡이 야기됩니다. – tripleee

+0

@tripleee 당신은 맞을지도 모르지만 나는 여전히보고 싶었다 - 파일을 전송하는 동안'scp'와'rsync' 사이에 어떤 차이가 있습니까? – john

+1

목적지에 파일이 이미 존재한다면'rsync'가 더 효율적일 것입니다. 그렇지 않으면 오버 헤드가 추가됩니다. – tripleee

답변

4

rsync은 두 개의 계층 구조 인 개의 폴더와 파일을 효율적으로 동기화하도록 설계되었습니다.

개별 파일을 전송하는 데 사용 할 수 있지만, 이미 그들 사이의 작은 차이와 각 끝 부분에있는 파일의 버전이 아니라면 아주 많이, 그렇게 사용에 도움이되지 않습니다. 계층 구조 내의 개별 파일에 대해 rsync의 여러 인스턴스를 병렬로 실행하면 도구의 목적에 위배됩니다.

rsync 또는 scp 중 어느 것을 사용하든 작업을 병렬 처리하면 일반적인 작업에서는 병렬 처리가 도움이되지 않지만 한 가지 상황이 있습니다. 네트워크 전송을 병렬화하면 도움이됩니다. 보낸 사람이 요청을 조절하는 경우. 의 경우 인 경우 여러 폴더 각각에 대해 rsync의 인스턴스를 실행하는 데 약간의 가치가있을 수 있지만 코드가 복잡해 지므로 두 솔루션을 모두 프로파일 링하여 실제로 어떤 파일이 있는지 확인해야합니다 이익.

한마디로 rsync의 단일 인스턴스 만 실행하십시오. 다른 접근법에서 얻을 수있는 성능 향상은 그만한 가치는 없을 것입니다.

+1

연결이 끊어지면 rsync --partial이 중단 된 위치에서 계속 진행되지만 scp가 다시 시작됩니다.즉, rsync를 통해 scp를 사용하면 아무런 이점이 없지만 rsync를 사용하면 많은 양의 전송을 막을 수 있습니다. 여러 인스턴스가 성능을 향상시킬 수도 있고 늘리지 않을 수도 있습니다. 네트워크 대기 시간, 패킷 손실, 대역폭, 디스크 속도, CPU 속도, 파일 크기 및 파일 수에 따라 다릅니다. 변수가 너무 많으면 정답은 다음과 같습니다. 가장 빠른 방법을 선택하고 선택하십시오. –

2

너는 합당한 길을 가고 있는지 알기에 충분한 정보를주지 못했지만 lsyncd 또는 심지어 GlusterFS을보아야한다고 생각합니다. 이것들은 당신이 주기적으로 실행하는 것이 아니라 연속적인 동기화 도구라는 점에서 당신이하고있는 것과는 다르다. 비록 당신이 정말로 원하는 것이면 주기적으로 lsyncd를 실행할 수 있다고 생각한다. 필자는 아직 lsyncd 2.x를 사용해 보지 못했지만 병렬 동기화 프로세스가 추가 된 것을 볼 수 있습니다.실제 시나리오에 설명 된 세 대의 시스템 이상이 포함되는 경우 피어 투 피어 파일 공유 프로토콜 중 일부를 살펴 보는 것이 좋습니다.

현재 접근 방식에서 파일이 매우 큰 경우가 아니라면 대부분의 지연은 연결 설정 및 인증과 관련된 오버 헤드와 관련이 있습니다. 모든 단일 파일에 대해 별도로 작업하는 것은 특히 ssh 기반 프로토콜에 비해 많은 비용이 듭니다. 파일 목록을 일괄 처리로 나누고 복사 메커니즘에 해당 일괄 처리를 전달하는 것이 좋습니다. rsync를 사용할지 여부는 그다지 중요하지 않지만 rsync 프로세스가 처리 할 파일 목록을 먼저 구성한 경우 --files-from 옵션을 사용하여 rsync에 전달할 수 있습니다.

제한 속도가 동기화 속도에 어떤 영향을 미치는지 알고 싶습니다. 아마도 네트워크 대역폭, 네트워크 대기 시간, 파일 IO 또는 CPU (체크섬 또는 압축,하지만 아마도 로우 엔드 하드웨어가있는 경우에만 해당) 중 하나 일 것입니다.

한 동기화 실행에서 다른 동기화로 파일의 변경 패턴에 대해 아는 것이 중요합니다. 이전 실행에서 변경되지 않은 파일이 많이 있습니까? 기존 파일이 변경됩니까? 이러한 변경으로 인해 많은 수의 블록이 변경되지 않고 (예 : 데이터베이스 파일) 추가되거나 추가 될 수 있습니다 (예 : 로그 파일)? 파일 수정 시간 및 크기와 같은 메타 데이터를 사용하여 변경된 내용을 안전하게 파악할 수 있습니까? 아니면 전체 내용을 체크섬해야합니까?

파일 내용이 압축 가능합니까? 예를 들어 일반 텍스트를 복사하는 중이라면 scp 또는 rsync에서 압축 옵션을 사용하고 싶지만 이미지 또는 비디오 파일을 이미 압축 한 경우 다시 압축하면 속도가 느려집니다. rsync는 파일의 일부가 변경되는 파일이있는 경우 주로 유용합니다.

0

scp과 마찬가지로 rsync으로 하나의 파일을 다운로드 할 수 있습니다. 데몬을 호출하는 rsync:// 또는 hostname::path 형식을 사용하지 않도록하십시오.

적어도 두 개의 원격 호스트를 동시에 작동시킬 수 있습니다. 또한 파일이 다른 물리적 디스크에 있거나 캐시에있는 경우 단일 호스트에서도 파일을 병렬 처리하면 도움이됩니다. 그렇기 때문에 나는 다른 하나의 인스턴스가 반드시가는 길이라는 의견에 동의하지 않는 것입니다.

0

내가 rsync를 사용하기 때문에

은 아마 당신은 추가로 속도를 얻을 수 있습니다 (변경이뿐만 아니라 명령 참고) 그냥

rsync [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/new_weekly_2014_"$el"_200003_5.data || rsync [email protected]$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/new_weekly_2014_"$el"_200003_5.data 

에 의해

scp [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp [email protected]$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. 

을 대체 할 수 있다고 생각 delta = 맹목적으로 복사 할 scp와 비교되는 전송 알고리즘.