가상면접 사례로 배우는 대규모 시스템 설계 기초 책을 읽고 이해한 내용을 글로 정리하고자 포스팅 한다.
책 내용은 단일 서버부터 시작해서 사용자가 늘어나면 이것도 필요하고, 저것도 필요하고.. 이런식으로 점점 살을 붙여나간다. 책의 흐름과 동일하게 점점 고도화된 시스템을 설계하는 구조로 정리해보려고 한다.
단일 서버
단일 서버는 위와 같이 구성한다. 웹, 데이터베이스, 캐시 등이 모두 단일 서버 1대에서 실행된다.
단일 서버의 동작방식은 다음과 같다.
1. 사용자가 DNS서버에 질의
2. DNS 서버에서 도메인 네임에 대한 IP 반환
3. IP주소로 서버에 HTTP 요청
4. 서버에서 응답 반환
데이터베이스
사용자가 늘어나면 단일서버로는 감당하기가 어려워진다. 따라서 서버를 웹 트래픽 처리 용도(웹 서버)와 데이터베이스용(데이터베이스 서버)로 분리하면, 필요에 따라 각각을 확장할 수 있게 된다.
단일 서버와 비슷하지만, 중간에 웹서버에서 DB서버에 데이터 요청을 보내고, 데이터를 받은 후 사용자에게 띄워주는 절차가 추가된다.
다중화 (스케일 아웃)
사용자가 더 늘어나면, 늘어난 요청을 처리하기 위해 서버를 스케일아웃(동일 스펙 서버를 필요한 만큼 추가) 시켜줄 수 있다. 로드밸런서가 스케일아웃된 서버들에 부하를 분산시키는 역할을 한다.
웹 계층 다중화
위의 그림과 같이 사용자는 LB(Load Balancer)의 Public IP로 요청을 하게 된다. (이때 사용자가 DNS에 요청하는 IP는 LB의 IP이다)
LB에서 요청을 받아 서버들과 통신할 때는 Private IP를 사용하여 (내부)통신하는데, 이는 보안적으로도 더 낫다. (서버의 IP가 외부에서는 감춰져있기 때문)
웹 계층을 다중화 했을때의 큰 장점은 failover이다.
서버 한대가 다운되더라도, 다중화 된 다른 서버에 트래픽을 보내면 웹 전체가 다운되는 것을 방지할 수 있다. (이렇게 한 서버가 죽었을 때 다른 대체시스템으로 자동 전환되는 것을 failover이라고 한다.)
이에 따라 가용성(availability)도 향상된다.
데이터베이스계층 다중화
웹 계층과 마찬가지로 데이터베이스 계층도 서버 다중화가 가능하다. 이때 그림을 보면, 쓰기 연산은 주데이터베이스로만 몰리고, 읽기 연산은 부데이터베이스로만 요청하고있다.
데이터베이스 다중화를 자세히보면 다음과 같다.
데이터 변경은 주DB로만 하여 데이터 원본을 주 DB에만 저장하고, 부 DB들에는 데이터의 사본을 저장한다.
데이터베이스는 주로 읽기 연산 요청이 많이 들어오는데, 이와 같이 구성하면 읽기 처리를 병렬로 할 수 있어 성능이 좋아진다.
데이터베이스를 다중화하면 성능이 향상되고(읽기연산 병렬처리), 안정성(reliability), 가용성(availability)가 확보된다.
웹계층과 마찬가지로 일부 DB가 나가더라도, 다른 서버의 DB를 통해 서비스를 지속할 수 있으며, 다른 서버의 데이터를 복제하여 복구할 수 있기 때문이다.
+) 실제 프로덕션 환경에서 주DB가 나가는 경우, 부DB가 주DB로 올라와 그 역할을 대체하고, 새로운 부DB를 추가함으로 서비스를 지속할 수 있다.
하지만 이때, 부DB의 데이터가 최신상태가 아닌 경우가 생길 수 있다. 이 경우 복구 스크립트를 돌려 추가하거나, 다중 마스터 방식을 도입할 수 있다.
'시스템설계' 카테고리의 다른 글
[시스템 설계] 데이터센터 이중화 (0) | 2023.05.06 |
---|---|
[시스템 설계] 무상태(stateless) 웹 계층 (0) | 2023.05.03 |
캐시 전략 (Cache Strategy) 종류 (0) | 2023.05.03 |
[시스템 설계] 서버 응답시간(latency) 개선 (캐시, CDN) (0) | 2023.04.28 |
Reverse Proxy, Forward Proxy (0) | 2023.04.26 |