Design Cloud Storage Service

μš”κ΅¬μ‚¬ν•­

  • 파일 μ—…λ‘œλ“œ / λ‹€μš΄λ‘œλ“œ / 동기화, μ•Œλ¦Ό κΈ°λŠ₯ 지원

  • λͺ¨λ°”일 μ›Ή / μ•± 지원

  • 파일 μ•”ν˜Έν™” 지원

  • 파일 크기 10GB μ œν•œ

  • 높은 κ°€μš©μ„± / 규λͺ¨ ν™•μž₯μ„± / μ•ˆμ •μ„±

  • λΉ λ₯Έ 동기화 속도

  • λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ μ‚¬μš© μ΅œμ†Œν™”

  • 전체 이용자 5,000만λͺ… / DAU 1,000만λͺ…

  • λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ 10GB의 μ €μž₯ 곡간 제곡

  • 맀일 각 μ‚¬μš©μž 평균 500kb 파일 2개 μ—…λ‘œλ“œ

  • 읽기 μ“°κΈ° λΉ„μœ¨ 1:1

ν΄λΌμš°λ“œ μ €μž₯μ†Œ μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μœ„μ™€ 같은 μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±ν•΄μ•Όν•  λ•Œ, μ•„λž˜μ™€ 같이 μΆ”μ •ν•  수 μžˆλ‹€.

  • ν•„μš”ν•œ μ €μž₯곡간 μ΄λŸ‰: 5,000만λͺ… * 10GB = 50PB

  • μ—…λ‘œλ“œ API QPS = 1,000만λͺ… * 2회 μ—…λ‘œλ“œ / 24 / 3600 = 231

  • μ΅œλŒ€ QPS = 231 * 2(λΆ€ν•˜λ₯Ό κ³ λ €ν•˜μ—¬) = 460

κΈ°λŠ₯ μ •μ˜

ν΄λΌμš°λ“œ μ €μž₯μ†Œ μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ κΈ°λŠ₯을 API λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ •μ˜ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  1. 파일 μ—…λ‘œλ“œ: μ‚¬μš©μžκ°€ νŒŒμΌμ„ μ—…λ‘œλ“œν•  수 μžˆλŠ” API

    • /files/upload

    • 인자: {uploadType: 'normal' | 'resumable', data: File}(normal: λ‹¨μˆœ μ—…λ‘œλ“œ, resumable: 이어 올리기)

  2. 파일 λ‹€μš΄λ‘œλ“œ: μ‚¬μš©μžκ°€ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•  수 μžˆλŠ” API

    • /files/download

    • 인자: {path: 'path/to/file'}

  3. 파일 κ°±μ‹  νžˆμŠ€ν† λ¦¬ API: 파일 κ°±μ‹  νžˆμŠ€ν† λ¦¬λ₯Ό μ‘°νšŒν•  수 μžˆλŠ” API

    • /files/list_revisions

    • 인자: {path: 'path/to/file', limit: 10}(limit: νžˆμŠ€ν† λ¦¬ 길이 μ΅œλŒ€μΉ˜)

μ‹œμŠ€ν…œ 섀계

ν΄λΌμš°λ“œ μ €μž₯μ†Œλ₯Ό ν•˜λ‚˜μ˜ μ„œλ²„λ‘œ κ΅¬ν˜„ν•˜κ²Œ 되면, κ²°κ΅­ 금방 μš©λŸ‰μ΄ 뢀쑱해지고, μ„œλ²„μ— μž₯μ• κ°€ λ°œμƒν•˜λ©΄ μ„œλΉ„μŠ€ 전체가 쀑단될 수 있기 λ•Œλ¬Έμ— λ‹€λ₯Έ 방법을 κ³ λ €ν•΄μ•Ό ν•œλ‹€.

  • 데이터 샀딩: μš©λŸ‰ λ¬Έμ œλŠ” ν•΄κ²°ν•  수 μžˆμ§€λ§Œ, 데이터 μœ μ‹€ λ¬Έμ œμ— λŒ€ν•œ λŒ€μ±… ν•„μš”

  • AWS S3: ν΄λΌμš°λ“œ μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λ©΄ μš©λŸ‰ λ¬Έμ œμ™€ 데이터 μœ μ‹€ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ§€λ§Œ, λΉ„μš© λ°œμƒ

S3λ₯Ό μ΄μš©ν•˜λ©΄ λΉ„μš©μ΄ λ°œμƒν•˜λŠ” 단점이 μ‘΄μž¬ν•˜μ§€λ§Œ, μ•„λž˜μ™€ 같은 μž₯점을 μ œκ³΅ν•΄μ£Όκ³  이미 λ§Žμ€ κΈ°μ—…μ—μ„œ μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— S3λ₯Ό μ΄μš©ν•˜λŠ” 것이 μ’‹λ‹€.

  • ν™•μž₯μ„±

  • κ°€μš©μ„±

  • λ³΄μ•ˆ

ν΄λΌμš°λ“œ μ €μž₯μ†Œ μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μœ„μ— μ–ΈκΈ‰λœ 데이터 μ €μž₯μ†Œλ₯Ό ν¬ν•¨ν•œ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • 블둝 μ €μž₯μ†Œ μ„œλ²„: μ—¬λŸ¬ λΈ”λ‘μœΌλ‘œ λ‚˜λ‰œ νŒŒμΌμ„ ν΄λΌμš°λ“œ μ €μž₯μ†Œμ— μ—…λ‘œλ“œν•˜λŠ” μ„œλ²„

    • 각 λΈ”λ‘μ—λŠ” κ³ μœ ν•œ ν•΄μ‹œκ°’μ΄ ν• λ‹Ήλ˜μ–΄ ν•΄μ‹œκ°’μ„ 메타데이터 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯

    • 각 블둝은 독립적인 객체둜 μ·¨κΈ‰λ˜μ–΄ ν΄λΌμš°λ“œ μ €μž₯μ†Œμ— μ €μž₯

  • ν΄λΌμš°λ“œ μ €μž₯μ†Œ: 블둝 λ‹¨μœ„λ‘œ λ‚˜λ‰œ νŒŒμΌμ„ μ €μž₯ν•˜λŠ” μ €μž₯μ†Œ(=S3)

  • 아카이빙 μ €μž₯μ†Œ: μ˜€λž«λ™μ•ˆ μ‚¬μš©λ˜μ§€ μ•Šμ€ λΉ„ν™œμ„± νŒŒμΌμ„ μ €μž₯ν•˜λŠ” μ €μž₯μ†Œ

  • λ‘œλ“œλ°ΈλŸ°μ„œ: λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ λΆ„μ‚° 및 μž₯μ•  λ°œμƒ μ‹œ μ„œλ²„ 우회

  • API μ„œλ²„: 파일 μ—…λ‘œλ“œ μ™Έ λ‹€λ₯Έ μš”μ²­ 처리(μ‚¬μš©μž 인증 / 파일 메타데이터 κ°±μ‹  λ“±)

  • 메타데이터 λ°μ΄ν„°λ² μ΄μŠ€: μ‚¬μš©μž / 파일 / 블둝 / 버전 λ“±μ˜ 메타데이터 정보 관리

  • μ•Œλ¦Ό μ„œλΉ„μŠ€: νŠΉμ • 이벀트 λ°œμƒ μ‹œ μ‚¬μš©μžμ—κ²Œ μ•Œλ¦Ό 전솑(파일 μΆ”κ°€ / νŽΈμ§‘ / μ‚­μ œ λ“±)

  • μ˜€ν”„λΌμΈ μ‚¬μš©μž λ°±μ—… 큐: μ΅œμ‹  μƒνƒœλ₯Ό 확인할 수 μ—†λŠ” μ˜€ν”„λΌμΈ μ‚¬μš©μžμ˜ νŒŒμΌμ„ λ„£μ–΄ 접속 μ‹œ 동기화 κ°€λŠ₯ν•˜λ„λ‘ 함

상세 섀계

블둝 μ €μž₯μ†Œ μ„œλ²„ - λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ μ΅œμ ν™”

κ°±μ‹ λ˜λŠ” νŒŒμΌλ“€μ΄ μ—…λ°μ΄νŠΈ 될 λ•Œλ§ˆλ‹€ 전체 νŒŒμΌμ„ μ„œλ²„λ‘œ λ³΄λ‚΄κ²Œ 되면 λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ„ μ‚¬μš©ν•˜κ²Œ λ˜λ―€λ‘œ, μ•„λž˜ 두 가지 방법을 생각해볼 수 μžˆλ‹€.

  • 델타 동기화 μ „λž΅: 파일 μˆ˜μ • λ°œμƒ μ‹œ 전체 파일 λŒ€μ‹  μˆ˜μ •μ΄ μΌμ–΄λ‚œ λΈ”λ‘λ§Œ 동기화

  • μ••μΆ• μ•Œκ³ λ¦¬μ¦˜: 블둝 λ‹¨μœ„λ‘œ μ••μΆ•ν•΄ 두어 데이터 크기λ₯Ό μ€„μž„

높은 일관성 보μž₯

ν΄λΌμš°λ“œ μ €μž₯μ†Œ μ„œλΉ„μŠ€λŠ” μ‚¬μš©μžμ— 따라 λ‹€λ₯΄κ²Œ 보이면 μ•ˆλ˜λŠ” κ°•ν•œ 일관성을 보μž₯ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 메타데이터 μΊμ‹œμ™€ λ°μ΄ν„°λ² μ΄μŠ€ 계측에도 같이 κ°•ν•œ 일관성 원칙이 μ μš©λ˜μ–΄μ•Ό ν•œλ‹€.

  • λ©”λͺ¨λ¦¬ μΊμ‹œ: 보톡 μ΅œμ’… 일관성 λͺ¨λΈμ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— μΆ”κ°€μ μœΌλ‘œ μ•„λž˜ 사항 보μž₯ ν•„μš”

    • μΊμ‹œμ— λ³΄κ΄€λœ 사본과 λ°μ΄ν„°λ² μ΄μŠ€ 원본 일치

    • λ°μ΄ν„°λ² μ΄μŠ€μ— λ³΄κ΄€λœ 원본 λ³€κ²½ λ°œμƒ μ‹œ μΊμ‹œμ— μžˆλŠ” 사본 λ¬΄νš¨ν™”

  • λ°μ΄ν„°λ² μ΄μŠ€: κ°•ν•œ 일관성을 보μž₯ν•˜κΈ° μ‰¬μš΄ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©

메타데이터 λ°μ΄ν„°λ² μ΄μŠ€

메타데이터 베이슀의 μŠ€ν‚€λ§ˆλ₯Ό κ°„λž΅νžˆ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • user: μ‚¬μš©μž κΈ°λ³Έ 정보

  • device: 단말 정보

  • namespace: μ‚¬μš©μžμ˜ 루트 디렉토리 정보

  • file: 파일의 μ΅œμ‹  정보

  • file_version: 파일의 κ°±μ‹  이λ ₯, κ°±μ‹  이λ ₯ 훼손을 λ°©μ§€ν•˜κΈ° λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό 읽기 μ „μš©μœΌλ‘œ 관리

  • block: 파일 블둝에 λŒ€ν•œ 정보

μ—…λ‘œλ“œ 절차

파일 μ—…λ‘œλ“œ μš”μ²­μ„ ν•˜κ²Œ 되면 파일 메타데이터 좔가와 νŒŒμΌμ„ ν΄λΌμš°λ“œμ— μ €μž₯μ†Œμ— μ—…λ‘œλ“œν•˜λŠ” 두 가지 μš”μ²­μ΄ λ³‘λ ¬μ μœΌλ‘œ μ§„ν–‰λœλ‹€.

  • 파일 메타데이터 μΆ”κ°€

    1. μƒˆ 파일 메타데이터 μΆ”κ°€ μš”μ²­

    2. μƒˆ 파일의 메타데이터λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ³  μ—…λ‘œλ“œ μƒνƒœλ₯Ό λŒ€κΈ°λ‘œ λ³€κ²½

    3. μƒˆ 파일이 μΆ”κ°€λ˜μ—ˆμŒμ„ μ•Œλ¦Ό μ„œλΉ„μŠ€μ— 전솑

    4. λ‹€λ₯Έ κ΄€λ ¨λœ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 파일이 μΆ”κ°€λ˜μ—ˆμŒμ„ μ•Œλ¦Ό

  • 파일 ν΄λΌμš°λ“œ μ €μž₯μ†Œ μ—…λ‘œλ“œ

    1. 블둝 μ €μž₯μ†Œ μ„œλ²„μ— μ—…λ‘œλ“œ μš”μ²­

    2. 블둝 μ €μž₯μ†Œ μ„œλ²„λŠ” νŒŒμΌμ„ 블둝 λ‹¨μœ„λ‘œ μͺΌκ°  λ’€ μ••μΆ• 및 μ•”ν˜Έν™”ν•˜μ—¬ ν΄λΌμš°λ“œ μ €μž₯μ†Œμ— 전솑

    3. ν΄λΌμš°λ“œ μ €μž₯μ†Œμ—μ„œ μ—…λ‘œλ“œ μ™„λ£Œ ν›„ μ™„λ£Œ μ½œλ°±μ„ API μ„œλ²„λ‘œ 전솑

    4. API μ„œλ²„μ—μ„œ 메타데이터 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ™„λ£Œ μƒνƒœλ‘œ κ°±μ‹ 

    5. μ•Œλ¦Ό μ„œλΉ„μŠ€λŠ” λ‹€λ₯Έ κ΄€λ ¨λœ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 파일이 μ—…λ‘œλ“œλ˜μ—ˆμŒμ„ μ•Œλ¦Ό

μˆ˜μ • 및 μ‚­μ œλ„ μœ„μ™€ 같은 λ°©λ²•μœΌλ‘œ μ§„ν–‰λœλ‹€.

λ‹€μš΄λ‘œλ“œ 절차

파일 λ‹€μš΄λ‘œλ“œλŠ” 파일이 μƒˆλ‘œ μΆ”κ°€λ˜κ±°λ‚˜ μˆ˜μ •λ˜λ©΄ μžλ™μœΌλ‘œ μ‹œμž‘λ˜λŠ”λ°, μˆ˜μ • 및 μΆ”κ°€ κ°μ§€λŠ” μ•„λž˜ 두 가지 λ°©λ²•μœΌλ‘œ μ§„ν–‰λœλ‹€.

  • 접속 쀑인 경우: μ•Œλ¦Ό μ„œλΉ„μŠ€κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 직접 μ•Œλ¦Ό

  • 접속 쀑이 μ•„λ‹Œ 경우: μ•Œλ¦Ό μ„œλΉ„μŠ€κ°€ μ˜€ν”„λΌμΈ μ‚¬μš©μž λ°±μ—… 큐에 μΆ”κ°€

ν΄λΌμ΄μ–ΈνŠΈκ°€ 파일 λ‹€μš΄λ‘œλ“œκ°€ ν•„μš”ν•¨μ„ μΈμ§€ν•˜λ©΄, μ•„λž˜ 절차둜 μ§„ν–‰λœλ‹€.

  1. μ•Œλ¦Όμ„ ν™•μΈν•œ ν΄λΌμ΄μ–ΈνŠΈλŠ” API μ„œλ²„μ— μƒˆλ‘œμš΄ 메타데이터 μš”μ²­

  2. API μ„œλ²„μ—μ„œ 메타데이터 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μƒˆ 파일 메타데이터λ₯Ό μ‘°νšŒν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜

  3. ν΄λΌμ΄μ–ΈνŠΈλŠ” 블둝 μ €μž₯μ†Œ μ„œλ²„μ— 블둝 λ‹€μš΄λ‘œλ“œ μš”μ²­

  4. 블둝 μ €μž₯μ†Œ μ„œλ²„λŠ” ν΄λΌμš°λ“œ μ €μž₯μ†Œμ—μ„œ 블둝을 λ‹€μš΄λ‘œλ“œν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜

  5. ν΄λΌμ΄μ–ΈνŠΈλŠ” 블둝을 μ‘°ν•©ν•˜μ—¬ νŒŒμΌμ„ μž¬κ΅¬μ„±

μ•Œλ¦Ό μ„œλΉ„μŠ€

파일 μΆ”κ°€ 및 μˆ˜μ •μ— λŒ€ν•œ 감지 및 μ•Œλ¦Όμ„ μœ„ν•΄ μ•Œλ¦Ό μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λŠ”λ°, μ•Œλ¦Ό 전솑 λ°©λ²•μœΌλ‘  두 가지 정도λ₯Ό κ³ λ €ν•΄λ³Ό 수 μžˆλ‹€.

  • λ‘± 폴링: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— 연결을 μœ μ§€ν•˜κ³  μžˆμ§€λ§Œ, μ„œλ²„κ°€ 응닡을 λ³΄λ‚΄κ±°λ‚˜ νƒ€μž„μ•„μ›ƒμ΄ λ°œμƒν•  λ•ŒκΉŒμ§€ 연결을 μœ μ§€ν•˜λŠ” 방식

  • μ›Ή μ†ŒμΌ“: 지속적인 톡신 채널을 μ œκ³΅ν•˜μ—¬ μ–‘λ°©ν–₯ 톡신 κ°€λŠ₯

μ–‘λ°©ν–₯ 톡신이 ν•„μš”ν•˜μ§€ μ•Šκ³ , μ•Œλ¦Όμ„ 보낼 일이 λΉˆλ²ˆν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ‘± 폴링 방법을 μ±„νƒν•˜μ—¬λ„ λ¬΄λ°©ν•˜λ‹€.

μ €μž₯μ†Œ 곡간 μ ˆμ•½

파일 κ°±μ‹  이λ ₯을 λ³΄μ‘΄ν•˜κ³  μ•ˆμ •μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄μ„  파일의 μ—¬λŸ¬ 버전을 μ—¬λŸ¬ 데이터센터에 λ³΄κ΄€ν•΄μ•Όν•˜λŠ”λ°, κ·Έλ ‡κ²Œ 되면 μ €μž₯μš©λŸ‰μ„ 많이 μ°¨μ§€ν•˜κ²Œ λœλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ•„λž˜ 보톡 μ•„λž˜ μ„Έ 가지 방법을 μ‚¬μš©ν•œλ‹€.

  • 쀑볡 제거(de-dupe): ν•΄μ‹œ 값을 λΉ„κ΅ν•˜μ—¬ μ€‘λ³΅λœ 파일 블둝을 계정 μ°¨μ›μ—μ„œ μ œκ±°ν•˜λŠ” 방법

  • 지λŠ₯적 λ°±μ—… μ „λž΅ λ„μž…: λ³΄κ΄€ν•΄μ•Όν•˜λŠ” 파일 버전 개수 μƒν•œ μ œν•œ / μ—…λ°μ΄νŠΈ 될 λ•Œλ§ˆλ‹€ λͺ¨λ“  버전을 μ €μž₯ν•˜λŠ” 것이 μ•„λ‹Œ νŠΉμ • μ‹œμ μ˜ λ²„μ „λ§Œ μ €μž₯

  • 아카이빙 μ €μž₯μ†Œ: μ˜€λž«λ™μ•ˆ μ‚¬μš©λ˜μ§€ μ•Šμ€ νŒŒμΌμ„ 아카이빙 μ €μž₯μ†Œλ‘œ 이관

기타 μž₯μ•  처리

  • λ‘œλ“œλ°ΈλŸ°μ„œ μž₯μ• : λΆ€ λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό κ΅¬μΆ•ν•˜μ—¬ λ‘œλ“œ λ°ΈλŸ°μ„œλΌλ¦¬ μƒνƒœ λͺ¨λ‹ˆν„°λ§

  • 블둝 μ €μž₯μ†Œ μ„œλ²„ μž₯μ• : λ‹€λ₯Έ 블둝 μ €μž₯μ†Œ μ„œλ²„μ—μ„œ λ―Έμ™„λ£Œ ν˜Ήμ€ λŒ€κΈ° μƒνƒœ μž‘μ—…μ„ 가져와 처리

  • ν΄λΌμš°λ“œ μ €μž₯μ†Œ μž₯μ• : μ—¬λŸ¬ 지역에 닀쀑화 μ‹œμΌœλ†“μ•„ μž₯μ•  λ°œμƒ μ‹œ λ‹€λ₯Έ μ§€μ—­μ—μ„œ 파일 쑰회

  • API μ„œλ²„ μž₯μ• : API μ„œλ²„ 닀쀑화

  • 메타데이터 μΊμ‹œ μž₯μ• : μΊμ‹œ μ„œλ²„ 닀쀑화

  • 메타데이터 λ°μ΄ν„°λ² μ΄μŠ€ μž₯μ• 

    • μ£Ό 데이터 μ„œλ²„ μž₯μ• : λΆ€ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„ 쀑 ν•˜λ‚˜λ₯Ό μ£Ό λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„λ‘œ 승격

    • λΆ€ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„ μž₯μ• : λ‹€λ₯Έ λΆ€ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„λ‘œ 쑰회

  • μ•Œλ¦Ό μ„œλΉ„μŠ€ μž₯μ• : μœ μ§€λλ˜ λ‘± 폴링을 λ‹€λ₯Έ μ„œλ²„λ‘œ μ „ν™˜ μ‹œ λ™μ‹œμ— λ‘± 폴링 μ‹œλ„ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •

  • μ˜€ν”„λΌμΈ μ‚¬μš©μž λ°±μ—… 큐 μž₯μ• : λ°±μ—… 큐 닀쀑화

참고자료

Last updated