2P by neo 2달전 | favorite | 댓글 1개

소개

  • 2017년, Discord는 MongoDB에서 Cassandra로 데이터베이스를 이전하여 메시지를 저장하는 방법을 공유함
  • Cassandra는 확장성, 내결함성, 유지보수 용이성을 제공하지만, 시간이 지나면서 성능 문제와 유지보수 부담이 증가함
  • 2022년, Discord는 ScyllaDB로 데이터베이스를 다시 이전함

Cassandra에서의 문제점

  • 메시지 저장 구조: 메시지는 channel_idbucket으로 파티셔닝되어 저장됨
  • 핫 파티션 문제: 특정 채널에 트래픽이 집중되면 데이터베이스 전체의 지연 시간이 증가함
  • 유지보수 문제: 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개의 댓글이 있었음