Discord의 메시지 저장 아키텍처: MongoDB에서 Cassandra로의 전환

Source

  • Evernote/Inbox/How Discord Stores Billions of Messages - Discord Blog.md

Summary

Discord는 초기 개발 시 빠른 이터레이션을 위해 MongoDB를 사용했으나, 데이터 양 증가로 인한 RAM 부족 및 인덱스 성능 저하 문제를 겪었다. 일일 1억 2천만 건 이상의 메시지 처리와 무작위 읽기(Random Read) 패턴, 선형 확장성, 자동 장애 조치, 낮은 유지보수 비용 등을 요구사항으로 정의한 결과, Cassandra를 선택했다. Cassandra는 파티션 키와 클러스터링 키를 기반으로 한 KKV(Key-Value) 구조를 통해 관련 데이터를 디스크에 연속적으로 저장하여 디스크 시크를 최소화하고, 노드 추가만으로 선형 확장 및 고가용성을 보장한다.

Key Points

  • 초기 아키텍처: 빠른 개발을 위해 MongoDB 단일 리플리카셋 사용, 채널 ID 및 생성 시간 기반 복합 인덱스 적용.
  • 이동 동기: 1억 건 메시지 도달 시 RAM에 데이터/인덱스 수용 불가로 인한 지연 시간 불안정 발생.
  • 요구사항: 선형 확장성, 자동 장애 조치, 낮은 유지보수, 예측 가능한 성능(95% 응답 시간 <80ms), 오픈소스.
  • Cassandra 선택 이유: 노드 추가 기반 확장, 노드 손실 내성, Netflix/Apple 등 검증된 사례, 디스크 상의 연속적 데이터 배치로 시크 최소화.
  • 데이터 모델링: KKV(Key-Value) 스토어 구조, 파티션 키(노드/디스크 위치 결정)와 클러스터링 키(정렬/행 식별) 기반 설계.