GN⁺: Discord의 수조 개 메시지 저장 방식 (2023)
(discord.com)소개
- 2017년, Discord는 MongoDB에서 Cassandra로 데이터베이스를 이전하여 메시지를 저장하는 방법을 공유함
- Cassandra는 확장성, 내결함성, 유지보수 용이성을 제공하지만, 시간이 지나면서 성능 문제와 유지보수 부담이 증가함
- 2022년, Discord는 ScyllaDB로 데이터베이스를 다시 이전함
Cassandra에서의 문제점
-
메시지 저장 구조: 메시지는
channel_id
와bucket
으로 파티셔닝되어 저장됨 - 핫 파티션 문제: 특정 채널에 트래픽이 집중되면 데이터베이스 전체의 지연 시간이 증가함
- 유지보수 문제: SSTable 압축 작업과 JVM의 가비지 컬렉션 문제로 인해 성능 저하 발생
아키텍처 변경
- ScyllaDB 도입: C++로 작성된 Cassandra 호환 데이터베이스로, 가비지 컬렉션 문제를 해결함
- 데이터 서비스: API와 데이터베이스 사이에 중간 서비스를 두어 트래픽을 조절하고 성능을 향상시킴
- Rust 사용: 안전하고 빠른 동시성 코드를 작성하기 위해 Rust를 사용함
데이터 서비스
- 요청 병합: 여러 사용자가 동일한 데이터를 요청할 때, 데이터베이스에 한 번만 쿼리하고 결과를 공유함
- 일관된 해시 기반 라우팅: 동일한 채널의 요청을 동일한 서비스 인스턴스로 라우팅하여 데이터베이스 부하를 줄임
대규모 마이그레이션
- ScyllaDB 클러스터 구축: 로컬 SSD와 RAID를 사용하여 빠르고 내구성 있는 스토리지 구성
- 데이터 마이그레이션: Rust로 작성된 데이터 마이그레이터를 사용하여 빠르게 데이터를 이전함
- 자동 데이터 검증: 두 데이터베이스에 소량의 읽기 요청을 보내 결과를 비교하여 데이터 무결성을 확인함
몇 달 후
- 성능 향상: Cassandra보다 적은 노드로 더 나은 성능을 제공함
- 지연 시간 감소: 메시지 조회 및 삽입 성능이 크게 향상됨
- 새로운 제품 사용 사례: 성능 개선 덕분에 새로운 기능을 구현할 수 있게 됨
# GN⁺의 정리
- Discord는 Cassandra의 성능 문제를 해결하기 위해 ScyllaDB로 데이터베이스를 이전함
- Rust로 작성된 데이터 서비스와 ScyllaDB를 통해 트래픽을 효과적으로 관리하고 성능을 향상시킴
- 데이터 마이그레이션 과정에서 빠르고 효율적인 방법을 사용하여 다운타임 없이 이전을 완료함
- 이 글은 대규모 데이터베이스 마이그레이션의 도전과 해결 과정을 다루고 있어, 대규모 시스템 운영에 관심 있는 사람들에게 유익함
Hacker News 의견
-
블로그 글이 GC를 비난하지만, 실제로는 Cassandra 사용 방식이나 Cassandra가 대량 삭제를 처리하는 방식에 문제가 있음
- "API를 통해 수백만 개의 메시지를 삭제했을 때, Cassandra는 수백만 개의 tombstone을 스캔해야 했음"
- GC 튜닝에 대해 언급하지만, 실제로는 오래된 버전의 Cassandra와 JVM을 사용하고 있었음
-
분산 채팅 프로토콜을 사용했다면 이런 문제는 없었을 것임
- IRC, Matrix, XMPP 같은 오픈 스펙과 여러 구현체가 있음
- Discord가 어떻게 시장을 장악했는지 이해하기 어려움
-
ScyllaDB 공동 창립자의 추가 의견
- Discord는 Cassandra로 수리를 완료할 수 없었지만, Scylla에서는 가능함
- Scylla는 Cassandra와 많은 공통점을 가지고 있지만, 고유한 CPU 및 IO 스케줄러를 통해 쿼리를 우선시함
- Scylla는 새로운 tombstone_gc=repair 모드를 가지고 있음
- Scylla의 새로운 Raft 및 태블릿 아키텍처가 최근 출시됨
-
서비스 레이어가 Varnish Cache를 연상시킴
- 캐싱에 대해 언급하지 않았지만, Varnish의 "grace mode"와 유사함
- 일관된 해싱이 반복적으로 등장하는 것을 보는 것이 좋음
-
오래된 메시지를 삭제하는 것이 거의 불가능함
- 이는 프라이버시 악몽이며, EU가 왜 개입하지 않는지 궁금함
-
매우 잘 작성된 기사임
- Cassandra에서 Scylla로 전환한 것이 해결책의 일부였음
-
Discord의 메시지 저장 노드 수가 예상보다 적음
- 더 복잡한 아키텍처를 기대했지만, 실제로는 200개의 노드만 사용함
- 현대 클라우드 아키텍처가 과도하게 설계된 것 같음
-
데이터를 저장하는 것과 데이터 마이닝을 수행하는 것은 다른 문제임
-
ScyllaDB 팀이 성능 향상을 우선시하고, 역방향 쿼리를 구현했음
- ScyllaDB를 사용하기 전에 얼마나 많은 비용을 지불했는지 궁금함
-
"How Discord Stores Trillions of Messages"에 대한 논의
- 2023년 3월에 10개의 댓글이 있었음