BackEnd/네트워크와 인프라

[대규모 시스템 설계] 웹 계층 수평적 확장

짱호 2022. 2. 26. 14:42
반응형

가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다.

 

웹 계층을 수평적으로 확장하기 위해서는 세션 데이터와 같은 상태 정보를 웹 계층에서 제거해야 한다.
이를 고려하지 않고 웹 계층을 확장하면 엉뚱한 상태 정보를 반환하는 상황이 생길 수 있기 때문이다.

웹 계층을 수평적으로 확장하는 바람직한 전략은 상태 정보를 RDBMS나 NoSQL 같은 저장소에 보관하고
필요할 때 가져오는 것이다. 이렇게 구성된 웹 계층을 무상태 웹 계층이라고 한다.

 

무상태 웹 계층

상태 정보 의존적 아키텍처

일반적으로 서버는 클라이언트의 상태 정보를 보관하여 요청들 사이에 상태가 유지되도록 한다.

그림과 같이 사용자 A에 대한 상태 정보는 서버 1에 저장된다.
따라서 사용자 A를 인증하기 위해선 반드시 서버 1로 HTTP 요청이 전송되어야 한다.

만약 요청이 서버 2로 전송된다면 사용자 A에 대한 인증은 실패하게 된다.
즉, 같은 클라이언트의 요청은 항상 같은 서버로 전송되어야 한다는 것이다.

대부분의 로드밸런서는 sticky session 기능을 제공하는데, 이는 로드밸런서에 부담을 주고
뒷단에 서버를 추가하거나 제거하기 까다로워진다는 단점이 있다.

sticky session이란?
고정 세션 기능으로 같은 클라이언트의 요청을 항상 같은 서버로 전송시키는 기능이다.

 

무상태 아키텍처

무상태 아키텍처는 서버가 상태 정보를 가지고 있지 않기 때문에 어떤 서버로든 HTTP 요청이 전송될 수 있다.
웹 서버는 상태 정보가 필요한 경우 공유 저장소로부터 상태 데이터를 가져온다.

상태 정보는 웹 서버로부터 물리적으로 분리되어있다.
이런 구조는 아주 단순하고, 안정적이며, 규모 확장에 쉽다는 장점이 있다.

세션 데이터를 웹 계층으로부터 분리하고 공유 저장소에 보관한다.
이때 공유 저장소는 RDBMS일 수도 있고, Memcached/Redis 같은 캐시 시스템일 수도 있으며, NoSQL일 수도 있다.

 

시스템 구성하기

무상태 웹 계층을 갖도록 기존 설계를 변경해 시스템을 구성해보면 다음과 같다.

상태 정보가 웹 서버로부터 제거됨으로써 트래픽에 양에 따라 웹 서버를 추가하거나 삭제할 수 있는
웹 계층의 규모 확장성이 좋아졌다.

반응형