노트

사용자 수에 따른 규모 확장

Scale From Zero To Millions Of Users

백엔드#architecture · 연결된 개념 13개

쉽게 말하면

규모 확장은 혼자 하던 동네 분식집이 손님이 늘 때마다 주방을 분리하고, 직원을 늘리고, 반찬을 미리 만들어 두고, 지점을 내듯 병목이 보이는 곳부터 한 단계씩 키워 가는 길이에요.

비유가 깨지는 곳 가게와 달리 서버를 자유롭게 늘리고 줄이려면 세션 같은 상태를 웹 서버에서 빼 공유 저장소로 옮겨야 해요. 그리고 처음부터 다 갖추기보다 필요해질 때 하나씩 더해요.

사용자가 늘어날 때 서버 한 대짜리 시스템을 단계적으로 키워 가는 전형적인 경로. 처음부터 다 갖추는 게 아니라, 병목이 보일 때마다 한 단계씩 더한다(골의 법칙).

  1. 단일 서버(Single Server): 웹 앱·DB·캐시가 모두 한 대에. 사용자는 DNS와 CNAME로 IP를 얻어 HTTP로 요청한다
  2. 웹 계층과 데이터 계층 분리: 각자 독립적으로 키울 수 있게 된다
  3. 로드 밸런서(Load Balancer) + 여러 웹 서버: 한 대가 죽어도 서비스가 계속된다(수직 확장과 수평 확장)
  4. DB 다중화(Database Replication): 쓰기는 주 서버, 읽기는 부 서버로 나눈다(데이터베이스 다중화)
  5. 캐시와 CDN(Content Delivery Network): 자주 읽는 데이터는 메모리 캐시에서(읽기 캐시 전략), 정적 파일은 사용자 가까운 CDN에서 내려준다(브라우저 캐시)
  6. 무상태 웹 계층(Stateless Web Tier): 세션 같은 상태를 웹 서버에서 빼 공유 저장소로 옮긴다. 그래야 서버를 자유롭게 늘리고 줄일 수 있다(세션 인증, Redis (인메모리 저장소))
  7. 여러 데이터 센터(Data Centers): 지리적 라우팅(GeoDNS)으로 가까운 곳에 보내고, 장애 시 다른 곳으로 넘긴다. 데이터 동기화가 난제다
  8. 메시지 큐(Message Queue): 컴포넌트를 비동기로 떼어 각자 확장한다(Kafka, 트랜잭셔널 아웃박스 패턴)
  9. 로그·메트릭·자동화: 규모가 커지면 관측과 자동화 도구에 투자해야 한다
  10. DB 샤딩(Sharding): 데이터 자체를 여러 DB로 나눈다(샤딩)

정리하면: 웹 계층은 무상태로, 모든 계층에 다중화를, 가능한 많이 캐시하고, 정적 콘텐츠는 CDN으로, 데이터 계층은 샤딩으로, 각 계층은 독립 서비스로 나누고, 계속 모니터링한다. 저장소별 역할 분담은 저장소 역할 분담 (DB·캐시·큐·검색)에 있다.

출처: 『가상 면접 사례로 배우는 대규모 시스템 설계 기초』 알렉스 쉬 (원서 System Design Interview – An Insider's Guide) 1장

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 반응형 웹 디자인

    하나의 페이지가 화면 크기와 기기에 맞춰 레이아웃·이미지·글자 크기를 바꾸도록 만드는 접근. 미디어 쿼리(Media Query), 유연한 레이아웃(Flexible Layout), 반응형 미디어(Responsive Media)가 세 축이다.

  • CDN

    CDN(Content Delivery Network)은 세계 곳곳에 둔 서버(엣지, edge)들이 원본 서버(오리진, origin)의 응답을 복사해 두었다가 사용자와 가까운 곳에서 대신 내주는 네트워크다. 물리적 거리가 줄어 응답이 빨라지고, 오리진으로 가는 요청이 줄어 서버 부담도 줄어든다.

  • 번들 크기 줄이기

    번들 다이어트는 사용자가 내려받는 JavaScript 양을 측정하고 줄이는 작업이다. 같은 용량이라도 JS는 이미지보다 비싸다. 이미지는 다운로드와 디코딩만 하면 되지만, JS는 다운로드·파싱·컴파일·실행을 모두 거친다.

  • IaaS·PaaS·SaaS

    클라우드 서비스를 "어디까지 빌려 쓰고 어디부터 내가 관리하나"로 나눈 구분이다. 아래로 갈수록 내가 관리할 것이 줄어든다.

  • 읽기 전용 복제본

    읽기 전용 복제본은 주 DB(primary, writer)의 데이터를 복제해 읽기 요청만 받는 DB 인스턴스다. 쓰기는 writer 한 곳에서 처리하고, 읽기를 여러 복제본으로 나눠 부하를 분산한다.

보기 옵션