Discord팀이 조 단위 메세지를 DB에 저장하는 방법
Discord는 매일 수백만의 유저가 작성하는 수십억의 메시지를 저장한다. 누적 조 단위의 메시지를 저장하기 위해 Discord 개발팀은 어떤 DB 기술을 사용할까? → Discord 개발팀이 처음 선택한 DB는 MongoDB였다. 하지만 시간이 지나 유저와 데이터 양이 가하급수적으로 늘며 MongoDB의 한계를 느끼고, Cassandra로 전환하게 되었다. → Cassandra 클러스터가 150개 이상의 노드로 커지면서 운영과 성능 문제가 많이 발생했다. 특히, 특정 노드에서 쿼리가 몰리는 문제 (hot partition)가 발생 시 개발자가 직접 노드를 조정해야 하는 번거로움이 생겼다. → 이런 상황에서 Discord 팀은 Cassandra와 호환되는 ScyllaDB의 발전을 주목하게 되었다. Discord 개발팀이 저장하는 메시지 이외의 다른 데이터를 새로운 ScyllaDB 클러스터로 이전하면서 그 성능과 안정성을 검증했고, 만족스러운 결과를 얻었다. → 하지만 가장 큰 데이터인 메시지를 ScyllaDB로 이전하기 위해서는 많은 준비 작업이 필요했다. 그 중 가장 중요한 요소는 "Data Service"의 개발이었다. Discord 팀이 선호하는 Rust로 작성된 이 서비스는 DB의 부하를 줄이기 위해 데이터 요청을 병합하는 (request coalescing)등 여러 기술을 적용했다. → "Data Service"의 개발로 hot partition 문제에 어느정도 보호를 받게 되었지만, Cassandra의 한계를 (예: GC 튜닝) 계속 느끼게 되었다. 700TB가 넘는 DB를 이전하기 위한 프로그램을 새로 작성하고(Rust!), 약 10일간의 작업 끝에 모든 데이터를 ScyllaDB 클러스터로 이전하는데 성공했다. → 170개가 넘는 노드를 가진 Cassandra 클러스터에서 70개 조금 넘는 노드를 가진, 더 효율적인 ScyllaDB 클러스터로 전환하며, 장애 발생 빈도가 줄었고 쿼리 성능도 개선되었다. 개발팀은 1년이 지난 지금까지도 아주 만족하고 있다고 한다. https://discord.com/blog/how-discord-stores-trillions-of-messages