LSM Tree (Log-Structured Merge Tree) - 1

비구름·2025년 7월 17일

자료구조

목록 보기
6/6

LSM 트리는 쓰기 성능 최적화를 위한 트리 기반 인덱싱 구조로, 로그 구조 병합 트리라는 이름을 갖습니다. 이 글에서는 LSM 트리의 개념, 구조, 구성 요소, 그리고 쓰기 최적화를 위한 다양한 방식들을 정리합니다.

LSM 트리란?

Log-Structured Merge Tree는 데이터를 메모리에 먼저 기록하고, 이후 디스크에 순차적으로 병합(merge)하여 저장하는 구조입니다. 랜덤 쓰기 대신 순차 쓰기를 활용함으로써 디스크 I/O를 줄이고, 쓰기 성능을 극대화합니다.

불변(Immutable) 자료구조란?

LSM 트리는 불변 자료구조입니다. 즉, 데이터를 수정할 때 기존 데이터를 덮어쓰지 않고 새로운 위치에 레코드를 추가합니다.

불변 자료구조의 장점

  • 쓰기 효율 향상: 덮어쓰기가 아니라 새로운 위치에 기록 → 랜덤 I/O 최소화
  • 단편화 방지: 고정된 크기의 레코드를 연속된 공간에 저장 가능
  • 복구 용이성: 이전 상태 복원이 간단 (예: 툼스톤 기반 삭제)

가변 자료구조 예: B-트리

  • 기존 위치에서 데이터를 수정하거나 삭제
  • 무작위 접근(Random Access)이 많아 쓰기 I/O 부담 증가
  • 블록 단편화 가능성 존재

LSM 트리의 구성 요소

1. 멤테이블 (Memtable)

위치읽기쓰기
메모리OO
  • 메모리 상에 존재하는 정렬된 데이터 구조 (주로 SkipList, Red-Black Tree 등)
  • 쓰기 작업은 이곳에 먼저 저장됨
  • 임계 크기 도달 시 디스크로 플러시

2. SSTable (Sorted String Table)

위치읽기쓰기
디스크OX
  • 디스크에 저장되는 읽기 전용 불변 테이블
  • 멤테이블이 디스크로 내려오면 SSTable로 저장
  • 정렬된 형태 유지, 검색 및 병합 최적화

3. Write-Ahead Log (WAL)

  • 멤테이블보다 먼저 기록되는 로그
  • 시스템 장애 복구 시 멤테이블 복원 가능

이중 컴포넌트 LSM 트리

구조

  • C0: 메모리 기반 멤테이블
  • C1: 단일 디스크 기반 컴포넌트 (읽기 전용, 100% 채워진 노드)

특징

  • 디스크는 읽기 전용이며 쓰기 작업은 전부 멤테이블에
  • 플러시 시 서브트리 단위 병합
  • 병합 중에도 읽기/쓰기 가능
  • 병합 종료 후 원자적으로 적용 & 불필요한 서브트리 제거

플러시 빈도에 따라 쓰기 증폭이 심해질 수 있어 실제 사용 사례는 없다고 합니다.

다중 컴포넌트 LSM 트리

계층 구조

  • C0 (Memtable) → C1, C2 ... Cn (SSTable)
  • 디스크 기반 테이블이 여러 개 존재
  • 계층 간 병합 및 압축(compaction) 수행

컴포넌트 상태별 읽기/쓰기 여부

컴포넌트읽기쓰기
최신 멤테이블OO
플러시 대상 멤테이블OX
디스크 SSTableOX
압축 대상 SSTableOX
압축 완료 SSTableOX

삽입/수정/삭제 처리 방식

  • 모든 연산은 멤테이블에 기록
  • 중복 키는 최신 값만 읽기 시 반영

삭제 처리: 툼스톤(Tombstone)

  • 삭제 요청 시 실제 삭제가 아닌 "삭제 표시" 레코드를 기록
  • 이후 병합 과정에서 다른 테이블에 존재하지 않는지 확인 후 완전히 제거

압축(Compaction) 과정

왜 압축하는가?

  • 테이블 수가 많아질수록 읽기 성능 저하
  • 이를 방지하기 위해 계층 간 병합 및 중복 제거

방법

  • 모든 SSTable은 정렬된 상태 유지
  • 여러 SSTable의 최상위 항목을 우선순위 큐(PQ)로 병합
  • 중복 키는 타임스탬프 기반 최신 값만 유지

PQ는 중복 키를 허용해야 하며, 최신 값을 선택해야 합니다.

정리

항목LSM 트리
목적쓰기 최적화, 순차적 디스크 접근
구조불변 구조, 멤테이블 + SSTable 계층
쓰기메모리 → WAL 기록 → 멤테이블 → 플러시
읽기멤테이블 + SSTable 병렬 검색 (Bloom Filter 등 보조)
삭제툼스톤으로 표시 후 병합 시 제거
병합정렬 병합 + 중복 제거 + 최신 값 유지

본 정리는 Database Internals 도서를 기반으로 작성되었습니다.

profile
기본부터 정리해나가는 기록용 블로그

0개의 댓글