# Discord의 수조 개 메시지 저장 방식 (2023)

> Clean Markdown view of GeekNews topic #16984. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16984](https://news.hada.io/topic?id=16984)
- GeekNews Markdown: [https://news.hada.io/topic/16984.md](https://news.hada.io/topic/16984.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-09-29T19:34:09+09:00
- Updated: 2024-09-29T19:34:09+09:00
- Original source: [discord.com](https://discord.com/blog/how-discord-stores-trillions-of-messages)
- Points: 2
- Comments: 1

## Topic Body

##### 소개

- 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를 통해 트래픽을 효과적으로 관리하고 성능을 향상시킴
- 데이터 마이그레이션 과정에서 빠르고 효율적인 방법을 사용하여 다운타임 없이 이전을 완료함
- 이 글은 대규모 데이터베이스 마이그레이션의 도전과 해결 과정을 다루고 있어, 대규모 시스템 운영에 관심 있는 사람들에게 유익함

## Comments



### Comment 29457

- Author: neo
- Created: 2024-09-29T19:34:10+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41683293) 
- 블로그 글이 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개의 댓글이 있었음
