
이번 방학 기간동안 대규모 시스템 설계 스터디를 진행한다.
교재는 가상 면접 사례로 배우는 대규모 시스템 설계 기초 를 사용했다.
기간은 7월 2일 ~ 9월 12일까지로 예상한다.
각 주마다 2번씩 진행되고, 스터디 과제는 벨로그 작성과 각 단원 문제풀이로 진행하며, 중간마다 시험문제를 출제하여 수준을 검토한다.
최종적으론 대규모 프로젝트를 진행하여 스터디를 마무리한다.
사용자 요청에는 크게 웹 앱과 모바일 앱 두 가지 종류가 있다.
웹 앱은 비즈니스 로직과 데이터 저장 등을 처리하기 위해 서버 구현용 언어(자바, 파이썬 등)를 사용하고, 프레젠테이션 용으로는 클라이언트 구현용 언어(HTML, 자바스크립트 등)를 사용한다.
모바일 앱과 웹 서버 간 통신에는 HTTP 프로토콜을 이용한다. HTTP 프로토콜을 통해 반환되는 응답 데이터의 포맷으로는 보통 JSON이 쓰인다.
서버는 웹 계층과 데이터 계층으로 분리할 수 있으며, 각 계층을 독립적으로 확장해 나갈 수 있다.
DB는 전통적인 관계형 DB와 비관계형 DB로 나뉜다.
관계형 데이터베이스 관리 시스템(RDBMS)이라고도 부른다.
대표적으로 CouchDB, Neo4j, Cassandra, HBase, Amazon DynamoDB 등이 있다.
NoSQL이 적합한 경우는 다음과 같다.
| 구분 | 설명 |
|---|---|
| 스케일 업 (수직적 규모 확장) | 서버에 고사양 자원(더 좋은 CPU, 더 많은 RAM)을 추가하는 행위 |
| 스케일 아웃 (수평적 규모 확장) | 더 많은 서버를 추가하여 성능을 개선하는 행위 |
스케일 업은 확장에 한계가 있으며, 장애에 대한 자동복구 방안이나 다중화 방안을 제시하지 못한다.
부하분산 집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 한다.
OSI 기준으로 L4(NLB)와 L7(ALB) 로드밸런서가 있다.
보통 master-slave 관계를 설정하고, 원본은 주서버(master)에, 사본은 부서버(slave)에 저장한다.
이렇게 다중화를 하면 읽기 연산을 병렬 처리할 수 있어 성능이 향상되고, 안정성과 가용성이 높아진다.
💡 새로 알게 된 점
master가 꼭 하나일 필요는 없다.
쓰기 충돌 문제, PK 자동 증가값 충돌, 일관성 관리 복잡도 등의 문제가 있지만, master를 여러 개 둘 수도 있다.
값비싼 연산 결과나 자주 참조되는 데이터를 메모리 안에 두고, 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소다.
읽기 주도형 캐시 전략: 찾는 데이터가 캐시에 없다면 데이터베이스 질의를 통해 데이터를 찾아 캐시에 저장한 뒤 클라이언트에 반환한다.

어떤 데이터를 둘지, 보관된 데이터는 어떻게 만료시킬지, 일관성 유지와 장애 대처는 어떻게 할지, 캐시 메모리의 크기를 얼마로 잡고 데이터 방출 정책을 무엇으로 할지 등 (자세한 내용은 책 참조)
정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크다.
비용, 적절한 만료 시한 설정, CDN 장애에 대한 대처 방안, 콘텐츠 무효화 방법 등 (자세한 내용은 책 참조)
웹 계층을 수평적으로 확장하기 위해서는 상태 정보를 제거해야 한다.
상태 정보를 가지면 특정 사용자의 요청이 그 상태 정보를 가진 특정 서버로만 가야 하기 때문에, 수평 확장을 방해한다.
같은 클라이언트의 요청을 같은 서버로 전송시키려면 로드밸런서의 고정 세션(sticky session) 기능을 사용하는데, 이는 로드밸런서에 부담을 주고 서버를 추가하고 제거하기도 까다로워진다.
따라서 상태 정보가 필요하면 지속성 저장소에 보관하고, 필요할 때 가져오게 하는 것이 좋다.
단일 데이터 센터만 이용한다면, 해당 센터에 문제가 생길 시 서비스에 장애가 발생할 수 있다.
이를 방지하기 위해 두 개의 데이터 센터를 이용하고, 장애가 없는 상황에서는 사용자와 가까운 데이터 센터로 안내한다. 이 절차를 지리적 라우팅이라고 한다.
geoDNS: 사용자 위치에 따라 도메인 이름을 어떤 IP 주소로 변환할지 결정할 수 있도록 해 주는 DNS 서비스
다중 데이터 센터 아키텍처를 위해 고려할 점으로는 트래픽 우회, 데이터 동기화, 테스트와 배포 등이 있다. (자세한 내용은 책 참조)
대규모 분산 시스템에서는 시스템의 컴포넌트들이 각기 독립적으로 확장될 필요가 있다. 이런 문제를 해결하기 위한 핵심 전략 중 하나가 메시지 큐다.

메시지 큐는 메시지 무손실을 보장하는 비동기 지원 컴포넌트다.
시스템이 커지면서 저장할 데이터가 많아지면 데이터베이스의 규모도 확장할 필요가 있다.
앞서 말한 수직적, 수평적 방법이 있는데, 수직적으로 하는 경우도 있지만 결국 한계가 있고 장애 위험성과 비용 문제 등이 약점이다.
DB의 수평적 확장은 샤딩이라고도 부른다. 데이터베이스를 샤드(shard)라고 부르는 작은 단위로 분할하는 기술을 말한다.

데이터의 재샤딩, 유명인사 문제, 조인과 비정규화 등 (자세한 내용은 책 참조)
시스템 규모 확장을 위해 살펴본 기법들을 정리하면 다음과 같다.
굿
~~