
처음에는 로컬 컴퓨터에 구축된 다음 나중에 대상 컴퓨터에 재동기화되어 시작된 마이크로서비스가 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로 모든 내용을 복사합니다.