caffeine-library / system-design-interview

🌱 가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽는 스터디
4 stars 0 forks source link

[keyword] 15장 - 구글 드라이브 설계 #45

Closed ngwoon closed 2 years ago

ngwoon commented 2 years ago

주제

'15장 - 구글 드라이브 설계'를 읽고 내용을 요약하거나,
중요✨ 하다고 생각하는 키워드 및 관련 설명을 코멘트로 달아주세요

연관 챕터

44

@caffeine-library/readers-system-design-interview

ngwoon commented 2 years ago

1. 문제 이해 및 설계 범위 확정

기능적 요구사항

비기능적 요구사항

개략적 추정치

2. 개략적 설계안 제시 및 동의 구하기

파일 저장소 서비스는 크게 세 가지 파트로 나눠볼 수 있다.

API 서버

API서버가 제공해야할 기능은 다음과 같다.

위에서 언급한 모든 API는 반드시 “사용자 인증”과 “https를 통한 암호화”가 동반되어야 한다.

파일 저장소

한 대의 서버에 모든 사용자 파일들을 저장하면 언젠간 용량 부족에 직면한다.

따라서 파일 저장소는 샤딩을 통해 여러 서버로 존재해야하며, 여러 지역 데이터센터에 다중화하여 높은 가용성을 갖춰야한다.

AWS S3는 높은 확장성과 가용성, 안정성을 갖춘 파일 저장소이다. 이러한 클라우드 서비스를 활용하면 개발 생산성을 높이는 동시에 안정적인 파일 저장소를 갖추게 될 것이다.

메타데이터 데이터베이스

사용자 파일 자체는 파일 저장소에 저장하지만, 그 파일을 설명할 수 있는 데이터들은 별개의 데이터베이스에 저장하여 SPOF를 방지해야 한다.

이 외에도 “동기화 충돌” 같은 이슈를 어떻게 해결할지 고민해보아야 한다.

개략적으로 설계한 결과는 아래 그림과 같다.

3. 상세 설계

블록 저장소 서버

크기가 큰 파일을 자주 클라우드 저장소로 업로드하면 네트워크 대역폭에 부담이 될 수 있다.

이를 위한 방법으로는 아래 두 가지가 있다.

블록 저장소 서버는 파일 업로드와 관련된 무거운 작업들을 도맡아 수행하는 서버라고 보면 된다.

높은 일관성 요구사항

구글 드라이브 서비스는 강한 일관성 모델을 따라야 한다.

즉, 디바이스별로 다른 파일 상태를 보여주면 안되고, 메타데이터 캐시 혹은 데이터베이스 또한 강한 일관성을 유지해야 한다.

(= 캐시와 데이터베이스의 내용이 항상 일치해야 하며, 데이터베이스의 내용에 변경사항이 생기면 캐시의 해당 데이터를 무효화한다.)

파일 업로드 절차

KakaoTalk_20220312_175300235_01.jpg

파일 다운로드 절차

KakaoTalk_20220312_175300235.jpg

알림 서비스

저장소 공간 절약

사용자가 파일 수정과 같은 작업을 자주 하고, 서버가 그때마다 버저닝을 한다면 저장소의 용량은 빠르게 부족해질 것이다. 이러한 상황을 방지할 방안이 필요하다.