본문으로 건너뛰기

스토리지 엔진

서버 → 엔진 → 타겟 계층 구조

스토리지 시스템은 서버 → 엔진 → 타겟 3단계 계층으로 구성됩니다.

스토리지 엔진 구조 다이어그램

스토리지 엔진 — 서버 내 독립 작업 단위

스토리지 서버 1대는 하나 이상의 스토리지 엔진을 실행합니다. 엔진은 독립된 프로세스로 동작하며, 각자의 네트워크 엔드포인트·메모리 공간·I/O 큐를 보유합니다.

서버 1대에 엔진 여러 개를 두는 이유: NUMA 격리

현대 서버는 CPU 소켓이 여럿이고 소켓마다 로컬 DRAM 뱅크가 따로 있습니다(NUMA 토폴로지). 다른 소켓의 메모리를 접근하면 수십 ns의 추가 지연이 발생합니다. 엔진을 NUMA 노드 1개에 묶어두면 그 엔진의 모든 메모리 접근이 로컬 DRAM에서 처리되어 크로스-NUMA 지연이 0이 됩니다.

결과적으로 서버 안에서 엔진 수를 늘릴수록 처리량이 NUMA 노드 수에 비례해 선형으로 확장되며, 엔진 하나가 장애를 일으켜도 다른 엔진의 I/O는 계속 진행됩니다.

I/O 타겟 — CPU 코어 1개가 전담하는 최소 I/O 단위

각 엔진 내부에는 여러 개의 I/O 타겟이 있습니다. 타겟은 실제 데이터 읽기·쓰기를 처리하는 가장 작은 독립 실행 단위입니다.

CPU 코어와 타겟은 항상 1:1로 고정됩니다. 타겟 하나는 전용 CPU 코어 하나에 핀닝되어 실행되며, 한 코어가 여러 타겟을 나눠 쓰거나 여러 코어가 한 타겟을 함께 쓰는 구성은 지원하지 않습니다. 이 설계 덕분에 타겟 간 스케줄링 경합이 없고, 코어 수에 정비례한 처리량 확장이 가능합니다.

각 타겟은 독립적인 SPDK I/O 큐를 보유하므로 타겟 사이에 락 경합이 발생하지 않습니다.

타겟과 NVMe의 매핑

타겟 하나가 NVMe 디바이스 하나를 전담하는 것이 기본 구성입니다. 서버에 CPU 코어가 NVMe보다 많은 경우, 물리 NVMe 하나를 여러 네임스페이스로 분할해 타겟 여러 개가 나눠 쓰는 구성도 가능합니다. 이 경우에도 타겟마다 독립 I/O 큐가 유지되어 경합이 없습니다.

구성타겟 : CPU 코어타겟 : NVMe
표준 (권장)1 : 11 : 1
코어 여유1 : 1N : 1 (네임스페이스 분할)

메타데이터 스토리지

각 I/O 타겟은 두 가지 저장 영역을 갖습니다:

  • DRAM: write buffer 역할입니다. 쓰기 요청을 즉시 수신·확인(ACK)하고 비동기로 NVMe에 플러시합니다.
  • NVMe: 메타데이터 인덱스를 영구 저장합니다. 재시작이나 장애 후에도 NVMe에서 복구합니다.

이 구조로 메타데이터 I/O가 DRAM 속도로 처리되면서 NVMe가 내구성을 보장합니다.

클러스터 관리 서비스

클러스터 내 3개 노드가 Raft 합의로 클러스터 관리 서비스를 구성합니다.

클러스터 관리 서비스의 역할:

  • Pool Map 유지: 클러스터 내 모든 서버·엔진·타겟의 구성과 상태를 기록합니다.
  • 장애 감지 및 전파: 노드 장애 감지 시 갱신된 Pool Map을 모든 클라이언트에 전파합니다.
  • 데이터 경로 비개입: Pool Map 변경만 알려줄 뿐, 실제 I/O에 참여하지 않습니다.

리더 재선출 중이어도 이미 접속한 클라이언트의 I/O는 계속 진행됩니다.

데이터 배치 알고리즘

클라이언트는 Object ID와 Pool Map을 조합해 어느 서버의 어느 타겟에 데이터를 저장할지 직접 계산합니다.

  • 메타데이터 서버 조회 없음: 배치 결정마다 중앙 서버를 조회하지 않아 이 오버헤드 자체가 0입니다.
  • 결정론적(Deterministic): 같은 Object ID는 항상 같은 타겟을 가리켜 재조회가 필요 없습니다.
  • 클라이언트 분산 계산: 클라이언트마다 독립적으로 계산하므로 배치 결정 단계에서 병목이 없습니다.

Pool Map이 변경(노드 장애, 노드 추가)되면 클러스터 관리 서비스가 클라이언트에 알리고, 클라이언트는 새 Pool Map으로 재계산합니다.

Replication / Erasure Coding

VolumeGroup 생성 시 보호 정책을 선택합니다. 복제본과 패리티 블록은 항상 서로 다른 서버의 타겟에 배치됩니다.

정책구성보호 수준용량 오버헤드
Replica 22벌 복사서버 1대 장애 보호
Replica 33벌 복사서버 2대 동시 장애 보호
EC 2+1 (Standard)데이터 2 + 패리티 1서버 1대 장애 보호1.5×
EC 4+2 (Enterprise)데이터 4 + 패리티 2서버 2대 동시 장애 보호1.5×
EC 6+3 (High Redundancy)데이터 6 + 패리티 3서버 3대 동시 장애 보호1.5×

Replica와 EC는 배타적으로 선택합니다. 대용량 워크로드에서는 EC가 동일한 보호 수준 대비 용량 효율이 높습니다.