정확한 복사본의 중복 전송을 방지하기 위한 rsync

정확한 복사본의 중복 전송을 방지하기 위한 rsync

먼저 로컬 컴퓨터에 구축된 다음 대상 컴퓨터에 동기화되어 시작된 마이크로서비스가 100개가 넘습니다.

모든 마이크로서비스는 공유 fat.jar 파일을 사용하고, 이름을 바꾸고 배포 폴더에 저장합니다.

/serviceA
  /a.jar
/serviceB
  /b.jar
...

서버에 rsync할 때 rsync는 모든 jar 파일(전체 배포의 99%)이 정확히 동일한 fat.jar인지 확인하지 못합니다. 따라서 rsync가 더 똑똑하다면 실제로 하나의 a.jar만 전송한 다음 다른 모든 파일에 복사할 수 있습니다(크기와 해시가 정확히 동일하기 때문).

이것이 rsync와 관련이 있을 수 있습니까? 아니면 다른 해결책을 찾아야 합니까? 특히 인터넷 연결이 좋지 않은 경우 배포 속도가 크게 느려집니다!

답변1

fat.jar각 서버의 원본 파일 이름을 바꾸지 마십시오 .

다른 이름을 사용하여 파일에 액세스해야 하는 경우 파일에 대한 심볼릭 링크를 만듭니다.

을 위한 serviceA:

ln -s fat.jar a.jar

을 위한 serviceB:

ln -s fat.jar b.jar

답변2

일부가 있습니다중복 제거이 작업을 수행할 수 있는 도구입니다. 설치하면지원, 로컬 및 원격 시스템 모두에서 시스템용 패키지로 사용할 수 있으며 tar파일을 제공할 수 있으며 중복된 부분을 찾아 해당 복사본을 보관하지 않습니다.

이름 바꾸기, 하드 링크 또는 소프트 링크를 통해 소스를 전혀 변경할 필요가 없습니다. 다음은 대용량 파일을 생성하여 A, B, C 3개 디렉터리에 복사하는 샘플 스크립트입니다. 그런 다음 압축되지 않은 디렉터리는 zbackup.저장소, 그리고 전통적인 압축 tar가 무엇인지 알아보세요. 일반적으로 이 단계에서 저장소는 이제 원격으로 복사되어 거기에서 압축을 풀지만 스크립트는 tar를 통해 새 디렉터리에 압축을 풀어 원래 디렉터리와 비교할 수 있습니다.

ZB=/tmp/zrepo
cd /tmp/; mkdir try; cd try
dd count=5000 if=/dev/urandom of=file
for dir in A B C
do  mkdir $dir
    date >$dir/a
    cp file $dir/b$dir
done
ls -l /tmp/try/*/*
zbackup init --non-encrypted $ZB
tar cf - A B C  | zbackup backup --non-encrypted $ZB/backups/x
du -bs $ZB
tar czf - A B C | wc -c
cd /tmp; mkdir copy; cd copy
zbackup restore --non-encrypted $ZB/backups/x | tar xf -
ls -l /tmp/copy/*/*

다음은 몇 가지 결과입니다. 보시다시피 저장소는 2632045바이트만 차지하는 반면, 압축된 tar는 7682010바이트를 차지합니다. 이는 대용량 파일의 3개 복사본이 1개 복사본으로 제거되었음을 나타냅니다.

-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/A/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/A/bA
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/B/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/B/bB
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/try/C/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/try/C/bC

4       /tmp/zrepo/info
4       /tmp/zrepo/index/2e0ec29dfd5742005a477525009cfa3a6677f28cffaf2ae5
4       /tmp/zrepo/backups/x
2052    /tmp/zrepo/bundles/e0/e0a14717771602304b480202e05a4f796e8346b7033c231e
2052    /tmp/zrepo/bundles/e0
520     /tmp/zrepo/bundles/3c/3cf381e405fc278c4336ae331c5ea6a9d67b3147792567bc
520     /tmp/zrepo/bundles/3c

2632045 /tmp/zrepo # du -bs of repo

7682010            # size of tar z

-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/A/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/A/bA
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/B/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/B/bB
-rw-r--r-- 1 meuh      30 Jun  2 12:35 /tmp/copy/C/a
-rw-r--r-- 1 meuh 2560000 Jun  2 12:35 /tmp/copy/C/bC

답변3

예, 파일 이름을 변경했기 때문에 재동기화할 때마다 파일이 달라집니다. rsync의 목적은 중복을 찾는 것이 아닙니다. 그것은 단지 빠른 파일 복사 도구일 뿐입니다. 여러 번 복사되지 않는 파일을 알고 있는 경우 rsync 필터 규칙을 사용하여 해당 파일을 제외하고 별도의 방법으로 처리하면 됩니다.

예. rsync -uva --filter "- a.jar" /somedir/ /otherdir/은 a.jar을 제외한 /somedir의 모든 내용을 /otherdir로 복사합니다.

관련 정보