원본 및 원격 대상에서 다시 동기화할 수 있도록 일부 디렉터리의 압축 이미지를 만들고 싶습니다.
다음 두 단계를 통해 비효율적으로 수행할 수 있습니다.
rsync -a /source/ /compressed-mirror/
gzip --recursive --rsyncable --force /compressed-mirror/
# later: rsync -a /compressed-mirror/ remote:/another-compressed-mirror/
문제는 미러를 업데이트하기 위해 첫 번째 rsync를 다시 실행하면 소스 파일 중 일부만 변경된 경우에도 모든 소스 파일을 다시 복사하고 gzip해야 한다는 것입니다.
질문:각 업데이트에 필요한 데이터 전송량과 하드 드라이브 사용량을 최소화할 수 있는 다른 방법이 있습니까?
노트:
나는 압축을 위해 gzip을 사용할 것을 주장하지 않았습니다. 단지 압축된 파일의 재동기화를 허용하기 때문에 gzip을 선택했습니다.
로컬 압축 이미지의 목적은 원본 컴퓨터(노트북)의 인터넷 연결 및 전원 상태가 불안정하기 때문에 원격 이미지와 재동기화하는 데 필요한 "네트워크 실행" 시간을 최소화하는 것입니다. 로컬 이미지의 특정 부분은 원격 이미지에 대한 rsync 전에 암호화됩니다. 그런 다음 원격 이미지의 버전은 rsnapshot을 사용하여 관리되고 보다 안정적인 인터넷 연결을 통해 다른 원격 서버에 업로드됩니다.
업데이트/생각:
- 파일 시스템 압축을 사용하십시오(cas의 설명 참조). 하지만 이렇게 하면 rsync가 파일을 원격 서버로 전송할 때 파일을 다시 압축하게 되어 중복되는 것처럼 보입니다.
- rsync 디렉토리를 압축되지 않은 상태로 둡니다. 변경된 파일은 rsync가 업데이트할 때마다 기록됩니다. 변경된 각 파일에 대해 압축 이미지에 별도의 압축 복사본을 생성(또는 삭제)합니다. 그러나 다음 아이디어는 동일한 작업을 보다 효율적으로 수행할 수 있습니다.
- 소스의 파일 경로 및 파일 크기(또는 체크섬) 목록을 유지합니다. 업데이트할 때마다 새 목록을 만들고 이전 목록과 비교하세요. 변경된 각 파일에 대해
gzip < source/path/file > mirror/path/file.gz
. 이것이 지금까지 가장 효과적인 해결책인 것 같습니다.
답변1
요구 사항을 처리하는 가장 효율적인 방법은 중간 이미지 대상을 압축하지 않는 것입니다. 이렇게 하면 rsync
변경된 데이터만 델타 알고리즘을 사용하여 로컬 호스트와 원격 호스트 간에 전송할 수 있습니다. (단, 동일한 호스트의 두 디렉터리 간 복사 시에는 델타 알고리즘이 적용되지 않습니다.)
# Any changed files will be copied completely, even if only one byte changed
rsync -a --delete /source/ /mirror/
# Only copy changed parts of changed files
rsync -az --delete /mirror/ remote:/mirror/
로컬 하드 드라이브 및 중간 네트워크에 대한 적중 측면에서 가장 효율적인 솔루션은 로컬 미러를 완전히 버리고 소스에서 원격 대상으로 직접 복사하는 것입니다.
# Only copy changed parts of changed files
rsync -az --delete /source/ remote:/mirror/