이번 카테고리에서는 가상 면접 사례로 배우는 대규모 시스템 설계 기초에 대한 책을 바탕으로 정리하고, 스터디 하는 여러 컨텐츠를 담을 예정입니다.
실제 서비스를 개발하고 배포하면 끝이 아니었다. 효율적인 운영방식을 고려해야 하고, 사용자수가 증가함에 따라 증가하는 서비스 부하, 성능 시간 등 고려할 일이 많다.
1장에서는 단일서버부터 시작하여 어떤식으로 확장되어가는지 자세히 설명되어 있다.
전체적인 서비스 흐름은 아래와 같다.
1. 사용자가 도메인 이름을 이용하여 웹사이트에 접속 -> 2. 도메인 이름은 DNS 에서 IP주소로 변환
-> 3. IP 주소로 HTTP 요청이 전달 -> 4. 웹서버는 HTML 페이지 또는 JSON형대의 응답을 반환.
이를 기반으로 웹 계층 - 데이터 계층을 분리하여 어떤 식으로 확장해 하는지 보여주는게 이 장의 핵심 내용이다.
데이터베이스
- 관계형 vs 비관계형
관계형 : 구조화된 데이터를 저장하는데 최적화됨.
데이터가 테이블(행, 열)형태로 저장됨.
테이블 간에는 관계 정의 가능.
트랜잭션 보장하기 때문에 일관성과 안정성이 중요한 곳에서 주로 사용됨.
ex ) MySQL, PostgreSQL, MariaDB, Oracle ...
비관계형 : 관계형과 달리 테이블 형식으로 국한하지 않고 다양한 구조고 데이터가 저장되는 비정형 데이터 유형
관계에 얽혀 있지 않음.
비정형 데이터(이미지, 로그, 센터 데이터)
대규모 트래픽에 적합하며 수평적 확장에 유리하다.
ex ) NoSQL, Redis, DynamoDB - 데이터베이스 다중화
데이터베이스를 여러개 쓰는 경우를 말한다.
데이터베이스가 2개라고 가정해보면,
제1 디비 → 쓰기 연산
제2 디비 → 읽기 연산
따라서, 이렇게 다중화를 하게 되면 1. 연산이 분산되므로 병렬로 처리될 수 있는 질의 수가 늘어가고 성능이 좋아진다. 또한 2. 한 DB 서버가 다운되어도 데이터 보존되며 3. 주 데이터베이스 또는 부 데이터베이스가 다운되어도 그 역할을 이어 받을 수 있다. - 수평적 vs 수직적 확장
저장할 데이터가 많아질 때 확장을 고려할 수 있다.
| 수평적 | 수직적 | |
| 특징 | 샤딩이라고 하는 서버 개수 증설 샤드라고 하는 작은 단위의 서버에 저장된다. |
디스크, CPU등 물리적인 부분을 증가시킨다. |
| 단점 | 1. 재샤딩 2. 한 샤드에 질의 집중 → 서버 과부하 3. 조인과 비정규화 |
1. 하드웨어를 늘리는 것은 한계 2. 비용적 문제 3. SPOF(한곳이 고장나면 전체가 다운) 문제 |
캐시
목적 : 사용자가 늘어나 데이터베이스의 조회 횟수가 늘어남에 따라 성능이 크게 좌우된다. 따라서 DB 조회를 줄이고 응답 속도를 빠르게 하기 위해 자주 쓰이는 데이터를 저장하기 위해 사용한다.
웹 서버 -> 캐시 서버 -> 데이터베이스
1. 요청이 오면 캐시를 먼저 확인
2. 캐시에 있으면 반환
3. 캐시에 없으면 DB 조회 -> 캐시 저장 -> 반환
캐시를 우선적으로 읽는 → 우선 읽기 전략
캐시를 사용할 때 주의할 점.
1. 만료 정책
2. 일관성 -> 원본을 갱신하는 연산과 캐시를 갱신하는 연산에 대해서 고려해야한다.(단일 트랜잭션)
3. 캐시 서버도 분산해야 한다. (샤딩, 레플리카)
4. 데이터 제거 정책
LRU(사용 한 시점이 가장 오래된 데이터를 먼저), LFU(빈도 낮은), FIFO (가장 먼저 들어온 것) 기법으로 데이터를 삭제.
CDN(정적 콘텐츠 보관소)
목적 : 이미지, JS, CSS, HTML 같은 정적 파일을 전 세계에 분산 저장해서 빠르게 서비스하기 위함.
- HTML 페이지를 캐시
- 가까운 CDN서버를 이용하기 때문에 개개인마다 로딩 시간 등, 처리 시간이 다를 수 있음
- 페이지 로딩 시간 줄이기
메시지 큐
목적 : 시스템 간 비동기 통신을 지원하고, 메시지 손실을 막기 위해 사용
흐름 : 생산자 → 발행(Publish) → 메시지큐 ← 구독(Subscribe) ← 소비자
비동기 : 생산자는 메시지를 발행하고 바로 다른 작업. 소비자의 행동은 신경쓰지 않아도 됨. => 느슨한 결합
요약
- 웹 계층은 무상태 계층으로
- 모든 계층에 다중화를 도입하라
- 가능한 많은 데이터를 캐싱하라.
- 여러 데이터 센터를 지원하라.
- 정적 콘텐츠는 CDN을 통해 서비스하라.
- 데이터 계층은 샤딩을 통해 규모를 확장하라.
- 각 계층은 독립적 서비스로 분할하라.
- 시스템을 지속적으로 모니터링하고, 자동화 도구를 활용해라.
'시스템 아키텍쳐 스터디' 카테고리의 다른 글
| 제 6장 - 키, 값 저장소 설계 (0) | 2025.09.28 |
|---|---|
| 제 5장 - 안정 해시 설계 (0) | 2025.09.28 |
| 제 4장 - 처리율 제한 장치의 설계 (1) | 2025.08.31 |
| 제 2장, 3장 - 시스템 설계 면접 (1) | 2025.08.24 |