저장 엔진: LSM 트리

저장 엔진: LSM 트리 (Storage Engine)

Cassandra의 저장 엔진은 고성능의 쓰기 중심(write-oriented) 워크로드에 최적화돼 있어요. 구조는 LSM(Log Structured Merge) 트리 기반으로, 전통적인 관계형 데이터베이스가 쓰는 B-트리 대신 append-only 방식을 사용해요. 그 덕분에 읽기 조회나 병목 없이 빠른 쓰기 경로를 만들 수 있어요.

출처: Cassandra — Storage Engine

쓰기 경로

쓰기가 발생하면 데이터는 먼저 **커밋 로그(commit log)**에 기록되고, 이후 메모리의 **멤테이블(memtable)**에 쌓여요. 멤테이블이 일정 크기에 이르면 디스크의 SSTable로 플러시돼요. 이후 데이터는 다시 쓰이지 않거나 컴팩션(compaction)을 통해서만 정리돼요.

  • Commit log — 쓰기 연산의 내구성을 보장하기 위한 로그.
  • Memtable — 메모리 안의 쓰기 버퍼.
  • SSTable — 디스크에 영속화된 불변(immutable) 정렬 데이터 파일.

쓰기 최적화의 대가

쓰기 경로는 극도로 최적화되어 있지만, 그 대가로 읽기 성능과 쓰기 증폭(write amplification) 측면에서 트레이드오프가 있어요. 읽기를 개선하기 위해 Cassandra는 SSTable에 접근할 때 **블룸 필터(Bloom filter)**를 사용해요. 블룸 필터는 매우 효율적이라서 읽기와 쓰기 모두 전반적으로 균형 잡힌 성능을 냅니다.

컴팩션

컴팩션(compaction)은 LSM 트리의 'merge' 단계에 필요한 백그라운드 활동이에요. 디스크에 흩어진 여러 개의 작은 SSTable을 읽고, 병합하며, 업데이트와 삭제를 처리하고, 새 SSTable을 다시 쓰기 때문에 쓰기 증폭이 생겨요. Cassandra의 모든 쓰기는 결국 여러 번 다시 쓰여질 수 있기 때문에, 컴팩션 전략을 잘 고르는 것이 성능과 저장 공간 관리에 중요해요.

더 알아보기