본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Fly Volumes 개요 (Fly Volumes overview)

원문 보기 위키 갱신

Fly Machine의 루트 파일 시스템은 임시적이므로 영구 데이터는 볼륨에 저장해야 해요. Fly Volumes는 Fly Machines를 위한 로컬 영구 스토리지로, 일반 디렉터리처럼 접근하고 쓸 수 있어요. 이 페이지에서는 볼륨의 특성, 고려 사항, 첨부, 중복성, 배치, 암호화, 크기, 한도, 포크, 스냅샷을 자세히 설명해 드릴게요.

출처: 문서

본문

Illustration by Annie Ruygt of a filing cabinet

Fly Machine의 루트 파일 시스템은 임시적이며 임시 데이터, 애플리케이션 코드, 그리고 배포나 재시작 시 처음부터 다시 구축할 수 있는 런타임 파일에만 사용해야 해요. 이 임시 디스크의 성능은 어떤 Machine 유형을 선택하든 관계없이 크게 제한되며, 최대 2000 IOPs와 8MiB/s 대역폭이에요.

Fly Volumes는 Fly Machines를 위한 로컬 영구 스토리지예요. Machine에서 볼륨에 접근하고 쓰는 것은 일반 디렉터리처럼 할 수 있어요. 데이터베이스 파일을 저장하고, 구성, 세션 또는 사용자 데이터 같은 앱 상태를 저장하며, 배포나 재시작 후에도 지속되어야 하는 모든 정보를 저장하는 데 볼륨을 사용하세요. 최대 볼륨 성능은 Machine 유형에 따라 다르며 볼륨 한도에 명시돼 있어요.

Fly Volume은 Machine이 마운트된 것과 동일한 물리 서버에 있는 NVMe 드라이브의 조각이며 그 하드웨어에 묶여 있어요. Fly Volumes는 랩톱 내부의 디스크와 비슷해서 파일 시스템의 마운트 지점에서 접근할 수 있어요. 하드웨어에 묶인 볼륨을 사용하는 데는 장단점이 모두 있어요.

볼륨 고려 사항

  • 볼륨은 한 앱에 속한다: 모든 Fly Volume은 Fly App에 속하며 앱 간에 볼륨을 공유할 수 없어요.
  • 볼륨은 한 서버에 존재한다: 각 볼륨은 단일 리전의 한 서버에 존재해요. 네트워크 스토리지가 아니에요.
  • 볼륨은 한 Machine에 첨부될 수 있다: Machine 수만큼 볼륨을 실행해야 해요. Machine과 볼륨 사이에는 일대일 매핑이 있어요. Machine은 한 번에 하나의 볼륨만 마운트할 수 있고 볼륨은 한 Machine에만 첨부될 수 있어요.
  • 복제를 처리하도록 앱을 개발하세요: 볼륨은 서로 독립적이에요. Fly.io는 앱의 볼륨 사이에서 데이터를 자동으로 복제하지 않으므로 볼륨을 동기화해야 한다면 그 작업은 앱이 해야 해요.
  • 프라이머리 리전에 중복성을 만드세요: 앱이 작동하는 데 볼륨이 필요하고 볼륨을 호스팅하는 NVMe 드라이브가 실패하면 그 앱 인스턴스는 다운돼요. 이를 피할 방법은 없어요. 앱의 프라이머리 리전에서 볼륨이 있는 Machine을 여러 개 실행해 하드웨어 실패를 완화할 수 있어요.
  • 백업을 만들고 저장하세요: 단일 볼륨에 데이터 복사본이 하나뿐이고 그 드라이브가 실패하면 데이터가 손실돼요. Fly.io는 매일 스냅샷을 찍고 1~60일 동안 보관할 수 있지만(기본 5일), 스냅샷을 기본 백업 방법으로 삼아서는 안 돼요.

데이터 스토리지에 대한 다른 옵션은 Databases & Storage에서 살펴보세요.

볼륨 첨부

Fly Volumes와 Fly Machines는 짝을 이루도록 설계됐지만 항상 짝으로 발견되지는 않아요. Fly Volume은 Fly Machine 없이 만들 수 있고, Machine은 볼륨을 파괴하지 않고 파괴될 수 있어요. 이런 경우 남는 볼륨을 "unattached" 볼륨이라고 불러요.

볼륨이 필요 없는 Fly Machine은 결코 볼륨에 스스로 첨부하지 않아요. 볼륨이 필요한 Fly Machine은 항상 볼륨에 첨부돼요. 앱 또는 Machine 구성에 따라 볼륨이 필요할 때, 새 Fly Machine을 만드는 어떤 방법이든 unattached 볼륨을 집어 들거나 새 볼륨을 만들어 첨부하거나(fly machine 명령이나 create Machine API 호출의 경우) 실패할 거예요.

볼륨 중복성

**경고: 항상 앱당 볼륨을 최소 두 개 프로비저닝하세요.** 단일 Machine과 볼륨으로 앱을 실행하면 다운타임과 데이터 손실 위험이 있습니다. 볼륨 사이에는 내장된 복제가 없으므로 앱이나 데이터베이스가 볼륨 사이에서 데이터를 복제하는 작업을 처리해야 합니다.

우리는 개별 Fly Machine을 가능한 한 오래 실행하려고 하지만 하드웨어 실패는 발생해요. 그래서 가용성을 높이려면 앱당 최소 두 개의 Machine을 실행하는 것을 권장해요. 한 리전에서 두 개 이상의 Machine을 실행하거나, 더 좋게는 여러 리전에 한 개 이상의 Machine을 실행할 수 있어요. Machine과 볼륨이 하나뿐이라면 호스트나 네트워크 실패가 있거나 앱을 배포할 때마다 다운타임이 생겨요.

또한 볼륨 간에 데이터를 복제해야 해요. 데이터베이스를 복제하는 몇 가지 옵션으로는 LiteFS - Distributed SQLite와 Supabase Postgres가 있어요.

몇몇 경우에는 첨부된 볼륨으로 단일 Machine을 실행할 수 있어요. 예를 들어 앱이 개발 중이라 아직 다운타임을 걱정하지 않거나, 다운타임을 처리할 수 있고 커스텀 백업 절차가 있는 앱을 실행 중이라면요.

볼륨 배치

Machine을 만들 때 볼륨을 같이 만들거나 미리 만들 수 있어요. flyctl scale count로 새 Machine을 만들려고 하면 flyctl은 먼저 새 Machine을 만드는 리전에 unattached 볼륨이 있는지 확인해요. unattached 볼륨을 찾으면 같은 서버에 새 Machine을 만들려고 해요. unattached 볼륨을 찾지 못하면 Machine과 함께 새 볼륨을 만들어요. fly volumes create로 unattached 볼륨을 만들 수도 있어요.

볼륨은 단일 리전의 단일 서버에 존재해요. 리전 내 중복성을 위해 첨부된 볼륨이 있는 Machine을 여러 개 실행할 수 있어요. 볼륨은 자동으로 서로 데이터를 복제하지 않는다는 점을 기억하세요.

단일 서버 하드웨어 실패가 앱을 다운시키지 않게 하려면 각 볼륨을 별도의 하드웨어 존(hardware zone)에 두는 것이 좋아요. 별도의 하드웨어 존은 다른 서버라는 뜻의 다른 말일 뿐이에요. fly volumes create 명령으로 볼륨을 만들 때 기본적으로 별도의 하드웨어 존을 사용하지만, 다른 방법으로 Fly Volumes를 만들 때는 보장되지 않아요. 각 볼륨이 별도의 하드웨어 존에 있으면 앱이 한 리전에 가질 수 있는 볼륨 수가 제한된다는 점에 유의하세요. 리전에 있는 하드웨어 존 수보다 더 많은 볼륨이 필요하다면 fly volumes create를 실행할 때 --require-unique-zone을 false로 설정할 수 있어요.

fly volumes create 명령과 함께 --vm-XXX 옵션을 사용해 볼륨에 사용할 예정인 컴퓨트 부하 유형을 힌트로 줄 수 있어요. 예를 들어 performance-4x Machine을 볼륨에 첨부할 계획이라면 --vm-size=performance-4x를 설정해 그 Machine을 수용할 용량이 있는 호스트에 볼륨을 배치하세요. 힌트가 없으면 볼륨이 첨부하려는 Machine을 수용할 공간은 있지만 볼륨만 수용할 수 있는 호스트에 놓일 수 있어요.

볼륨 암호화

볼륨은 기본적으로 저장 시 암호화(encryption-at-rest)가 활성화된 상태로 생성돼 볼륨의 데이터를 추가로 보호해요. --no-encryption을 사용해 암호화되지 않은 볼륨을 만들 수도 있어요.

볼륨 크기

fly volumes create 명령으로 볼륨을 만들 때와 fly launch 명령으로 볼륨과 함께 앱을 출시할 때 기본 볼륨 크기는 1GB예요. 최대 볼륨 크기는 500GB예요.

볼륨 크기를 수동으로 또는 자동으로 확장해 더 크게 만들 수 있지만, 볼륨을 줄일 수는 없어요.

볼륨 한도

다음 표는 Machine 유형에 따라 결정되는 Fly Volumes의 최대 IOPs와 대역폭을 보여줘요:

VM Size Max IOPs Max Bandwidth
shared-cpu-1x 4000 16MiB/s
shared-cpu-2x 4000 16MiB/s
shared-cpu-4x 8000 32MiB/s
shared-cpu-8x 8000 32MiB/s
performance-1x 12000 48MiB/s
performance-2x 16000 64MiB/s
performance-4x 16000 64MiB/s
performance-8x 32000 128MiB/s
performance-16x 32000 128MiB/s

볼륨 포크

볼륨을 포크하면 소스 볼륨의 데이터를 정확히 복사한 새 볼륨을 만들어 테스트, 백업, 또는 원하는 용도로 사용할 수 있어요. 리전을 지정하지 않으면 새 볼륨은 같은 리전에 있지만 다른 물리 호스트에 있어요. 포크된 볼륨은 같은 리전에서 새 Machine을 스케일하거나 복제할 때까지 Machine에 첨부되지 않아요. 새 볼륨과 소스 볼륨은 독립적이며 내용의 변경 사항은 동기화되지 않아요.

볼륨 스냅샷

Fly.io는 볼륨의 일일 블록 수준 스냅샷을 찍어요. 기본적으로 5일 동안 스냅샷을 보관하지만 스냅샷 보관을 1~60일로 구성할 수 있어요. 일일 자동 스냅샷에는 최신 데이터가 없을 수 있어요. 중요한 데이터에는 여전히 자체 백업 계획을 구현해야 해요.

주문형으로 볼륨 스냅샷을 만들 수도 있어요.

볼륨 스냅샷을 같거나 더 큰 크기의 새 볼륨으로 복원할 수 있어요.

자동 일일 스냅샷을 비활성화할 수도 있어요.

볼륨을 사용할 수 없는 경우

볼륨을 사용할 수 없는 몇 가지 경우가 있어요.

  • 빌드 시간: 애플리케이션 배포용 Docker 이미지를 빌드할 때(예: flyctl deploy) 볼륨에 접근할 수 없어요.
  • 릴리스 명령: release_command를 사용할 때 만들어진 임시 Machine에는 볼륨도 마운트되지 않아요.

관련 주제

더 알아보기 (Learn more)