
우리는 rsync를 사용하여 기본 파일 서버의 미러를 오프사이트에 배치된 백업 서버로 업데이트합니다. 현재 우리가 겪고 있는 문제 중 하나는 파일 서버에 1TB가 넘는 대부분의 작은 파일(10-100kb 범위)이 있고 이 많은 데이터를 전송할 때 연결이 몇 시간 만에 끊어지는 경우가 많다는 것입니다. 이동 수단. Rsync에는 중단된 부분을 선택하기 위해 단순히 서버에 다시 연결하는 재개/재시도 기능이 없습니다. 파일 비교 프로세스를 거쳐야 하는데, 이는 우리가 가지고 있는 파일의 양에 비해 매우 길어지게 됩니다.
우회하는 데 권장되는 솔루션은 대규모 rsync 전송을 일련의 작은 전송으로 분할하는 것입니다. 나는 이를 수행하는 가장 좋은 방법은 최상위 디렉토리 이름의 첫 글자를 사용하는 것이라고 생각했습니다. 이는 완벽하게 균일한 분포를 제공하지는 않지만 충분합니다.
이를 수행하기 위한 방법론이 제정신인지, 아니면 목표를 달성하는 더 간단한 방법이 있는지 확인하고 싶습니다.
이를 위해 AZ, az, 0-9를 반복하여 하나의 문자를 선택합니다 $prefix
. 처음에는 그냥 달리려고 생각했는데
rsync -av --delete --delete-excluded --exclude "*.mp3" "src/$prefix*" dest/
(--exclude "*.mp3"는 임시 파일과 같은 항목을 제거하기 위한 더 긴 제외 목록이 있기 때문에 단지 예일 뿐입니다.)
이것의 문제는 더 이상 src에 존재하지 않는 dest/의 최상위 디렉토리가 --delete에 의해 선택되지 않는다는 것입니다. 이 문제를 해결하기 위해 대신 다음을 시도하고 있습니다.
rsync \
--filter 'S /$prefix*' \
--filter 'R /$prefix*' \
--filter 'H /*' \
--filter 'P /*' \
-av --delete --delete-excluded --exclude "*.mp3" src/ dest/
나는 show
and hide
over include
and 를 사용하고 있습니다 exclude
. 그렇지 않으면 --delete-excluded가 $prefix와 일치하지 않는 모든 것을 삭제하기 때문입니다.
이것이 rsync를 더 작은 덩어리로 분할하는 가장 효과적인 방법입니까? 이 작업을 더 간단하게 만들어 줄 수 있는 더 효과적인 도구나 제가 놓친 플래그가 있습니까?
답변1
이에 대한 나의 해결책은 일부 디스크 공간을 절충하는 다른 2단계 접근 방식이었습니다. 서버에서 rsync --only-write-batch를 수행한 다음 배치 파일 자체를 대상으로 rsync하고 rsync가 성공할 때까지 반복합니다. 일괄 작업이 완전히 완료되면 rsync --read-batch가 대상에서 모든 변경 사항을 다시 생성합니다.
나에게도 의도하지 않은 이점이 있습니다.
백업이 "사용 가능"한 것보다 "존재"하는 것이 더 걱정되기 때문에 수신 측에서 실제로 매일 일괄 읽기 작업을 수행하지는 않습니다. 대부분의 경우 배치가 상대적으로 작습니다.
나는 --checksum-seed=1을 실험해 왔습니다 ... 문서를 잘못 읽었을 수도 있지만 배치 파일을 더 동기화 가능하게 만드는 것 같습니다(예: --read-batch를 수행하지 않을 때) 주어진 날에는 전날의 일괄 처리가 좋은 기반이므로 다음 날 일괄 처리가 더 빠르게 동기화됩니다.
배치가 너무 커서 인터넷을 통해 "제 시간에" 보낼 수 없으면 외부 드라이브에 연결해 놓을 수 있습니다. 정시란 다음 날 백업이 시작되기 전에 배치를 완료하고 읽을 수 없는 경우를 의미합니다.
개인적으로 이 작업을 수행하지는 않지만 두 개의 오프사이트 백업을 별도의 위치에 두고 배치를 두 곳 모두에 보낼 수 있습니다.
답변2
귀하의 질문에 정확히 대답하지는 않지만 제가 자주 사용하는 또 다른 옵션은 2단계 접근 방식으로 이 작업을 수행하는 것입니다. 먼저 파일 목록을 작성한 다음 전송할 파일 목록을 분할하고 파일 목록을 rsync/cpio/cp 등에 공급합니다. .
rsync --itemize-changes <rest of options>
유용한 메타데이터와 함께 전송할 파일 목록을 인쇄합니다. 해당 출력에서 파일 이름을 추출한 다음 둘 중 하나 rsync --files-from
또는 다른 도구를 사용하여 실제 복사본을 수행하는 것은 매우 쉽습니다.
귀하의 상황에 유용할 수 있습니다. 손상된 전송을 재개하는 것이 훨씬 더 빠릅니다.
답변3
다른 "문제"를 만들어서 문제를 해결하려고 하기보다는 연결 문제를 계속 살펴보는 것이 좋습니다.
일반적인 행동은 아닙니다. SSH 또는 rsyncd를 통해 rsync를 사용하고 있습니까?
내가 아는 한 대부분의 "닫힌" 연결은 끝점 간에 데이터가 전송되지 않을 때 발생합니다.