유저가 업로드하는 프로젝트 파일을 서버 디스크에 그대로 저장할 경우, 매번 새로운 버전을 업로드할 때마다 동일하거나 비슷한 용량의 파일이 반복적으로 저장되게 됩니다. 이런식으로 파일이 계속 저장된다면 서버의 디스크 용량이 빠르게 소진되어 결국 저장 공간 부족 문제가 발생할 것이라고 생각했습니다.
이러한 문제를 해결하기 위해서 서버에서는 유저로부터 업로드 받은 프로젝트 파일의 용량을 최소한으로 저장하고 관리되어야 하고 그와 동시에 형상관리 기능이 충분히 제공되어야 할 필요가 있습니다. 그리고 이를 해결하기 위해서 형상관리 전략에 대한 방식을 모색하게 되었습니다.
디스크 용량 부족 문제에 대해 첫 번째로 발견한 대안은 snapshot 기법을 활용하는 것이었습니다.
snapshot 이란, 특정 시점의 파일 상태를 포착하여 그 시점의 데이터를 그대로 저장해 두는 것을 의미합니다.
snapshot을 활용하면 파일이나 디렉터리의 복사본을 만들지 않고 파일 시스템의 변화만 기록하여 저장공간을 효율적으로 활용할 수 있습니다.
snapshot으로 특정 시점의 파일 상태를 포착하여 비교 대상이 되는 파일과 상태를 비교합니다. 이 때 변경이 감지된 파일은 디스크에 추가로 변경된 파일이 저장됩니다. 그러나 변경이 감지되지 않은 파일은 “하드링크”라는 개념에 의해 동일한 파일 데이터를 참조하여 추가적인 저장이 발생하지 않게 됩니다.
이러한 원리로 디스크 용량을 최소한으로 활용할 수 있습니다.
우선적으로 CLI 환경에서 snapshot 테스트를 진행해 보았습니다. (macOS iTerm2 터미널 기준)
테스트 과정은 다음과 같습니다.
작업 디렉토리 역할을 하는 test 폴더 안에 test1.txt, test2.txt 파일을 생성합니다.
test 폴더 안에 파일들을 대상으로 snapshot 폴더에 스냅샷을 최초 생성합니다.
test 폴더 안의 test2.txt 파일에 대한 작업을 수행합니다.
이후 최초 생성한 스냅샷이 존재하는 snapshot 폴더를 비교 대상으로 설정하고 test 폴더 안에 파일들을 대상으로 snapshot2 폴더에 두 번째 스냅샷을 생성합니다.
스냅샷이 생성된 두 폴더 안에 파일의 inode 번호를 비교하여 하드링크로 연결되어 있는지 확인합니다.
최초 스냅샷 생성
기본적으로 위의 사진과 같이 작업 디렉토리 역할을 하는 test 폴더 안에 test1 파일과 test2 파일이 존재합니다.
rsync -av ~/Desktop/test/ ~/Desktop/snapshot/
위 명령어로 test 폴더 안의 파일들을 snapshot 폴더에 최초 스냅샷을 생성해 보겠습니다.
해당 명령어를 터미널에 입력하면
위와 같이 snapshot 폴더에 test 폴더 안에 존재하는 파일들의 스냅샷이 생성됩니다.
두 번째 스냅샷 생성
먼저, 상태 비교를 위해 test 폴더에 존재하는 test2 파일의 내용을 위와 같이 수정합니다.
rsync -av --link-dest=../snapshot ~/Desktop/test/ ~/Desktop/snapshot2/
이제, snapshot 폴더를 --link-dest 옵션으로 스냅샷 비교 대상으로 설정하고 snapshot2 폴더에 test 폴더 안의 파일들에 대한 스냅샷을 생성해 보겠습니다.
해당 명령 수행 결과로
위와 같이 snapshot2 폴더에 test 폴더 안에 존재하는 파일들의 스냅샷이 생성됩니다.
스냅샷 비교 최초 생성한 스냅샷과 두 번째로 생성한 스냅샷을 비교했을 때 test1 파일은 변경 사항이 없었기 때문에 하드링크로 연결되어 있어야 하고 test2 파일은 변경 사항이 존재했기 때문에 하드링크로 연결되어 있지 않아야 합니다.
ls -i ~/Desktop/snapshot
ls -i ~/Desktop/snapshot2
위 명령어를 입력해서 각 스냅샷 파일들을 -i 옵션으로 inode 번호를 확인하여 하드링크로 연결되어 있는지 확인해 보겠습니다.
예상한 결과와 같이, 변경 사항이 존재하지 않았던 test1 파일은 inode 값이 같으므로 하드링크로 연결되어 있음을 확인할 수 있고 변경 사항이 존재했던 test2 파일은 파일이 추가로 저장되기 때문에 inode 값이 달라져 하드링크로 연결되지 않음을 확인할 수 있습니다.