Skip to content

Snapshot 기능 구현 #60

@kwonkwonn

Description

@kwonkwonn

Goal

백엔드에서 VM 스냅샷을 효율적으로 관리하는 기능을 구현한다. 크게 두 가지 유형의 스냅샷을 지원한다: 롤백 스냅샷 (인스턴스 내부 상태 복원)과 외부 스냅샷 (오브젝트 스토리지 기반 이식성 있는 이미지).


Requirements

롤백 스냅샷

  • 각 롤백 스냅샷은 현재 동작 중인 VM의 위치 정보를 포함해야 한다.
  • 롤백 요청은 VM uuid + snapshot uuid 조합으로 특정 대상을 식별한다.
  • 롤백 스냅샷 수는 최대 ~10개 수준으로 예상되므로 []rollback.Snapshot 슬라이스로 충분하다. (map 불필요)
  • Cores -> []rollback.Snapshot 구조로 관리하며, 탐색 흐름은 아래와 같다:
    1. seekRollbackSnapshot(vmUUID, snapshotUUID) 로 해당 코어 내 스냅샷 탐색
    2. 존재하면 코어에 전달할 쿼리 생성 후 전송 (탐색 함수는 VM 서비스 레이어에서 재사용)
    3. 존재하지 않으면 No such rollback snapshot 에러 반환

예상 자료구조:

package rollback

type Snapshot struct {
UUID string
ParentVMUUID string
Timestamp time.Time
// 추가 필드
}
// DB 저장 시 primary key: snapshot UUID, 인덱스: parentVMUUID, timestamp

외부 스냅샷

  • 롤백 스냅샷 포함 여부와 관계없이 모든 VM을 외부 스냅샷으로 export할 수 있어야 한다.
  • 외부 스냅샷은 오브젝트 스토리지에 저장한다.
  • 오퍼레이션은 아래 단위로 분리한다:
오퍼레이션 방향 설명
PullBaseImage(uuid | name) Object Storage → Core 인스턴스 생성 전 base image 다운로드
CreateVM(spec) Core 내부 이미지 준비 완료 후 VM 생성
PushExternalSnapshot(vmUUID) Core → Object Storage 생성된 VM 이미지를 외부 스냅샷으로 업로드
ExportSnapshot(vmUUID) Core → Object Storage 롤백 유무 무관하게 특정 VM을 외부 스냅샷으로 export

Notes

  • 자료구조 결정 근거: 롤백 스냅샷은 최대 ~10개이므로 []rollback.Snapshot 슬라이스로 충분하다. 조회 패턴이 uuid 기반 순차 탐색이므로 map의 추가 복잡도를 도입할 이유가 없다.
  • 오브젝트 스토리지 방향: 코어 → 오브젝트 스토리지 방향의 push/pull로 구현. 오브젝트 스토리지가 특정 IP로 직접 push하는 방식은 지원이 불확실하므로 코어 주도 방식으로 통일한다.
  • 외부 스냅샷 선행 조건: 오브젝트 스토리지 구현 및 코어의 PullBaseImage 기능이 완료되어야 외부 스냅샷 작업을 시작할 수 있다.
  • gRPC 전환 검토: 현재 구조에서 외부 스냅샷의 각 오퍼레이션(PullBaseImage, PushExternalSnapshot 등)은 HTTP 단일 엔드포인트 안에 묶이기 쉬운데, 이를 명시적으로 분리하려면 설계상의 의지가 필요하다. gRPC를 도입하면 .proto 에 각 RPC를 선언하는 것 자체가 오퍼레이션 경계를 강제하므로 자연스럽게 분리된다. 또한 base image처럼 큰 파일을 전송할 때 server-side streaming으로 진행률을 실시간으로 내려줄 수 있어 UX와 에러 추적 모두 유리하다. 현 시점에서 바로 전환하기는 어렵지만, 외부 스냅샷 설계 시 오퍼레이션 단위를 gRPC로 이전하기 쉬운 형태로 잡아두는 것이 좋을 것 같다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions