hlab-books / system-design-interview

가상 면접 사례로 배우는 대규모 시스템 설계 기초
0 stars 1 forks source link

1장. 사용자 수에 따른 규모 확장성 #2

Open hubtwork opened 2 weeks ago

hubtwork commented 2 weeks ago

Chapter Ownership : @zinokim

zinokim commented 1 week ago

1장. 사용자 수에 따른 규모 확장성

단일서버

모든 컴포넌트(웹 앱, 데이터베이스, 캐시 등)가 단 한 대의 서버에서 실행되는 간단한 시스템

사용자 요청이 처리되는 과정

  1. 사용자는 도메인 이름(api.mysite.com) 웹사이트 접속
  2. DNS(Domain Name Service)에 질의하여 IP 주소로 변환
  3. IP 주소로 HTTP(HyperText Transfer Protocol) 요청 전달
  4. 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답 반환

데이터베이스

단일서버로 충분하지 않아 여러 서버를 두어야 할 때 웹/모바일 트래픽 처리 서버(웹 계층)와 데이터베이스 서버(데이터 계층)로 분리

데이터베이스 종류

수직적 규모 확장 vs 수평적 규모 확장

수직적 규모 확장(Scale up): 서버에 고사양 자원(CPU, RAM 등) 추가하는 행위

로드밸런서

부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할
사용자는 공개 IP 주소(Public IP)로 접속하고 로드밸런서는 사설 IP 주소(Private IP)로 웹 서버와 통신

로드밸런싱 알고리즘

라운드 로빈 방식 (Round Robin Method)

가중 라운드로빈 방식 (Weighted Round Robin Method)

IP 해시 방식 (IP Hash Method)

최소 연결 방식 (Least Connection Method)

최소 응답시간 방식 (Least Response Time Method)

대역폭 방식 (Bandwidth Method)

데이터베이스 다중화

데이터베이스 서버 사이에 주(master) - 부(slave) 관계를 설정하고 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식
쓰기 연산(write operation)은 주 서버에서만 지원하고 부 서버에서는 읽기 연산(read operation)만을 지원

캐시

값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고, 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소

캐시 계층(Cache Tier)

데이터가 잠시 보관되는 곳으로 데이터베이스보다 훨씬 빨라서 성능이 개선될 뿐 아니라 데이터베이스의 부하를 줄일 수 있고 캐시 계층의 규모를 확장시키는 것도 가능하다.
웹 서버는 캐시에 응답이 저장되어 있는지를 물어보고 저장되어 있다면 캐시에서 데이터를 클라이언트에 반한화고 없다면 데이터베이스 질의를 통해 데이터를 찾아 캐시에 저장한 뒤 클라이언트에 반환하는데, 이러한 전략을 캐시 우선 읽기 전략(read-through caching strategy)이라 한다.

캐시 사용 시 유의할 점

콘텐츠 전송 네트워크(CDN)

정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크로 이미지, 비디오, CSS, JavaScript 파일 등을 캐시할 수 있다.
사용자가 웹사이트를 방문하면, 그 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달하게 되며 사용자가 CDN 서버로부터 멀면 멀수록 웹사이트는 천천히 로드

CDN 사용 시 고려해야 할 사항

무상태(stateless) 웹 계층

상태 정보 의존적인 아키텍처

상태 정보를 보관하는 서버는 클라이언트 정보, 즉 상태를 유지하여 요청들 사이에 공유되도록 하는데 무상태 서버에는 이런 장치가 없다.
클라이언트로부터의 요청이 항상 같은 서버로 전송되도록 하기 위해 로드밸런서에서는 고정 세선(sticky-session) 기능을 제공하고 있는데, 이는 로드밸런서에 부담이며 로드밸런서 뒷단에 서버를 추가하거나 제거하기도 어려워 서버 장애 처리에 어려움

무상태 아키텍처

웹 서버는 상태 정보가 필요할 경우 공유 저장소(shared storage)로부터 데이터를 가져오는데 상태 정보는 웹 서버로부터 물리적으로 분리되어 있어 구조적으로 단순하고 안정적이며, 규모 확장이 쉽다.

데이터 센터

지리적 라우팅(geoDNS-routing 또는 geo-routing): 장애가 없는 상황에서 사용자는 가장 가까운 데이터 센터로 안내되는 절차

다중 데이터센터 아키텍처를 만들기 위한 기술적 난제

메시지 큐

메시지의 무손실(durability, 즉 메시지 큐에 일단 보관된 메시지는 소비자가 꺼낼 때까지 안전히 보관된다는 특성)을 보장하는 비동기 통신을 지원하는 컴포넌트로 메시지의 버퍼 역할을 하며 비동기적으로 전송한다.
메시지 큐의 기본 아키텍처

메시지 큐의 장점

로그, 메트릭 그리고 자동화

데이터베이스의 규모 확장

수직적 확장(scale up)

기존 서버에 고성능의 자원(CPU, RAM, 디스크 등)을 증성하는 방법

수평적 확장(scale out)

데이터베이스의 수평적 확장은 샤딩(sharding)이라고도 불리는데 더 많은 서버를 추가함으로써 성능 향상
샤딩은 대규모 데이터베이스를 샤드(shard)라고 부르는 작은 단위로 분할하는 기술을 일컫는데 모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없다.

샤딩 키(sharding key)

백만 사용자, 그리고 그 이상

시스템의 규모를 확장하는 것은 지속적이고 반복적(iterative)인 과정

iamzin commented 1 week ago

초기 서비스를 만들어보고, 서비스가 확장해가는 과정에서 고민했던 내용들이어서 흥미로웠다. 앞으로 이 내용들을 더 자세하고 구체적으로 공부할 생각에 싱낭다

hubtwork commented 1 week ago

소감

기본적인 Infra 의 구조 및 스케일링에 대한 이해도를 쌓기에 좋은 챕터 👍 근데 왜 DB 는 AZ 를 나눠놓고, NoSQL 은 AZ 를 안 나누는지? 서로 다른 AZ 의 DB 간의 동기화 등에 대해서는 좀 설명 없이 그냥 이렇게 하면됩니다~ 식으로 정리되어 있던 부분이 좀 아쉽다 🤣

KangHun-Lee commented 1 week ago

 소감

기초를 다진 다는 생각으로 천천히 읽었다. 전반적으로 한번씩 이야기 해주어서 좋긴 했다. 내용을 아는 사람들은 한번씩 다시 본다라는 느낌으로 봤을 거 같은데 아무것도 모르는 사람이 보기에는 조금은 불친절한 책 같았다.

한줄 요약 : 시스템 디자인 Overview 잘 봤다

zinokim commented 1 week ago

소감

단계적으로 반복적으로 시스템을 확장해 나가는 방법을 어렵지 않게 설명해주어서 좋았다. 아직 1장이라 그런지 각 부분에 대한 디테일이 기대된다.

CHOICORE commented 1 week ago

시스템 구조를 한 눈에 볼 수 있어서 좋았다. 역시 그림이 있어야 읽기 쉬운 것 같다. 흠 내용 중에 샤딩에서 키가 중요하다고 하고 키 생성에 mod 방식만 나왔는데, 이거처럼 전체적으로 설명이 얕은 감 있었다. 하지만 키워드들이 머리속에 남기도 하고 찾아보기 좋은 것 같다. 기대된다.