단일 서버
웹 앱, 데이터베이스, 캐시 등 모든 컴포넌트를 한 대의 서버에서 실행시킨다.
-> 컴퓨팅 자원의 부족, 단일 장애점의 문제점
데이터베이스
웹 앱과 데이터베이스를 분리함으로써 각각을 독립적으로 확장시킬 수 있다.
RDBMS vs NoSQL
NoSQL의 종류
- 키-값 저장소
- 그래프 저장소
- 컬럼 저장소
- 문서 저장소
NoSQL이 바람직한 경우
- 아주 낮은 레이턴시가 요구될 때
- 다루는 데이터가 비정형일 때
- 데이터에 대한 직렬화 or 역직렬화만 필요할 때
- 매우 많은 데이터를 저장할 때
스케일 업 vs 스케일 아웃
스케일 업
- 서버에 고사양 자원을 추가하는 것
- 단순하다는 장점이 있음.
- 하지만, 자원을 무한정 추가할 수 없음.
- failover(자동복구), 다중화 방안이 없음. 단일 장애점.
스케일 아웃
캐시
비용이 많이 드는 연산 결과 혹은 자주 참조되는 데이터를 메모리에 두고 요청이 보다 빨리 처리될 수 있도록 하는 저장소
- 캐시도 계층을 나눔으로써 독립적인 확장이 가능하다.
캐시 사용시 고려할 점
- 갱신은 자주 일어나지 않고 참조는 빈번하게 일어나는 정보
- 중요한 데이터를 캐시에 놓아도 되는가?
- 만료 시간
- 너무 길면 일관성 Down
- 너무 짧으면 원본 데이터베이스 접근 Up
- 캐시와 원본 데이터 간의 일관성 -> 단일 트랜잭션에서 둘 다 수정되는가?
- 장애 대처 -> SPOF가 되지 않도록 다중화, 분산
- 메모리 크기 -> 너무 작으면 eviction이 잦음.
- eviction 정책 -> lru, fifo, lfu,,,
CDN
정적 컨텐츠를 전송하기 위한 지리적으로 분산된 서버 네트워크.
Stateless 웹 계층
서버를 스케일 아웃했을 때, 서버마다 요청한 사용자의 정보를 가지면 어떨까?
만약 그 정보가 로그인 여부와 같은 정보라면 사용자는 로그인 한 서버에만 요청을 보내거나, 로그인을 계속해야될 수도 있다.
이것은 stateful 한 서버이다.

로드밸런서가 sticky-session(L7 스위치의 기능) 을 지원하면 클라이언트가 같은 서버로 요청할 수 있도록 도와준다.
하지만,
- 이는 로드밸런서에 부담을 줄 수 있고,
- 서버를 확장, 축소하거나 장애를 처리하기도 어렵다.

따라서 공유저장소에 상태 정보를 저장하여 관리하는 stateless 웹 계층을 구성해야 한다. 이는,
- 단순하고,
- 확장이 쉽고,
- 장애 대응에 보다 용이하다.
메시지 큐
메시지의 무손실(큐에 저장된 메시지는 소비자가 꺼낼 때까지 안전하게 보관되는 특성)을 보장하고 비동기 통신을 지원하는 컴포넌트.
- 시스템을 큰 규모로 확장하기 위해서는 시스템의 컴포넌트를 분리하여 각각 독립적으로 확장될 수 있도록 해야 한다.
- 메시지 큐를 이용하여 독립된 시스템 컴포넌트가 통신할 수 있다.
- 시스템 컴포넌트 간의 결합이 느슨해진다(한 컴포넌트가 죽어도 메시지를 보낼 수 있음).
데이터베이스 규모 확장
수직적 확장
- 기존 서버에 더 많은 자원 혹은 더 고성능인 자원을 증설하는 방법.
문제점
- SPOF(단일장애지점)이다.
- 하드웨어에는 한계가 있으므로 CPU, RAM을 무한증설할 수 없다.
- 비용적인 문제.
수평적 확장
샤딩 : 동일한 스키마의 데이터를 중복되지 않도록 여러 서버에 분리
파티셔닝 : 동일한 스키마를 가진 테이블을 여러 개 만들어 분산 저장
- 인덱스의 크기가 작아지기 때문에 성능적인 이점이 있다.