레퍼런스


How Discord Stores Billions of Messages

How Discord Stores Trillions of Messages

번역


1편: 디스코드는 어떻게 수십억 개의 메시지를 저장하는가 (2017)


디스코드는 우리가 예상한 것보다 더 빠르게 성장하고 있고, 사용자 생성 콘텐츠도 마찬가지입니다.

더 많은 사용자가 오면 더 많은 채팅 메시지가 생깁니다. 7월에 우리는 하루 4천만 건의 메시지를 발표했고, 12월에는 1억 건을 발표했으며, 이 블로그 포스트 기준으로 하루 1억 2천만 건을 훌쩍 넘겼습니다.

우리는 초기부터 모든 채팅 기록을 영구 보관하기로 결정했습니다. 사용자가 언제든 돌아와서 어떤 기기에서든 데이터에 접근할 수 있도록요. 이는 속도, 크기가 계속 증가하면서도 항상 가용한 상태를 유지해야 하는 방대한 양의 데이터입니다.

어떻게 하고 있을까요? 카산드라(Cassandra)입니다!

기존에 하고 있던 것

디스코드의 최초 버전은 2015년 초에 2개월도 안 되는 기간에 만들어졌습니다. 빠른 반복 개발에 가장 좋은 데이터베이스 중 하나가 MongoDB라는 것은 논쟁의 여지가 있겠지만, 우리도 그렇게 생각했습니다.

디스코드의 모든 것은 단일 MongoDB 레플리카 셋에 저장되었고, 이것은 의도적이었습니다. 다만 우리는 새로운 데이터베이스로의 쉬운 마이그레이션을 항상 계획해 두고 있었습니다.

(MongoDB 샤딩은 사용하기 복잡하고 안정성으로 유명하지 않아서 사용하지 않을 것이라는 걸 알고 있었습니다). 이것이 실제로 우리 회사 문화의 일부입니다: 제품 기능을 증명하기 위해 빠르게 만들되, 항상 더 견고한 솔루션으로 가는 경로를 함께 마련해 둡니다.

메시지는 channel_idcreated_at에 대한 단일 복합 인덱스를 가진 MongoDB 컬렉션에 저장되었습니다. 2015년 11월경, 저장된 메시지가 1억 건에 도달했고, 이 시점에서 예상했던 문제가 나타나기 시작했습니다: 데이터와 인덱스가 더 이상 RAM에 들어갈 수 없게 되었고, 레이턴시가 예측 불가능해지기 시작했습니다. 이 작업에 더 적합한 데이터베이스로 마이그레이션할 때가 된 것입니다.

올바른 데이터베이스 선택하기

새로운 데이터베이스를 선택하기 전에, 우리의 읽기/쓰기 패턴을 이해하고 현재 솔루션에서 왜 문제가 생기고 있는지 파악해야 했습니다.