(거의) 2개의 폴더를 원자적으로 병합합니다.

(거의) 2개의 폴더를 원자적으로 병합합니다.

파일 배포 작업에 일관성을 추가하는 다양한 방법을 모색 중입니다. 현재 상황은 다음과 같습니다.

current약 100,000개의 다양한 파일이 포함된 버전 폴더

  • /현재의
    • /경로1
      • 파일 1
      • 파일 2
      • ...
    • /path2 - 파일X
    • ...

update약 100개의 파일이 포함된 폴더

  • /고쳐 쓰다
    • /경로1
      • 파일 1
    • /path2 - 파일X
    • ...

최종 목표는 모든 파일을 update폴더로 보내는 것입니다 current. 저는 "모두"를 선택했습니다. 작업 중에 오류가 발생하면 작업이 성공한 것으로 표시되도록 파일을 복사하지 않거나 모든 파일을 배포해야 합니다.

이상적인 용어로, 제가 찾고 있는 시나리오는 작업 중에 발생한 상황에 따라 실패 오류 코드 또는 성공 오류 코드를 반환하고 원래 디렉터리가 current시스템에서 즉시 표시되도록 하는 "원자적" rsync입니다. ( rsync작업 후) 최신 버전으로(= 잠재적인 정전이나 기타 이유로 인해 복제 중에 중간 상태가 없음..)

내가 이해한 바에 따르면 대부분의 UNIX 시스템에서는 원자적 작업을 사용할 수 없으므로 이상적인 상황이 분명히 달성되지 않았다고 가정할 수 있습니다. 나는 이 동작을 가능한 한 가깝게 근사하려고 노력하고 있습니다.

나는 이에 대해 다양한 솔루션을 모색했습니다.

  • cp -alcurrent디렉터리를 디렉터리로 미러링 tmp하고 해당 디렉터리의 모든 파일을 복사 update한 다음 삭제 current하고 다음 tmp으로 이름을 바꿉니다.current

  • rsync(지금까지 가장 관련성이 높음) 이 옵션을 사용하여 디렉터리 파일에 대한 하드 링크가 있는 중간 폴더를 --link-dest만듭니다 . current기본적으로 이전 사례와 동일하지만 cp.

  • atomic-rsync기존 Perl 스크립트를 발견했습니다.Perl 원자 rsync아마도 이와 같은 작업을 수행하지만 결과적으로는 디렉터리에 있는 파일만 고려 update하고 "Delta Files" current폴더를 삭제하게 됩니다.

두 솔루션 모두 작동하는 것 같지만 실제 프로덕션 사용 사례에서 둘 중 하나를 사용하는 것에 대해 확신이 없습니다. 문제는 100K 하드 링크를 생성하는 것이 매우 느리거나 어떤 면에서는 비용이 많이 들거나 쓸모가 없을 수 있다는 것입니다.

또한 매우 일관된 해결책은 스냅샷을 사용하는 것이며 많은 옵션이 있다는 것을 알고 있지만 디스크 크기(~70GB, 폴더는 current이미 ~60GB를 차지함)로 인해 제 경우에는 이것이 허용되지 않습니다.

내가 아는 한 옵션이 부족합니다. 원하는 목표를 달성할 수 있는 (더 나은) 방법이 있습니까?

답변1

BTRFS 및 스냅샷 사용을 고려하세요.

관련 정보