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