사용자가 늘어날 때 서버 한 대짜리 시스템을 단계적으로 키워 가는 전형적인 경로. 처음부터 다 갖추는 게 아니라, 병목이 보일 때마다 한 단계씩 더한다(골의 법칙).
- 단일 서버(Single Server): 웹 앱·DB·캐시가 모두 한 대에. 사용자는 DNS와 CNAME로 IP를 얻어 HTTP로 요청한다
- 웹 계층과 데이터 계층 분리: 각자 독립적으로 키울 수 있게 된다
- 로드 밸런서(Load Balancer) + 여러 웹 서버: 한 대가 죽어도 서비스가 계속된다(수직 확장과 수평 확장)
- DB 다중화(Database Replication): 쓰기는 주 서버, 읽기는 부 서버로 나눈다(데이터베이스 다중화)
- 캐시와 CDN(Content Delivery Network): 자주 읽는 데이터는 메모리 캐시에서(읽기 캐시 전략), 정적 파일은 사용자 가까운 CDN에서 내려준다(브라우저 캐시)
- 무상태 웹 계층(Stateless Web Tier): 세션 같은 상태를 웹 서버에서 빼 공유 저장소로 옮긴다. 그래야 서버를 자유롭게 늘리고 줄일 수 있다(세션 인증, Redis (인메모리 저장소))
- 여러 데이터 센터(Data Centers): 지리적 라우팅(GeoDNS)으로 가까운 곳에 보내고, 장애 시 다른 곳으로 넘긴다. 데이터 동기화가 난제다
- 메시지 큐(Message Queue): 컴포넌트를 비동기로 떼어 각자 확장한다(Kafka, 트랜잭셔널 아웃박스 패턴)
- 로그·메트릭·자동화: 규모가 커지면 관측과 자동화 도구에 투자해야 한다
- DB 샤딩(Sharding): 데이터 자체를 여러 DB로 나눈다(샤딩)
정리하면: 웹 계층은 무상태로, 모든 계층에 다중화를, 가능한 많이 캐시하고, 정적 콘텐츠는 CDN으로, 데이터 계층은 샤딩으로, 각 계층은 독립 서비스로 나누고, 계속 모니터링한다. 저장소별 역할 분담은 저장소 역할 분담 (DB·캐시·큐·검색)에 있다.
출처: 『가상 면접 사례로 배우는 대규모 시스템 설계 기초』 알렉스 쉬 (원서 System Design Interview – An Insider's Guide) 1장