Linux 서버의 서비스는 전체 백업만 수행할 수 있으며 각 백업은 .tar 아카이브(압축되지 않음)입니다. 아카이브 내용의 대부분은 날마다 바뀌지 않습니다. 각 .tar 파일 크기는 약 3GB입니다(매일 천천히 증가함).
백업을 보관하는 다른 서버로 전송하고 싶습니다. 전송은 인터넷을 통해 이루어집니다.
요구 사항은 백업이 변경되지 않았어야 한다는 것입니다(결과는 다시 md5 합계가 서버의 원본 파일과 동일한 .tar 파일 목록입니다).
현재 rsync를 사용하여 파일을 전송하고 있는데 잘 작동하지만 모든 파일은 전체 크기로 전송됩니다. 내가 아는 한, rsync는 전송 시 일종의 중복 제거를 수행하지만 파일별 수준에서만 수행됩니다(맞습니까?).
동일한 파일 청크(일종의 중복)를 재전송하지 않고 SSH 연결을 통해 유사한 파일을 전송할 수 있는 방법이 있습니까?
- 서버에 쓰기 액세스가 필요하지 않습니다(tar 파일의 압축을 풀 필요가 없음).
- 연결 손실을 허용합니다(중단 시 임시 파일을 남겨두지 않고 올바르게 전송되지 않은 파일을 감지합니다).
- 연결이 끊어진 후 전송을 재개하는 기능(연결이 중단된 경우 모든 파일을 다시 전송하지 않음)
- rsync를 포함한 표준 Unix 도구 체인 외에 서버에 추가 도구가 필요하지 않습니다.
- 전송을 위해 클라이언트가 시작한 SSH 연결을 계속 사용하고 있습니다.
답변1
당신이 할 수 있는 한 가지는 rsync를 시작하기 전에 (수신 측에서) 마지막 백업 파일을 새 이름으로 복사하는 것입니다. 그러면 그것은 당신이 가지고 있는 것과 당신이 가져야 하는 것 사이의 차이만을 전달합니다.
이렇게 하는 경우 rsync -u
복사본이 새 소스 파일보다 오래된지 확인하기 위해 주의하세요(업데이트만, 타임스탬프 기준).
답변2
가능한 아이디어롤랜드 (Cybso) Tapkenrsync --fuzzy
, 날짜별 카탈로그와 함께 사용
current.tar
날짜와 이름을 딴 디렉토리에 아카이브를 배치하고 이전 디렉토리에 대한 하드 링크가 있는parent.tar
위치를 지정 합니다 . 의 편집 거리가 25(실제로는 3) 미만이므로 이것을 이것과 결합하면 작동합니다 . 물론 소스 파일 시스템과 타겟 파일 시스템 모두 하드 링크를 지원해야 하며 전송 전에 이를 보장해야 합니다.parent.tar
current.tar
--hard-links
current.tar
parent.tar
parent.tar
current.tar
나는 이것을 (완전히 테스트되지 않은) 것으로 해석합니다.
cd $backups
dir=$(date +%s)
latest=$(ls | tail -n 1) # N.B. we control names in this directory!
mkdir $dir
ln $latest/01-current.tar $dir/01-parent.tar
$do_backup > $dir/02-current.tar
rsync -arz --fuzzy --hard-links ./ $server/backups/
실패하면 위 줄을 rsync
다시 실행할 수 있으며 중단된 부분부터 계속되어야 합니다. 상위 파일을 먼저 전송하도록 장려하기 위해 숫자 접두어를 사용하여 일일 디렉토리의 파일 이름을 지정합니다. --delete
완전히 전송된 디렉터리를 클라이언트에서 안전하게 제거하고 백업이 서버에 남아 있도록 의도적으로 이를 포함하지 않았습니다 .
다음과 같은 디렉터리 구조로 끝나야 합니다.
$backups
1437502724
02-current.tar-\
1437589112 |
01-parent.tar--/
02-current.tar---\
1437675488 |
01-parent.tar----/
02-current.tar
연결선은 하드 링크(즉, 동일한 인덱스 노드)를 나타냅니다.