콘텐츠로 이동

MongoDB architecture

MongoDB가 단순한 NoSQL 데이터베이스를 넘어, 내부 저장 엔진(Storage Engine)과 아키텍처를 어떻게 혁신해왔는지에 대한 깊이 있는 내용을 담고 있습니다.


1. 데이터베이스의 기본 구조: 프론트엔드와 저장 엔진

모든 데이터베이스는 크게 두 부분으로 나뉩니다.

  • 프론트엔드(API): 사용자가 데이터베이스와 소통하는 통로입니다. (예: SQL, MongoDB의 get/set API)
  • 저장 엔진(Storage Engine): 데이터를 실제로 디스크에 어떻게 쓰고 읽을지 결정하는 핵심 모듈입니다. 데이터의 압축, 트랜잭션, 인덱스 관리, WAL(Write Ahead Log/저널링)을 통한 복구 등을 담당합니다.

    핵심 포인트: 저장 엔진은 데이터가 '문서'인지 '행'인지 관심이 없습니다. 오직 페이지(Page) 단위의 바이트 덩어리로 데이터를 처리합니다.


2. MongoDB 저장 엔진의 역사적 진화

① 초기 단계: MMAP (V1)

  • 방식: 데이터 파일에 문서를 순차적으로 저장하고, B-트리 인덱스가 디스크 위치(오프셋)를 가리키는 방식입니다.
  • 한계:
  • 잠금(Locking) 문제: 초기에는 데이터베이스 전체 혹은 컬렉션 단위로 잠금이 걸려 동시성 처리가 매우 나빴습니다.
  • 유연성 부족: 문서 크기가 커지면 디스크 오프셋이 밀려나 데이터 관리가 어려웠습니다.

② 혁신 단계: WiredTiger 도입 (v3.0 ~ v5.2)

  • 변화: 2014년 인수를 통해 도입된 고성능 엔진으로, 문서 수준 잠금(Document-level Locking)데이터 압축을 지원합니다.
  • 인덱스 구조: * 내부적으로 레코드 ID(64비트) 기반의 숨겨진 클러스터형 B-트리를 사용합니다.
  • 하지만 사용자가 사용하는 ID(기본 키)로 조회할 때, 'ID 인덱스 스캔 → 레코드 ID 획득 → 실제 데이터 조회'라는 이중 조회(Double Lookup) 과정이 발생하여 성능 오버헤드가 있었습니다.

3. 최신 기술: 클러스터형 컬렉션 (v5.3 ~ 현재)

2022년 7월경 도입된 기능으로, MongoDB 아키텍처의 정점이라 할 수 있습니다.

  • 개념: 기존의 숨겨진 레코드 ID를 제거하고, 사용자의 ID 필드를 직접 클러스터 인덱스의 키로 사용합니다.
  • 장점:
  • 단일 검색(Single Lookup): 한 번의 검색으로 실제 데이터(문서)에 즉시 도달합니다.
  • 성능 향상: IO 횟수가 줄어들고, 데이터가 실제 키 순서대로 물리적으로 정렬되어 범위 쿼리(Range Scan)에 매우 유리합니다.

  • 주의점:

  • 보조 인덱스(Secondary Index)들이 이제 레코드 ID가 아닌 사용자 ID를 가리킵니다.
  • 만약 ID 값이 너무 크거나(예: 무분별한 UUID 사용) 무작위라면 보조 인덱스의 크기가 커지고 효율이 떨어질 수 있습니다 (MySQL의 설계 고민과 유사해짐).

요약 테이블: MongoDB 아키텍처 변화

구분 MMAP (V1) WiredTiger (기본) 클러스터형 컬렉션 (v5.3+)
잠금 단위 DB / 컬렉션 수준 문서(Document) 수준 문서(Document) 수준
압축 지원 안 함 지원 (높은 효율) 지원 (높은 효율)
조회 방식 인덱스 → 오프셋(O(1)) 이중 검색 (B-트리 2회) 단일 검색 (B-트리 1회)
데이터 물리 구조 순차적 저장 레코드 ID 기준 정렬 사용자 ID 기준 정렬