rsync와 비슷한 프로그램이지만 공유 캐시 디렉토리나 소스를 사용하시나요?

rsync와 비슷한 프로그램이지만 공유 캐시 디렉토리나 소스를 사용하시나요?

rsync를 사용하면 파일 또는 데이터 델타(차이)를 원본과 대상 간에 직접 비교할 수 있습니다.

소스, 대상 및 공유 로컬 "캐시" 간의 델타를 비교하는 대체 프로그램이 있습니까? 멀리 있으면 source 느리고, 지역이면 destination빠릅니다 local-shared-cache.

예를 들어, 다음과 같은 상태가 있다고 가정해 보겠습니다.

source:
largeFile.txt
largeFile2.txt
largeFile3.txt

destination:
largeFile.txt

local-shared-cache:
largeFile3.txt

경로를 무시하고 파일 에만 집중 source하면 .destinationlargeFile2.txt largeFile3.txt

그러나 largeFile3.txt실제로는 이미 존재하므로 local-shared-cache"incremental" source이 에서 only로 변경됩니다 largeFile2.txt. 이 캐시를 사용하는 구현은 잠재적으로 더 느린 source.


한 가지 방법은 토렌트 프로토콜(모든 파일이 토렌트가 됨)을 사용하는 것일 수 있으며, 해당 토렌트가 이미 로컬 저장소에 "있으면" 다운로드할 필요가 없습니다. 하지만 이 솔루션을 구현하고 테스트해야 합니다(이러한 소프트웨어가 이미 존재하기를 바랍니다).

또 다른 옵션은 ZFS 스냅샷 동기화일 수도 있습니다.


내가 실제로 달성하고 싶은 것은 무엇인가?

기본적으로 우리는 많은 양의 빅 데이터를 포함하는 많은 소프트웨어 프로젝트를 보유하고 있으며 개발자는 로컬 개발을 위해 프로젝트와 모든 데이터를 복제해야 하는 경우가 많습니다. 프로젝트의 크기가 10GB이고 다운로드하는 데 20분이 걸린다고 가정합니다. 이제 개발자가 유사한 프로젝트를 복제해야 하는 경우 두 프로젝트 간의 델타/차이가 그 일부에 불과하더라도 10GB/20분 비용을 다시 지출해야 합니다.

초기 rsync를 수행한 다음 그 위에 rsync를 수행할 수 없나요? 차이점이 있습니까?

물론 프로젝트 1을 먼저 rsync/clone한 다음 이를 기반으로 프로젝트 2를 rsync/clone할 수 있지만 "기본" 복제본을 찾아야 하는 경우 빠르게 혼란스러울 수 있습니다. 또한 두 개의 프로젝트가 아닌 여러 프로젝트에 공통 자산이 분산되어 있는지 여부도 고려하지 않습니다. 예를 들어, 10개의 프로젝트가 있고 각각에 공통 파일이 포함되어 있는 경우 어떻게 해야 합니까? 10개의 요소를 모두 순서대로 배열하여 모든 공통 요소를 "만들"까요? 복잡해 보이긴 하네요.

이전 예를 계속해서... 두 번째 프로젝트가 있다고 가정해 보겠습니다.largeFile.txt largeFile3.txt largeFile4.txt. largeFile5.txt

나는 기본적으로 largeFile4.txt. largeFile5.txt.

따라서 이 접근 방식을 사용하면 초기 rsync를 수행하고 LargeFile2.txt, LargeFile3.txt를 가져온 다음 두 번째 프로젝트에서 또 다른 rsync를 수행하여 LargeFile4.txt 및 LargeFile5.txt를 얻을 수 있습니다. 하지만 그런 다음 rsync를 사용하여 필요한 모든 파일을 순차적으로 "구축"한 다음 불필요한 파일을 모두 삭제하는 방법을 알아내야 합니다. 처리 및 디스크 처리가 많이 필요한 것 같습니다.

답변1

rsync를 사용하면 파일 또는 데이터 델타(차이)를 원본과 대상 간에 직접 비교할 수 있습니다.

불필요한. 네트워크 연결을 통해 사용할 경우에만 rsync델타를 사용하십시오 . 로컬 파일 시스템의 일부로 보이는 두 디렉터리/파일 사이에서 사용하는 경우 rsync델타를 사용하지 않고 오래된 파일의 전체 복사본을 만듭니다.

# Will use deltas
rsync -a /path/to/source/  remoteHost:/path/to/destination

# Will copy changed files in their entirety
rsync -a /path/to/source/  /network/path/for/remoteHost/destination

따라서 델타를 사용한다고 가정하면 파일의 변경된 부분만 전송되므로 일반적으로 캐싱을 사용할 필요가 없습니다.

그러나 처음으로 파일을 전송하고 그 파일의 상당 부분이 다른 파일과 유사하다는 것을 알고 있는 경우 --fuzzy--link-dest/를 --copy-dest사용 하여 rsync도움을 받을 수 있습니다.

또한 다음 대상 디렉토리에 복사 할 수 있도록 허용 new합니다 .oldoldoldstuffnewnewstuff

rsync -av --copy-dest /full/path/to/oldstuff/ --fuzzy --fuzzy /path/to/file/new remoteHost:/path/to/newstuff/

--copy-dest경로가 상대 경로인 경우 경로의 대상 디렉터리에 상대적이라는 점을 기억하십시오 remoteHost. 일반적으로 경로를 --copy-dest절대 경로(예: 로 시작 /)로 설정하거나 "$PWD"원격 시스템의 로그인 디렉터리를 기준으로 설정하는 것이 가장 좋습니다.

명령에 두 개의 -v플래그를 추가하면 이 디버그 출력이 제공되어 복제의 기초 rsync로 사용됨을 확인합니다 .oldnew

rsync --dry-run -aivvv --copy-dest "$PWD"/t/dst/oldstuff/ --fuzzy --fuzzy t/src/new remoteHost:t/dst/newstuff/

opening connection using: ssh remotehost rsync --server -vvvnlyyogDtpre.iLsfxC "--log-format=%i" --copy-dest /home/roaima/t/dst/oldstuff/ . t/dst/newstuff/  (10 args)
sending incremental file list
[sender] make_file(new,*,0)
send_file_list done
send_files starting
server_recv(2) starting pid=11407
recv_file_name(new)
received 1 names
recv_file_list done
get_local_name count=1 t/dst/newstuff/
generator starting pid=11407
delta-transmission enabled
recv_generator(new,1)
[generator] make_file(/home/roaima/t/dst/oldstuff/old,*,1)
fuzzy basis selected for new: /home/roaima/t/dst/oldstuff/old
send_files(1, t/src/new)
<f+++++++++ new
generate_files phase=1
send_files phase=1
recv_files(1) starting
recv_files(new)
recv_files phase=1
generate_files phase=2
send_files phase=2
send files finished
total: matches=0  hash_hits=0  false_alarms=0 data=0
recv_files phase=2
recv_files finished
generate_files phase=3
generate_files finished

sent 65 bytes  received 515 bytes  386.67 bytes/sec
total size is 2,147,483,648  speedup is 3,702,558.01 (DRY RUN)
[sender] _exit_cleanup(code=0, file=main.c, line=1207): about to call exit(0) (DRY RUN)

관련 정보