System Designing Pastebin

목표 Site

pastebin.com, controlc.com 등

 

Pastebin 서비스란?

사용자가 text를 네트워크를 통해서 특정 공간에 저장을 하고, 접근 가능한 unique한 url을 받음으로써 해당 url로 해당 저장 공간을 접근 할 수 있는 서비스

2021.08.01 - [System Design] - Shortening Url Service Design

Shortening Url Service를 응용한 서비스라고 생각하면 된다.

 

시스템 요구사항

기능 요구 조건

  • text를 upload 또는 붙여 넣기로 저장이 가능해야한다.
  • 저장된 데이터를 접근 가능한 unique url을 제공 한다.
  • 일정 시간이 지나면 자동으로 해당 url은 종료되거나, 사용자가 지정한게 있다면 해당 시간 이후 삭제 된다.
  • 사용자가 url을 선택 할 수 있다. (custom alias)

 

비기능 요구조건

  • 고 신뢰성을 제공해야 한다. 어떤 데이터도 지워지면 안된다.
  • 고 가용성을 제공해야 한다.
  • 최소한의 지연으로 해당 서비스에 접근 가능해야 한다.
  • unique url은 예측되면 안된다.

 

  • 확장 요구조건
  • 분석 가능 환경
  • REST APIs로 접근 가능해야 함

 

디자인시 고려사항

  • 사용자가 일회 업로드 할 수있는 데이터의 양은 10MB를 넘지 못한다
  • URLs의 사이즈는 제한적이다. 사용자가 custom으로 넣을 수도 있지만 이 역시도 제한된 범위 내에서 DB를 통해 제공가능한 일관된 URL을 제공한다.

 

용량 산정

기본적인 read : write의 ratio를 5:1이라고 전제한다.

Traffic Estimates

write를 위한 요청이 하루에 1million/day 이라고 예상 할 경우, 초당 Traffic 수는

  • $ 11.5 write/sec = 1M/24/60/60 $

Read를 위한 요청수는 5배 임으로 5 million/day라고 볼수 있고, 초당 Traffic 수는

  • $ 57.8 read/sec = 5M/24/60/60 $

가 된다.

 

Storage Estimates

사용자는 최대 1회 10MB의 데이터를 uplaod 할 수 있다.

하지만 일반적으로 10MB를 사용하지는 않고 평균적으로 10KB정도를 사용함으로 하루 저장용량은

  • $ 10GB/day = 1M * 10KB $

하루에 10GB 정도의 용량이 사용된다.

만약에 해당 공간을 10년에 걸쳐서 유지 한다고 하면

  • $ 36TB = 10GB * 365 * 10 $

36TB의 Storage가 필요하게 된다.

이것은 Url 유지 갯수와도 동일한데

  • $ 3.6 Billion = 1M * 365 * 10 $

3.6 Billion이 필요하다.

이것을 Base64로 나타낼수 있는 String의 길이를 확인 할 수 있는데

  • $ 68Billion ~= 64^6 $

임으로 6 length만 있어도 충분히 사용이 가능한 url을 발행 할 수 있다.

만약에 한글자당 1 byte의 저장 공간이 필요하다고 하면

  • $ 21.6GB = 3.6 Billion * 1byte * 6 $

가 필요하다.

22GB정도는 36TB에 비하면 굉장히 작은 공간이기 때문에 계산 대상에서 제외 시켜도 문제는 없다.

Storage는 일반적으로 70%를 최대 넘지 않도록 하는 것이 일반적임으로

  • $ 52TB = 32TB/7 * 10 $

52TB가 필요하다.

 

Bandwidth estimates

위에서 초당 11.5의 write가 발생한다고 했다.

client에서 server로 보내는 Traffic임으로 이것을 Ingress라고 명명한다.

계산하기 편리하게 초당 12 write/sec 가 발생한다고 생각하자.

한번의 write는 약 10KB를 발생 시킨다고 했음으로

  • Ingress = $ 120KB/sec = 12 * 10KB $

라고 생각할 수 있다.

반대로 Server client로 보내는 데이터를 Egress라고 명명한다.

초당 57.8 read가 발생한다고 했음으로 계산하기 편리하게 58 read/sec라고 생각해 보자.

한번의 read에 필요한 Data도 약 10KB로 볼수 있음으로

  • Egress = $ 580KB = 58 * 10KB $

가 된다.

두개의 Traffic을 같이 합친다고 해도 0.7MB/sec 정도의 Bandwidth만 필요함으로 큰 대역폭이 필요 하진 않다는 것을 알 수 있다.

 

Memory estimates

20%의 Data가 Traffic의 80%를 차지하게 됨으로 하루에 발생하는 Read양의 20%를 Cache 할 수 있도록 하자.

  • $ 10G = 10B = 5M * 10KB * 0.2 $

약 10G 정도면 충분한 메모리양이 될 수 있을 것으로 보인다.

 

System API

addPaste(api_dev_key, paste_data, custom_url=none, user_name=none, paste_name=none, expire_date=None)

  • api_dev_key : api developer key
  • paste_data : text data
  • custom_url : 사용자 요구에 의한 custom url
  • user_name : url을 생성하는데 사용할 이름
  • paste_name : paste name
  • expire_date : 삭제 예정 날짜

return : 성공일 경우 shorten url 실패면 error

 

getPaste(api_dev_key, api_paste_key)

Data를 읽어오는 api인데 data를 프로그램적으로 얻어오려면 paste key가 필요하다.

 

deletePaste(api_dev_key, api_paste_key)

Paste된 데이터를 삭제

 

Database 설계

  • billions의 rows를 저장해야 한다.
  • 데이터 자체는 1KB 미만이다
  • 큰 데이터는 MB 이상일 수 있다
  • 각 Row간의 연관 관계는 없다.
  • Read가 주를 이루는 서비스 이다.

User는 1개 이상의 Paste를 갖을 수 있고 각 Paste는 1개의 Url과 연결된다.

그런데 여기서 주의 해야할 것은 Data 자체를 Row로 유지할 수도 있지만, 다른 Storage(amazon S3같은)의 링크일 수도 있어야 한다.

 

High-Level Design

Client의 요청을 Web Application Server가 read와 write를 처리할 수있고, 해당 Application Server는 Metadata를 갖고 있는 Database와 Data 자체를 갖고 있는 Storage와 각각 연동이 가능 할 수 있어야 한다.

 

상세(Component Design)

Application Server

Inboun와 outboud의 Traffic을 감당하며 중간에서 Metadata BD와 Object Storage와의 Data Delivery를 처리하는 기능이다.

이중에 Inbound Traffic에서 처리하는 기능에 대해서 생각해 보자.

  • Application Server는 들어온 Traffic을 Object Storage에 담고 Metadata에 해당 정보를 저장 시킨다
    • 여기서 고려해 봐야 할것은 10MB의 Traffic을 누수 없이 잘 처리 하는가? 이다.
    • 저장 Failure Point or Continue Upload 기능 등을 고려해 볼 수 있다.
  • 정상적으로 저장이 완료된 이후 url key를 generate해서 client에게 보내야 한다.
    • Hash나 Random key를 6자리 Letter로 내보낼 수 있지만, 중복이 발생할 여지를 고려해야 한다.
    • 미리 Generated Key를 생성해 놓은 값을 Assign 하는 방식의 고려가 필요하다.
  • Key Gneration Service
    • 앞서 68Billion의 key를 미리 생성해 놓는다.
    • 이 key는 사용되지 않은 키와, Used key로 분리 될 수 있다.
    • Application Server들에게 일정양의 키를 배분하고 Used key로 관리하면, 빠르게 url key를 client에게 제공 가능하다.
    • Server Down이 발생할 경우 해당 키는 loss 하게 되는데, 이미 필요 키 이상의 양을 만들어 놨기 때문에 큰 문제는 없다.
    • 물론 주기적으로 key를 purge 해줌으로써 해당 키를 다시 살려 받아야 한다.
    • Single Point Failure가 될 수 있다. Fail-over 를 만들어 줘야 한다.

Outbound를 알아 보자

  • Client가 unique url과 함께 접근할 경우 해당 url과 연관된 Object 정보를 Storage에서 얻어온 후 화면에 표시해 준다.
  • 단, 비공개로 설정되어 있는 경우 User정보를 확인하던가 아니면 Password를 입력하는 방식을 사용해도 좋다.

 

Datastore Layer

  • Metadata database : SQL같은 Relational DB를 사용하거나, No SQL형태의 key-value DB를 사용해도 좋다.
  • Object Storage : Text Data를 Object 형태로 제공하면서, 만약에 저장공간이 차게 되면 Server를 쉽게 증설 함으로써 해당 문제를 해결한다. (aws storage S3)

 

728x90
반응형

'System Design' 카테고리의 다른 글

Shortening Url Service Design  (0) 2021.08.01
System Design 공략  (0) 2021.08.01
Realization  (0) 2020.10.10
Aggregation and Composition  (0) 2020.10.10
Dependency  (0) 2020.10.10