기술 블로그
C레벨 - 고난도
How Discord Stores Trillions of Messages
DB
마이그레이션
대규모 데이터
ScyllaDBCassandraRustgRPC
배경
Discord는 수조 개의 메시지를 저장하고 서빙하기 위해 Cassandra를 사용하고 있었습니다. 177개 노드로 클러스터를 운영했으나 읽기 지연이 점점 증가하고 있었습니다.
도전 과제
Cassandra의 compaction 성능 문제로 p99 읽기 레이턴시가 40-125ms까지 치솟았습니다. Hot partition 문제, GC pause, tombstone 누적 등 대규모 시계열 데이터에서의 Cassandra 한계에 직면했습니다. 수조 개의 기존 메시지를 무중단으로 마이그레이션해야 했습니다.
해결 방안
ScyllaDB로 마이그레이션을 결정하고, Rust로 커스텀 데이터 마이그레이터를 개발했습니다. 초당 320만 메시지를 처리하는 마이그레이터로 전체 데이터를 이전했습니다. ScyllaDB의 shard-per-core 아키텍처와 더 효율적인 compaction으로 성능을 크게 개선했습니다.
결과
177개 노드 → 72개 노드로 감소, p99 읽기 레이턴시 40-125ms → 15ms로 개선, 운영 비용 대폭 절감.
핵심 인사이트
- 1.Cassandra의 JVM GC가 대규모 시계열 데이터에서 병목
- 2.ScyllaDB의 shard-per-core 모델이 C++ 기반으로 GC 문제 해결
- 3.Rust로 고성능 마이그레이터 개발 (초당 320만 메시지)
- 4.Hot partition 문제는 데이터 모델링 단계에서 예방해야 함