동일한 파일 목록을 사용하여 여러 대상으로 재 동기화합니까?


22

rsync가 하나의 디렉토리를 여러 원격 대상으로 한 번에 또는 병렬로 복사 할 수 있는지 궁금합니다. (필요하지는 않지만 유용합니다.)

일반적으로 다음과 같은 것이 정상적으로 작동합니다.

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

그리고 이것이 유일한 옵션이라면, 그것을 사용할 것입니다. 그러나 / junk는 상당히 적은 파일이있는 느린 드라이브에 있으며 실제 전송 / 업데이트에 비해 매번 ~ 12,000 개 파일의 파일 목록을 재 구축하는 것이 매우 느립니다 (~ 5 분). 같은 것을 달성하기 위해 이와 같은 것을 할 수 있습니까?

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

찾아 주셔서 감사합니다!

답변:


12

다음은 배치 모드에 대한 rsync 설명서 페이지의 정보입니다.

배치 모드

배치 모드를 사용하여 동일한 일련의 업데이트를 여러 동일한 시스템에 적용 할 수 있습니다. 하나의 트리가 여러 호스트에 복제되어 있다고 가정합니다. 이제이 소스 트리에서 일부 변경 사항이 작성되었으며 해당 변경 사항이 다른 호스트로 전파되어야한다고 가정하십시오. 배치 모드를 사용하여이 작업을 수행하기 위해 소스 트리의 변경 사항을 대상 트리 중 하나에 적용하기 위해 write-batch 옵션과 함께 rsync가 실행됩니다. write-batch 옵션은 rsync 클라이언트가 다른 동일한 대상 트리에 대해이 작업을 반복하는 데 필요한 모든 정보를 "일괄 파일"에 저장합니다.

배치 파일을 한 번 생성하면 여러 대상 트리를 업데이트 할 때 파일 상태, 체크섬 및 데이터 블록 생성을 두 번 이상 수행하지 않아도됩니다. 멀티 캐스트 전송 프로토콜을 사용하여 모든 호스트에 동일한 데이터를 개별적으로 전송하는 대신 일괄 업데이트 파일을 여러 호스트에 동시에 병렬로 전송할 수 있습니다.

기록 된 변경 사항을 다른 대상 트리에 적용하려면 동일한 배치 파일의 이름과 대상 트리를 지정하여 읽기 배치 옵션으로 rsync를 실행하십시오. Rsync는 배치 파일에 저장된 정보를 사용하여 대상 트리를 업데이트합니다.

편의를 위해 write-batch 옵션을 사용할 때 스크립트 파일도 작성됩니다. ".sh"가 추가 된 배치 파일과 동일하게 이름이 지정됩니다. 이 스크립트 파일에는 관련 배치 파일을 사용하여 대상 트리를 업데이트하는 데 적합한 명령 줄이 포함되어 있습니다. Bourne (또는 Bourne와 유사한) 쉘을 사용하여 실행될 수 있으며, 선택적으로 대체 대상 트리 경로 이름을 전달한 다음 원래 대상 경로 대신 사용됩니다. 현재 호스트의 대상 트리 경로가 배치 파일을 만드는 데 사용 된 경로와 다른 경우에 유용합니다.

   Examples:

          $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

이 예에서 rsync는 / source / dir /에서 / adest / dir /을 업데이트하는 데 사용되며이 작업을 반복하기위한 정보는 "foo"및 "foo.sh"에 저장됩니다. 그런 다음 "remote"호스트가 / bdest / dir 디렉토리로 이동하는 배치 된 데이터로 업데이트됩니다. 두 예제의 차이점은 배치를 처리하는 방법에있어 몇 가지 유연성을 나타냅니다.

  • 첫 번째 예는 초기 사본이 로컬 일 필요는 없음을 보여줍니다. 원하는대로 원격 쉘 구문 또는 rsync 데몬 구문을 사용하여 원격 호스트에서 데이터를 푸시하거나 가져올 수 있습니다.

  • 첫 번째 예는 생성 된 "foo.sh"파일을 사용하여 원격 호스트에서 read-batch 명령을 실행할 때 올바른 rsync 옵션을 가져옵니다.

  • 두 번째 예는 표준 입력을 통해 배치 데이터를 읽으므로 배치 파일을 원격 시스템에 먼저 복사 할 필요가 없습니다. 이 예제는 수정 된 --read-batch 옵션을 사용해야했기 때문에 foo.sh 스크립트를 사용하지 않지만 스크립트 파일을 사용하려는 경우 스크립트 파일을 편집 할 수 있습니다 (다른 옵션이 표준을 사용하지 않도록하십시오) "--exclude-from =-"옵션과 같은 입력).

    주의 사항 :

    읽기-배치 옵션은 업데이트중인 대상 트리가 배치 업데이트 파일 세트를 작성하는 데 사용 된 대상 트리와 동일 할 것으로 예상합니다. 대상 트리간에 차이가 발생하면 경고 (파일이 이미 최신 상태 인 것으로 보이면)와 함께 업데이트가 삭제되거나 파일 업데이트가 시도 된 후 파일을 확인하지 못한 경우 , 업데이트가 오류와 함께 삭제되었습니다. 즉, 명령이 중단 된 경우 읽기 일괄 작업을 다시 실행하는 것이 안전해야합니다. 파일 크기와 날짜에 관계없이 배치 업데이트를 항상 강제로 수행하려면 -I 옵션을 사용하십시오 (배치를 읽을 때). 오류가 발생하면 대상 트리가 부분적으로 업데이트 된 상태 일 수 있습니다. 이 경우

    모든 대상에서 사용되는 rsync 버전은 적어도 배치 파일을 생성하는 데 사용 된 버전과 같아야합니다. 배치 파일의 프로토콜 버전이 배치 판독 rsync가 처리하기에 너무 새 버전이면 Rsync가 오류와 함께 종료됩니다. rsync를 생성하여 이전 rsync가 이해할 수있는 배치 파일을 생성하게하려면 --protocol 옵션을 참조하십시오. (배치 파일은 버전 2.6.3에서 변경되었으므로 이전 버전보다 이전 버전을 혼합하면 작동하지 않습니다.)

    배치 파일을 읽을 때 rsync는 배치 쓰기 명령과 동일하게 설정하지 않은 경우 특정 옵션의 값이 배치 파일의 데이터와 일치하도록합니다. 다른 옵션도 변경할 수 있습니다. 예를 들어 --write-batch가 --read-batch로 변경되고 --files-from이 삭제되고 --delete 옵션 중 하나가 지정되지 않으면 --filter /-include /-exclude 옵션이 필요하지 않습니다. .

    BATCH.sh 파일을 작성하는 코드는 모든 필터 / 포함 / 제외 옵션을 쉘 스크립트 파일에 "여기"문서로 추가 된 단일 목록으로 변환합니다. --delete로 삭제 된 항목을 변경하려는 경우 고급 사용자는이를 사용하여 제외 목록을 수정할 수 있습니다. 일반 사용자는이 세부 사항을 무시하고 배치 된 데이터에 대해 적절한 --read-batch 명령을 실행하는 쉬운 방법으로 쉘 스크립트를 사용할 수 있습니다.

    rsync의 원래 배치 모드는 "rsync +"를 기반으로하지만 최신 버전은 새로운 구현을 사용합니다.

시도해 볼 수있을 것 같아

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

제안 된 명령이 작동하지 않습니다.remote destination is not allowed with --read-batch
kynan

완전한 명령을 표시하십시오. -파일 이름은 표준 입력에서 읽고 foo, 로컬 파일 인 STDIN도 읽습니다 .
Chloe

2
이것은 나의 사용 사례가 오드로 증발 된 지 오래되었지만, 내가하려는 일에 대한 최대의 올바른 해결책 인 것처럼 보입니다. : D
Jessie

4

unison을 사용해보십시오 . 파일 캐시를 유지하기 때문에 파일 목록을 작성하는 것이 훨씬 빠릅니다.


2
참고 : Unison은 파일의 '캐시'를 유지하지 않습니다. 파일 이름, 타임 스탬프, 체크섬 데이터베이스 만 유지합니다. 여전히 파일 시스템을 스캔하고 원격과 비교할 체크섬을 만듭니다. Unison의 유일한 장점은 양방향 동기화입니다. Unison을 추천하지만 여기서는 도움이되지 않습니다.
Chloe

4

rsync --batch-mode멀티 캐스트 지원합니다. 네트워크에서 이것이 가능하다면 조사해 볼 가치가 있습니다.


2

파일 시스템 변경은 어떻습니까?

얼마 전에 멀티 테라 바이트 FS를 ext3에서 XFS로 전환했습니다. 디렉토리를 스캔하는 시간 (마지막으로 확인한 약 600,000 파일)은 15-17 분에서 30 초 미만으로 단축되었습니다!


1

직접적인 대답은 아니지만 rsync 버전 3 이상을 사용하면 전체 파일 목록을 생성하기 전에 전송이 시작됩니다.

여전히 효율적이지 않은 또 다른 옵션은 작업으로 실행하여 몇 가지를 동시에 실행하는 것입니다.

또한 tar를 사용하는 것이 마음에 들지 않으면이 강도를 생각했습니다.

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

각 로컬 호스트가 서로 다른 서버 인 경우 (키 기반 로그인 가정) 그래도 위의 것을 사용하지 마십시오.


흠! 이상하게도 cwrsync (rsync 3.0.7)는 그렇게하지 않는 것 같습니다. 그 이유를 조사해야 할 것입니다. 왜냐하면 이것이 엄청난 런타임을 줄이는 데 큰 도움이 될 것입니다. 감사!
Jessie

양쪽에 그 버전?
Kyle Brandt

아니, 실제로; 로컬 컴퓨터는 cwrsync 3.0.7이고 원격 호스트 (지금 작업중인 호스트)는 Debian Lenny에서 rsync 3.0.3입니다. 그것이 잘못 작동하기에는 너무 큰 버전 차이가 아닌 것 같지만, 나는 몰라 .. 나는 데비안 측면을 업그레이드 할 것입니다.
Jessie

1
정말 이상한 작은 라이너입니다. 그러나 최대 수백 kb 만 변경되었을 때 rsync가 여러 느린 링크를 통해 몇 기가의 데이터를 복제 할 필요가 없다는 사실을 활용하지 않았다면 아마도 효과가있을 것입니다. 또한 양쪽 끝을 (cw) rsync 3.0.7로 가져 오면 여전히 파일 목록을 작성하고 직렬로 전송했습니다. 그러나 그것에 대해 너무 걱정하지 마십시오.
Jessie

"tar cf-."가 아님 "tar c"와 동일 ?
Johan Boulé

1

host1, host2 및 host3에서 rsync 작업을 실행하는 방법은 무엇입니까? 또는 작업을 실행하여 host1에 복사 한 다음 host2 및 host3에서 실행하여 host1에서 가져 오십시오.


1

더 나은 솔루션은 git을 사용하여 리포지토리를 만들고 3 개의 호스트로 푸시하는 것입니다. 더 빠르면 파일 목록 부분이 필요하지 않으며 더 적은 리소스를 사용합니다.

행운을 빕니다,
주앙 미구엘 네 베스


10
git은 수정 시간이나 권한을 유지하지 않으며 (실행 비트 제외) .git/이미 대부분의 데이터를 가지고있는 원격 장치에 푸시하는 것이 더 빠르더라도 두 번째 데이터 사본을 git 객체로 저장해야합니다 . git은 rsync를 대체하지 않습니다.
Dan D.

또한 git은 지불하지 않으면 공개적으로 볼 수 있습니다.
Chloe

8
@ Chloe, gitHub로 git을 잘못 생각했습니다. 힘내 자체는 무료 오픈 소스 분산 버전 관리 시스템이며, 사람을 포함한 모든 수단으로 자식 저장소를 호스팅 할 수 있습니다 http, nfs하고 afp. GitHub는 git repos 생성 및 유지 관리를 담당하는 웹 사이트로, 지불하지 않는 한 공개합니다.
toriningen

1
@Chloe GitHub는 공개적으로 볼 수 있지만 BitBucket은 개인 저장소를 제공합니다.
sws

2
또한 Git은 빈 디렉토리를 추적하지 않습니다.
Flimm

1

이 답변을 직접 찾아 보려면 먼저 rsync를 사용하여 일괄 처리를 한 다음 모두에게 보내야하므로 파일 목록을 한 번만 처리해야 할 수 있습니다. 세 개의 rsync를 모두 병렬로 실행하십시오.


1

또 다른 가능한 해결책은 호스트, 즉 포크와 같이 많은 rsync 프로세스를 병렬로 실행하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.