파일 배포 작업에 일관성을 추가하는 다양한 방법을 모색 중입니다. 현재 상황은 다음과 같습니다.
current
약 100,000개의 다양한 파일이 포함된 버전 폴더
- /현재의
- /경로1
- 파일 1
- 파일 2
- ...
- /path2 - 파일X
- ...
- /경로1
update
약 100개의 파일이 포함된 폴더
- /고쳐 쓰다
- /경로1
- 파일 1
- /path2 - 파일X
- ...
- /경로1
최종 목표는 모든 파일을 update
폴더로 보내는 것입니다 current
. 저는 "모두"를 선택했습니다. 작업 중에 오류가 발생하면 작업이 성공한 것으로 표시되도록 파일을 복사하지 않거나 모든 파일을 배포해야 합니다.
이상적인 용어로, 제가 찾고 있는 시나리오는 작업 중에 발생한 상황에 따라 실패 오류 코드 또는 성공 오류 코드를 반환하고 원래 디렉터리가 current
시스템에서 즉시 표시되도록 하는 "원자적" rsync입니다. ( rsync
작업 후) 최신 버전으로(= 잠재적인 정전이나 기타 이유로 인해 복제 중에 중간 상태가 없음..)
내가 이해한 바에 따르면 대부분의 UNIX 시스템에서는 원자적 작업을 사용할 수 없으므로 이상적인 상황이 분명히 달성되지 않았다고 가정할 수 있습니다. 나는 이 동작을 가능한 한 가깝게 근사하려고 노력하고 있습니다.
나는 이에 대해 다양한 솔루션을 모색했습니다.
cp -al
current
디렉터리를 디렉터리로 미러링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 및 스냅샷 사용을 고려하세요.