본문 바로가기

Tech 블로그

Reddit의 metadata data 저장소 (1초에 10만 read)

728x90

원문:
https://www.reddit.com/r/RedditEng/comments/1avlywv/the_reddit_media_metadata_store/?utm_source=blog.quastor.org&utm_medium=newsletter&utm_campaign=how-reddit-built-a-metadata-store-that-handles-100k-reads-per-second

 

From the RedditEng community on Reddit

Explore this post and more from the RedditEng community

www.reddit.com

 
Reddit은 글이나 동영상 올리는 곳이다
방금 들어가 봤는 데 동영상올리는 것은 틱톡이나 인스타그램과 매우 유사하다.
 
아무튼, Reddit 지난 몇년동안 유저가 2배가 되어, 2023년에 8억 5천명이 되었다.
그만큼 데이터가 많이 쌓여 metadata store의 효율화가 필요하다.
이 글에서는 새로운 data store로 migration 하는 내용을 다룰 것이다. 
 
현재 aws s3에 video의 metadata를 저장하고 있고,
metadata는 썸네일, URL, S3 FILE 위치 등등이 있다.
현재 메타데이터는 여러 곳에 나눠서 저장되어있었다.
이를 관리하기 쉽게 하기 위해 모든 데이터를 통합하기로 했다. 

데이터 저장소가 갖춰야 하는 3가지 DESIGN GOAL

  • Single system
    • reddit은 빠르게 성장하기 때문에 이 시스템은 확장성이 좋아야 한다.
    • 2030년에는 저장소 사이즈가 50TB정도 될 것이다.
  • Heavy Workload 읽기
    • 100k를 50ms안에 읽어야 된다.
  • 쓰기 지원
    • 저장소는 create/update 도 지원한다.
    • 읽기보다는 트래픽이 상당히 낮을 것이다.

DB 고르기

  • Postgres
    • 많은 사람들에게 사랑받는 RDB
  • Postgres의 장점
    • 많은 곳에서 사용함
      • 수 만개의 기업에서 사용
      • 그만큼 검증 되었고, 많은 자료가 있다., stack overflow 등등
      • 유명한 기업에서도 사용중이다. Uber, Skype, Spotify …
    • 오픈소스 & 커뮤니티
    • 확장성
      • postgres의 초기 목표는 확장성이였다.
      • 30년의 역사동안, 무수히 많은 확장을 했고, 점점 더 powerful 해졌다.
  • Cassandra
    • NoSQL, facebook이 2007년에 만든 분산 db
    • google bigtable, amazon dynamo db에 영향을 받음
  • Cassandra의 장점
    • Large Scale
      • 대용량 처리 가능
      • 다른 지역으로 분산, 복제가 쉽게 가능
      • 탈 중앙화 구조
    • Customize가 쉽다
      • workload에 따라 변경이 가능하다
        • 통신, 데이터 read, write 등등
    • 저장소가 유연하다
      • 많은 양을 read/write 빨리 할 수 있으며,
      • schema 변경 없이도 새로운 column 추가가 가능
    • 더 많은 장점들을 보려면
  • Postgres로 선정!
    • 이유
      • Cassandra는 관리가 어려움
      • Cassandra는 데이터들이 자유롭다 보니 normalized 되지 않은 이슈가 생긴다.
    Postgres가 좋아서 고른게 아니라 Cassandra가 나빠서 고른건가?….

 

Data migration

  • mirgration은 challenge 였다
  • 여러 시스템으로부터 수 테라바이트의 데이터를 이동해야 했으며
  • 동시에 기존 시스템이 1초에 10만개를 계속 읽을 수 있게 해야 했다.
  • 그래서 아래와 같이 진행
    • Dual Writes
      • 이전 시스템과 Postgres 둘 다에 writed하게 하였다.
    • 그러면서, 이전 시스템의 데이터를 Postgres에 옮겼다.
    • Dual Read
      • 어느 정도 데이터가 쌓이고, 양쪽 다 read가 가능할 때, request가 양쪽에서 serving 하도록 했다.
    • 모니터링
      • 양쪽 read결과를 보며, 부족한 결과를 채웠다.

Scaling 전략

1초에 10만 read request가 발생하는 데, Postgres로 cache없이 아래와 같은 latency를 달성 했다. 이를 어떻게 했는 지 살펴보자

  • 50% of requests have a latency lower than 2.6 milliseconds
  • 90% of requests have a latency lower than 4.7 milliseconds
  • 99% of requests have a latency lower than 17 milliseconds

Table Partitioning

reddit은 현재 50 테라가 넘는 media metadata를 보유하고 있다.

즉, 테이블에 샤딩과 파티셔닝을 적용해야 한다.

post_id로 테이블을 샤딩했고, range-based 파티셔닝을 했다.

즉, post_id가 특정 range에 있는 애들은 같은 db 샤드 안에 할당된다.

이에 post_id는 점점 증가함으로, 시간에따라 파티셔닝 된다고 볼 수 있다.

reddit은 read request가 주로 비슷한 시간때에 같이 오기 때문에, 다른 샤드와 join을 할 필요를 최소화 할 수 있다.

Denormalization

postgres에 이미지 게시에 필요한 metadata 필드를 하나의 single jsonB 필드에 넣었다.

이렇게 함으로 다른 필드들을 fetch 해서 합치는 것 대신, JSONB 필드 하나를 fetch하면 된다.

이로 인해 쿼리로직이 간단해졌다.


 


 
 
 
 
 
-----------------------------------------------------------
 20240511
하루 10분정도 공부를 하고 이를 기록해보고 있는 데, 
매번 남을 의식하지 말아야지 하면서도... 
자꾸 공부를 위한 공부가 아니라 기록을 위한 서칭?을 하게 된다.
오늘은 어떤 거에 대한 기록을 남기지? 이런 생각 들며 제대로 공부를 안하게 된다. 
 
오늘부터라도 진짜 1도 눈치보지 말고, 정말 나를 위한 공부를 하고 짧더라도 글이 이상하더라도, 남들이 "엥 이게 뭐야"라고 할지라도 그냥 놔두자 그대로 나중에 정리하면 되지

 

 

20240531

다른 회사들은 어떻게 구축되어있는 지를 보며, 

아 이런 툴들도 있고, 이런 이유 때문에 이런걸 하는 구나 

이런 challenge들이 있었고, 그걸 어떻게 해결 하는 구나 그런 것들을 느낄 수 있었다.

자꾸 우리 서비스랑 비교해보게 된다. 그런 비교군이라는 자산이 있으니 좋은 것 같다.  

728x90