rsync 예약 작업 경합 상태 중지(큰 디렉터리, 작은 시간 간격)

rsync 예약 작업 경합 상태 중지(큰 디렉터리, 작은 시간 간격)

플랫폼 정보:

OpenBSD 6.2 amd64

$ rsync --version rsync version 3.1.2 protocol version 31

daily.local대용량 디렉터리(4TB)를 다음 파일과 동기화 하려고 합니다 (이는 기본적으로 Linux 관리자의 일일 크론 작업입니다).

#!/bin/sh
# Sync the primary storage device to the backup disk
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/

초기 rsync 복사에는 하루 이상이 소요됩니다. 하루나 이틀 후에 프로세스 목록에 실행 중인 rsync 복사본이 여러 개 표시됩니다. 새 프로세스가 예정대로 시작되고, 이러한 새 프로세스가 서로 경쟁하는 것처럼 보이며 작업을 완료하지 못하는 것입니다(적어도 빠르지는 않습니다)!

새로운 rsync 프로세스가 다른 rsync 프로세스를 인식하도록 하는 방법(또는 rsync 경쟁 조건을 방지하는 다른 방법)이 있습니까?

처음으로 디렉터리를 복사하거나 예약된 간격을 늘리기 위해 rsync를 수동으로 실행할 수 있다는 것을 알고 있습니다. 온라인에서 이 주제에 대한 정보를 찾을 수 없기 때문에 이 질문에 더 관심이 갑니다.

답변1

솔루션은 다음과 다소 유사합니다.마크의 솔루션/etc/fstab, 그러나 파일 시스템을 변경하거나 마운트 및 마운트 해제할 필요는 없습니다 .

#!/bin/sh

lockdir=/tmp/file-copy.lock

if ! mkdir "$lockdir"; then
   echo 'File copy already in progress' >&2
   exit 1
fi

trap 'rmdir "$lockdir"' EXIT

PATH=$PATH:/usr/local/bin

rsync -ai ...

이에 대한 몇 가지 참고 사항:

  1. 디렉터리가 이미 있으면 작업이 실패하지만 디렉터리가 없으면 디렉터리가 생성되는 mkdir것과 같은 원자적 작업 입니다 . mount자물쇠를 먼저 확인하는 것보다 이것이 더 안전합니다.문서그런 다음 생성합니다(두 단계, 사이에 경쟁 조건이 있을 수 있음).

  2. EXIT트랩은 스크립트가 종료될 때 잠긴 디렉토리가 삭제되도록 보장합니다. 잠금 디렉터리는 에 위치하므로 재부팅 시 시스템에 의해 삭제됩니다 /tmp.

  3. 전체 경로로 호출하는 PATH대신 적절한 값으로 설정했습니다 . rsync이것은 순전히 장식적인 것이지만 나중에 OpenBSD 포트 컬렉션의 다른 명령(예: restic또는 )을 사용하도록 스크립트를 확장하는 경우 borgbackup유용할 수 있습니다 .

  4. 이 옵션에는 -z실제로 rsync다음 사항만 필요합니다.아주 느린네트워크 연결(네트워크 대역폭보다 빠르게 데이터를 압축/압축 해제하는 경우) 및안 돼요로컬 복제용. 나는 또한 -i( --itemize-changes)보다 -v( )를 선호합니다. --verbose왜냐하면 그것이 파일 전송의 목적을 정확히 알려주기 때문입니다.

대용량 데이터를 안전하게 백업하려면 일반적으로 다음 rsync과 같이 특별히 작성된 백업 소프트웨어를 사용하는 것이 좋습니다.restic또는borgbackup. 둘 다 중복 제거 및 암호화도 가능하며 borgbackup선택적으로 압축할 수도 있습니다. 서버가 아직 설치 되지 않은 경우에도 외부 서버(예: )에 백업을 저장할 수 있지만 대상 시스템에 소프트웨어를 설치해야 한다는 restic점에서는 좋습니다 . 둘 다 백업 저장소 잠금을 처리합니다 .sftpresticborgbackupresticborgbackup

답변2

이 문제를 해결하는 한 가지 방법(백업 디렉터리가 자체 파티션에 있는 경우)은 볼륨을 마운트 해제된 상태로 두고 rsync 명령을 시작하기 전에 볼륨을 마운트하는 것입니다. 이렇게 하면 사용할 필요가 없어지고 flock드라이브 수명이 연장되고 전력 소비가 낮아지는 이점이 있을 수 있습니다.

/etc/fstab: noauto부팅 시 자동으로 설치되지 않도록 파티션에 옵션을 추가합니다.

진행 중인 작업 daily.local또는 cron.daily예약된 작업:

#!/bin/sh
mount /mnt/media_backup && \
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/ && \
umount /mnt/media_backup

&&이중 앰퍼샌드 연산자( )는 이전 명령이 성공한 경우에만 다음 명령을 시작합니다. 따라서 백업 디스크를 마운트할 수 없는 경우(이미 마운트되어 있고 rsync가 이미 파티션에서 실행 중이기 때문에) 나머지 명령은 계속되지 않습니다.

관련 정보