Fly Volume 포크로 시작 시간 단축하기
주의: 이 가이드는 포킹(forking)을 사용해 큰 파일을 볼륨에 미리 로드해 시작 성능을 개선하는 방법을 보여줘요. 큰 모델 파일, 바이너리, 데이터베이스가 있는 앱에 특히 유용해요.
출처: 문서
본문
개요
앱이 ML 모델, SQLite 데이터베이스, 게임 에셋 같은 큰 로컬 파일을 필요로 한다면, 아마 부팅 시 그 파일들을 제자리에 복사하고 있을 거예요. 이미지에 구워 넣거나, 앱이 처음 실행될 때 다운로드하게 하거나요. 이 방식은 작동하지만 단점이 있어요:
- 느린 시작 시간: 멀티 GB 파일 다운로드를 기다리는 시간.
- 낭비되는 대역폭: 새 Machine마다 같은 데이터를 끌어옴.
- 이미지 비대화: 큰 파일이 OCI/Docker 이미지 크기를 키움.
더 나은 방법이 있어요. 그 파일들을 Fly Volume에 써서 다운로드된 뒤에도 지속되게 하는 거예요. Fly Volumes는 포킹(forking)을 지원하는데, 이는 데이터가 미리 채워진 새 볼륨을 만드는 빠르고 저장 효율적인 방법이에요. 다운로드와 시작 지연을 건너뛸 수 있죠.
왜 이 패턴을 쓰나요?
Machine을 복제하고, 큰 파일이 이미 모두 제자리에 있으면서 빠르게 부팅되길 원할 때요.
이것은 장기 영속성에 대한 얘기가 아니에요(물론 볼륨을 그렇게 쓸 수도 있지만). 콜드 스타트를 웜 스타트에 가깝게 만드는 것, 즉 부팅 과정의 "인터넷 절반 다운로드" 단계를 건너뛰는 것에 대한 얘기예요.
다음의 경우 특히 유용해요:
- 설정 단계를 한 번 실행했고 반복하고 싶지 않을 때.
- 앱이 큰 파일을 읽지만 수정하지 않을 때.
- 온디맨드로 확장 중이고 시작 시간이 중요할 때.
볼륨 포킹이 작동하는 방식
볼륨을 포크하면:
- 데이터가 원본 볼륨에서 블록 단위로 복사돼요.
- 포크된 볼륨은 즉시 사용 가능해요. hydrating 상태에 있는 동안에도요. 지연 페칭(lazy fetching, 앱이 실제로 블록을 읽으려 할 때만 원본 볼륨에서 데이터 블록을 가져오는 시스템) 덕분이에요.
포크가 성공하는 즉시 앱이 파일 읽기를 시작할 수 있어요. 우리는 바로 백그라운드 복제를 시작하지만, 뒤에서는 네트워크 블록 디바이스를 사용해 필요할 때 블록을 가져와요. 그래서 시작이 빠르고, 데이터는 앱이 요청할 때 나타나요.
한 가지 절충: 복제가 진행되는 동안 디스크 접근이 약간 느려질 수 있어요. 하지만 많은 앱에서 이는 파일을 다운로드하거나 풀며 생기는 시작 지연을 이기는 편이에요.
예시: 미리 로드된 데이터로 Machine 복제하기
1. 포크할 원본 볼륨이 사용 가능한지 확인하기
fly volumes list -a your-app
재사용할 데이터가 있는 볼륨을 고르세요.
2. 볼륨 포크하기
fly volumes fork vol_abc123 -a your-app
다음과 같은 출력이 나올 거예요:
ID: vol_new_id
Name: volume_name
App: your-app
Region: yul
Zone: b5a1
Size GB: 20
Encrypted: true
Created at: 05 Sep 25 21:52 UTC
vol_new_id를 잘 기억해 두세요.
3. Machine을 복제하고 포크된 볼륨을 붙이기
fly machine clone <machine_id> --attach-volume vol_new_id
이제 새 Machine은 같은 데이터가 제자리에 있는 채로 시작해요 — 앱이 다시 다운로드하거나 생성할 필요가 없어요.
알아 둘 점
- 포크는 뒤에서 즉시 일어나지 않아요. 바로 읽을 수는 있지만, 전체 복사는 백그라운드에서 일어나요. 복제가 끝날 때까지 디스크 I/O가 느릴 수 있어요.
- 데이터는 스냅샷이지, 살아있는 링크가 아니에요. 포크 후 원본의 변경은 복사본에 나타나지 않아요(그 반대도 마찬가지).
- 크로스 리전 포크가 가능해요.
--region플래그로 포크할 다른 region을 지정할 수 있어요. 생략하면 볼륨은 기본적으로 같은 region에 생겨요. 크로스 리전 포크는 region 사이의 네트워크로 모든 데이터를 복제해야 하므로 hydrating이 더 느릴 것으로 예상하세요. - 포크는 저장 비용이 들어요. 블록이 페치되거나 쓰일 때 포크된 볼륨이 커져요. 많이 포크한다면 저장 사용량 비용을 주시하세요.
(선택) CI에서 자동화하기
배포를 스크립팅하거나 Machine을 동적으로 확장한다면, 이 패턴을 CI 작업이나 자동화 스크립트에 접어 넣을 수 있어요.
대략적인 스케치:
# Step 1: Fork the seed volume
FORKED_VOL=$(fly volumes fork vol_abc123 -a your-app | grep ID | awk '{ print $2 }')
# Step 2: Clone the machine and attach the fork
fly machine clone <machine_id> --attach-volume $FORKED_VOL
이렇게 하면 롤아웃 과정의 일부로 미리 로드된 볼륨을 만들고 붙일 수 있어요. 작업당 새 VM을 세우거나 온디맨드로 추론(inference) Machine을 확장할 때 유용하죠.
이것은 완전히 선택 사항이에요. 대부분의 사람들은 수동으로 하거나 릴리스당 한 번만 해요. 하지만 이미 fly machine 작업을 스크립팅하고 있다면, 딱 맞아요.
관련 자료
- Fly Volumes 개요
- 볼륨 만들기와 관리
- 볼륨 상태
fly volumes fork참조