많은 애플리케이션의 확장 전력으로 수평적 확장을 많이 사용한다.
수평적 확장(Scale-out) 이란?
수평적 확장은 수직적 확장과 반대되는 개념으로 수직적 확장은 하나의 서버를 사용하며 서버에 고사양 자원을 추가시켜 서버가 받을 수 있는 트래픽의 양을 늘린다. 예를 들면 RAM 추가 CPU 업그레이드 등과 같은 행위가 수직적 확장의 예시이다.
수평적 확장은 서버의 성능을 업그레이드 하지 않고 서버의 갯수를 증식시켜 더 많은 부하와 트래픽을 견디게 하는 방법이다.
기존 1대의 서버를 운영하던 것을 더 많은 부하를 견디기 위해 물리적인 서버를 한대 더 추가하여 분산 트래픽을 이용해 서버의 부하를 줄이는 방식이다.
예를 들어, 서버가 초당 100만건의 트래픽을 받아 성능이 저하되는 경우, 수평적 확장을 고려하여 서버를 3대 더 추가하여 4대를 만들고, 이를통해 100만건의 트래픽이 4대의 서버에서 나누어서 받게 되며, 단순계산적으로 서버 한대는 초당 25만건의 트래픽을 받게 되고, 이를 통해 안정적으로 서비스를 해나갈수 있도록 하는 작업이 수평적 확장 작업이다.
하지만 여기서 드는 의문이 있다. 그렇다면, 수평적 확장을 한 이후 트래픽을 여러곳에 분산시켜줄 무언가가 필요하지 않을까? 이다.
이러한 문제를 해결하기 위해 로드밸런서라는 개념이 추가되게 된다.
로드밸런서(Load Balancer)?
로드밸런서는 수평적 확장을 한 서버에 트래픽을 분산시켜주는 장치 또는 기술로 불린다.
초당 100만건의 요청을 예시로 서버가 4대 존재한다고 가정했을 때, 이를 로드밸런서 내부의 다양한 로드밸런싱 알고리즘을 통해 배정시키는 방식이다.
A서버가 바쁘면 B서버가하고 B서버가 바쁘면 C가 그렇지 않다면 D서버가 혹여나 모두 바쁘다면 제일 여유가 있는 서버에게 작업을 할당하는 것이 로드밸런서가 하는 일이고 역할이다.
[Network] 로드 밸런서(LB) - 정의, 역할, 로드밸런싱 알고리즘, 종류
위 링크에서 로드밸런서에 대한 더 자세한 정보를 알 수 있다.
무상태(stateless) 웹 계층
수평적 확장을 통해 서버를 증설하게 된다면 마주치게 되는 문제가 상태 정보에 대한 문제이다.
예를 들어 서버 각각마다 사용자가 로그인 했는지 안했는지 체크를 하기위해 세션의 정보를 가지고 있다고 가정해보자.
사용자 홍길동이 로그인 요청을 했고 로드밸런서가 가장 여유가 있는 서버인 A서버에 요청을 처리하라고 지시했다.
그렇다면 홍길동이 로그인했다. 라는 정보를 가진 곳은 A서버 밖에 없지 않을까?
그런데 이후 홍길동이 다른 요청을 보냈는데 로드밸런서가 B서버로 보냈다면, 이는 인증되지 않은 유저이기 때문에 요청이 거부되는 경우가 생길 수 있다.
그렇기 때문에 이를 해결하기 위해 로드밸런서에서는 고정 세션(sticky session) 이라는 기능을 제공한다.
하지만 이 기능은 로드밸런서에 많은 부담을 주게 되고, 로드밸런서 뒷단에 서버를 추가하거나 제거하기도 까다로워 지는 상황으로 만들어지게 된다.
이를하기위해 무상태 아키텍처를 고안하게 되었다.
무상태 아키텍쳐(Stateless Architecture)
무상태 아키텍쳐는 말그대로 상태를 가지지 않도록 서비스를 아키텍쳐를 설계하는 것이다.
아까와 같이 홍길동이라는 사람이 웹 요청을 보냈을 때, 각각의 서버는 세션 정보를 가지지 않는다.
그렇다면 어디서 가질까?
바로 상태 정보를 웹 서버로 부터 분리시키는 작업이다.
이 분리시킨 상태 정보는 공유 저장소를 이용해서 관리시킨다. 그렇기 때문에, 상태정보는 물리적인 웹 서버와 분리되어서 사용된다.
이러한 구조는 단순하고, 안정적이며, 규모확장이 원활하게 이루어 질 수 있다.
세션 데이터를 관리하는 방법은 다양하다. RDB, 또 다른 물리적 서버와 분리된 세션만 관리하는 RDB를 만들 수 있고, 혹은 Redis같은 캐시 시스템이 될 수도 있다. 혹은 NoSQL을 사용하여 따로 세션만 관리하는 방법을 고안할 수 있다.
이런식으로 상태까지 제거하여 무상태를 지원하는 서버를 만들게 되었다.
이제 수평적 확장을 위해 웹서버만 늘리면 부하가 계속적으로 늘어나도 물리적 서버만 늘려준다면, 효율적인 관리가 가능해진다.
'공부중' 카테고리의 다른 글
[CS] 컴퓨터와 문자 인코딩 (0) | 2024.12.21 |
---|---|
[CS] 운영체제의 역할과 목표 (0) | 2024.07.18 |
[Git] Git에 대한 이해와 형상 관리 도구란? (0) | 2024.06.20 |
[CS,코딩테스트] 코딩테스트의 시간 복잡도에 관하여 (0) | 2024.04.22 |
[CS] HTTP 메서드의 속성 및 활용 설계 예시 (0) | 2024.04.12 |