개요

최근 새로운 프로젝트를 시작하게 되면서 드디어 원하는 기술들을 써볼 기회가 왔다. 그동안 슬축생 프로젝트를 개발하느라 바빴고 슬축생 프로젝트는 당장 서비스가 시급한 프로젝트였기 때문에 오버 엔지니어링을 절대 지양하는 방향으로 개발을 했다. 그러다보니 정말 최대한 단순하고 안정성 있고 빠르게 도메인 개발에만 초점이 맞춰졌고 공부의 목적은 전혀 없었다.

 

하지만 이번에도 서비스를 목적으로 하는 프로젝트긴 하지만 슬축생처럼 필요에 의한 서비스가 아니라 천천히 만들어가자는 프로젝트기 때문에 그동안 못해본 기술들을 많이 시도해볼 생각이다. 

 

최근에 Spring WebFlux를 공부하며 Reactive Stream을 이용한 비동기처리를 공부하고 있다. 정말 어려운 내용이지만 다행이도 전에 회사에서 iOS를 개발할때 Reactive Swift를 사용했기 때문에 그나마 빠르게 이해한것 같다.

 

그러다보니 자연스럽게 대용량 트래픽 처리에 대해서 고민을 하게 되었다. 결국 Spring WebFlux와 비동기 프로그래밍은 어플리케이션의 속도와 성능 향상을 위해서 만들어졌기 때문이다. 그래서 앞으로 대용량 트래픽 처리 전략에 대해서 자주 글을 작성하고 공부해볼까 한다.

 

글을 시작하기 전에 모든 방법들은 비용과의 트레이드 오프로 결정된다 라는것을 강조하고 싶다, 당연히 서버 사양을 슈퍼컴퓨터급으로 늘리면 대용량 처리 전략 따위는 필요없다, 하지만 비용을 최대한 줄이면서 많은 트래픽을 감당하기 위해 처리 전략을 만드는 것이다.

확장성이란 무엇인가?

개발을 공부하다보면 확장이란 단어를 정말 많이 접하게 된다. 객체지향에서도 확장에 항상 열려있어야 한다고 강조를 하고 그 외에도 인프라 아키텍쳐나 데이터 관련해서도 항상 확장의 자율성에 대해서 언급이 된다.

 

이번에는 인프라 아키텍쳐의 관점의 의미로 확장성이란 단어를 사용할것이다. 이미 운영중인 서버에서 일시적으로 특정 이벤트나 시간대에 많은 트래픽이 발생했을때 얼마나 유연하게 시스템을 확장하여 트래픽을 감당할 수 있을것인가 라는 뜻이다.

 

만약 시스템의 확장이 어렵고 닫혀있다면 단순하게 서버 자체의 스펙을 높여 트래픽을 감당해야할것이다, 그렇게 되면 비용이 많이 들어가게 된다. 하지만 시스템의 확장이 자유롭고 많은 방법들을 도입할 수 있는 환경이라면 비용을 줄이면서도 많은 트래픽을 감당할 수 있게 되는것이다.

수직적 확장 & 수평적 확장 

먼저 수직적 확장에 대해서 알아보겠다, 스케일업 (Scale-Up) 이라고 부르기도 하는 이 방법은 위에서 언급한것처럼 서버 자체의 스펙을 올리는것이다. 예를 들어서 2vCPU와 4GB Ram의 스펙을 가지고 있는 서버가 부하를 감당하기 힘든 상황을 오면 4vCPU와 8GB Ram로 하드웨어 스펙을 올려버려서 성능을 향상 시키는 방법이다.

마치 파워레인저에서 빌런이 한번 죽었다가 냅다 커져서 다시 공격하는것처럼 그저 서버의 체급을 올려버리는 방법이다.

하드웨어 스펙을 건드려야하는 방법이여서 무중단 대처가 불가능하며 비용적으로도 효율적이지 못하다. 클라우드를 자주 사용하며 요금제를 보신 분들은 알겠지만 서버 스펙당 비용이란것이 일정한 수치로 올라가지 않는다, 점점 스펙을 올릴수록 2배, 2.5배, 3배씩 비싸지기 때문에 가성비가 안 좋은 방법이다.

 

다음으로는 수평적 확장에 대해 알아보겠다, 스케일아웃(Scale-Out) 이라고 부르기도 하는 이 방법은 같은 스펙의 서버를 여러대 늘려서 부하를 분산시키는 방식이다. 제일 앞단에 Load Balancer가 있다는 가정 하에 트래픽의 양에 맞춰 2대, 3대 또는 그 이상의 같은 서버를 복제하는 방식이다.

간단하게 생각하면 분신술이라고 생각하면 된다, 대신 유의해야할 점도 많다. 일단 웹서버 자체에 임시로 저장되는 데이터가 있는지 유의해야한다. 로드 밸런서에서 임의로 트래픽을 분배하게 된다고 하면 데이터의 정합성이 깨지거나 예상치 못한 문제를 초래할 수 있다. 만약 이런 경우에 해당한다면 로드 밸런서의 스티키 세션 기능을 사용하거나 Redis등을 사용하여 외부 임시 캐시 저장소를 만들어 접근하여 사용하는 방법이 적합하다.

클라우드의 중요성

갑자기 클라우드의 중요성? 을 언급해보겠다, 무엇이 중요한가. 사실 어느순간부터 클라우드가 유행하면서 모두가 클라우드 클라우드하면서 이유도 모른채 클라우드를 사용하는 사람들을 보면 조금 안타깝다는 생각이 들었다. 정말 많은 이유가 있지만 위에서 말한 확장에 대해서도 굉장히 밀접한 관계가 있다.

 

클라우드를 사용하지 않고 자체 하드웨어 서버를 구성해서 사용하는 방식을 온프레미스(On-Premise)라고 한다. 위에서 말한 수직적 또는 수평적 확장을 하려면 더 큰 사양의 서버나 더 많은양의 서버가 필요하다. 만약 회사 내부에서 온프레미스 서버를 사용하는데 확장이 필요하다면 더 좋은 서버를 주문하거나 더 많이 서버를 주문하고 장비를 조달하는 시간과 비용이 필요하다. 왜냐하면 회사는 필요한만큼의 서버를 보유하고 있지 서버를 무한대로 가지고 마음대로 사용할 수 있는 서버 전문 회사가 아니기 때문이다.

 

하지만 클라우드는 말 그래도 서버 전문 회사이다, 셀 수 없을만큼의 서버를 보유하고 있으며 가상화 기술로 자원들을 나누고 합치고 확장하고 모든 기술에 정점에 있는 제품이다. 그렇기 때문에 클라우드를 이용하게 되면 적절한 상황과 타이밍에 클릭 하나만으로 서버를 확장할 수 있는것이다. 이것이 클라우드를 사용하는 큰 이유중에 하나이다.

마무리하며

요즘 네트워크쪽 회사로 이직해서 한참 서버구성과 네트워크에 관심이 많은 우리 껌딱지 팀원이 있다, 비용적인 문제 때문에 자꾸 홈 서버를 구축해서 VPN을 구성하자고 하는데 왜 우리집에다가 하려고 하는데..

흠.. 사실 우리집엔 미니 PC와 서버 장비가 넘쳐난다, 20살때쯤 홈서버 구축에 맛이 들려서 이것 저것 구성해봤다. 그러면서도 동시에 회사의 방화벽 제품을 개발하고 직접 회사 서버에 적용해보며 얼마나 외부로 오픈된 IP들에 대해 다양한 공격 시도가 들어오는지도 알게 되었다. 그리고 여러 이유들이 있지만 3년동안 몸소 체험하며 비용 조금 아끼는것보단 그 돈 내고 클라우드 쓰는것이 백번 천번 더 편하고 좋은 결정이란것을 알게 되었다. 평생 무료로 4코어 24기가 램 클라우드 서버를 제공해준 오라클에게 항상 감사를..

 

일단 오늘은 대용량 트래픽의 처리 전략중의 기본중의 기본인 확장에 대해 알아봤다. 다음엔 무슨 전략을 들고 올진 모르겠다.

복사했습니다!