정확한 복사본에 대한 중복 전송을 방지하기 위한 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

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

이름 바꾸기, 하드 링크 또는 소프트 링크를 통해 소스를 전혀 변경할 필요가 없습니다. 다음은 큰 파일을 생성하여 3개의 디렉터리 A, B, C에 복사하는 예제 스크립트입니다. 그런 다음 압축되지 않은 디렉터리를 zbackup. 결과의 크기를 비교합니다저장소, 그리고 기존의 압축된 타르는 무엇입니까? 일반적으로 이 단계에서 저장소는 이제 원격으로 복사되고 원격에서 압축을 풀지만 스크립트는 원본과 비교할 수 있도록 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/*/*

다음은 일부 출력입니다. 보시다시피 저장소는 7682010바이트의 압축된 tar와 비교하여 2632045바이트만 차지하며, 대용량 파일의 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 필터 규칙을 사용하여 해당 파일을 제외하고 별도의 방법으로 처리하세요.

예시 rsync -uva --filter "- a.jar" /somedir/ /otherdir/, a.jar을 제외하고 /somedir에서 /otherdir로 모든 내용을 복사합니다.

관련 정보