Search

Server-Clustering 및 Session 관리 전략

Scalable Infrastructure

서비스가 확장됨에 따라 증가하는 클라이언트의 요청은 서버의 부하를 높이게 되어 전체적인 서비스의 질을 떨어뜨릴 수 있다. 서버의 부하를 줄이기 위해 서버의 성능을 높이는 것이 불가피할 수 있는데, 이 때 두 가지 방법을 통해 서버를 확장시킬 수 있다.

Scale-up(수직적 확장)

기존의 서버를 보다 높은 사양으로 업그레이드하는 방식을 말한다. 하드웨어적인 성능이나 용량 증강을 목적으로 하나의 서버에 디스크를 추가하거나 CPU나 메모리를 업그레이드시키는 것이다.
개별 서버의 성능 증가에는 반도체의 벽과 같은 기술적인 제약, 슈퍼컴퓨터 한대가 하나의 건물을 차지함과 같은 공간적인 제약을 받기 떄문에 확장성에 한계가 있다.

Scale-out(수평적 확장)

기존 시스템에 장비를 추가해서 확장하는 방식을 말한다. 기존 서버만으로 용량이나 성능의 한계에 도달했을 때, 비슷한 사양의 서버를 추가로 연결해 처리할 수 있는 데이터 용량이 증가할 뿐만 아니라 기존 서버의 부하를 분담해 성능 향상의 효과를 기대할 수 있다.
충분한 공간과 분산 네트워크의 효율이 보장된다면, 무한한 확장이 가능하다.
Scale-up vs Scale-out

Clustering

Load balancer

일반적으로 대규모 트래픽이 발생하는 서비스 시스템 혹은 클라우드 환경에서는 Scale-out 방식을 사용한다.
WAS가 실행되는 서버의 갯수가 많아짐에 따라 클라이언트의 트래픽이 적절하게 분리되어 처리되어야 하는데, 이러한 역할을 담당하는 서비스가 Load Balancer이다.[1]

Server-Clustering

많은 서버가 군집을 이루어 하나의 시스템처럼 작동하는 것Server-cluster라 부른다. 서버 클러스터의 각 노드(서버)는 다른 노드와 정보를 교환하거나 저장하는 등의 유기적인 소통을 통해 복수 노드의 서비스를 단일의 서비스처럼 동작 시킨다.
하지만 여러대의 서버를 통해 클라이언트의 요청을 처리하다 보니, 데이터의 일관성을 보장하기 어렵다. Load balancing을 통해 WAS에 대한 부하를 적절히 감소시킬 순 있지만, 웹 서비스와 클라이언트에 관한 모든 데이터가 저장되는 데이터베이스는 여전히 클라이언트의 요청과 비례하는 여러 WAS 시스템의 요청을 처리하여야 한다.
이 때문에 웹 서비스의 데이터베이스를 클러스터링 하여 데이터와 요청을 분산시킨다.
데이터베이스 클러스터는 데이터베이스의 데이터를 분할하거나 복제하여 여러 노드의 저장장치에 저장하고, WAS의 데이터 요청 질의를 서버 클러스터의 다른 노드에게 전파하는 등 각 노드간의 유기적인 소통이 이루어진다. 이를 통해 부하를 분산시키고 네트워크, HW, SW 오류에도 대응하며 가용성 높은 클러스터 시스템을 구축할 수 있다.

Session Managing Strategies

Session

Session이란, 서버가 자신에게 요청을 통해 접한 클라이언트를 식별하는 방법이다.
1.
서버는 접근한 클라이언트에게 응답할 때 response-header의 field인 set-cookie 속성의 값으로 클라이언트 식별자인 session-id를 발행해준다.
2.
서버로부터 받은 session-id는 해당 서버와 클라이언트의 브라우저 메모리에 저장된다.이때 클라이언트 메모리에 사용되는 cookie 타입은 세션 종료 시 같이 소멸되는 Memory cookie가 사용된다.
3.
서버로부터 발행된 session id를 통해 클라이언트는 자신의 개인적인 정보를 제공받을 수 있고, userInfo 등의 데이터로 활용할 수 있다.
Session을 적극적으로 사용하는 서버는 클러스터링을 할 시, 매우 치명적인 문제에 다다를 수 있다.
Session은 JVM 위에서 실행되고 있는 WAS의 메모리 영역에서 관리 되며, 이는 데이터베이스로 저장되지 않는다. 만약 Load balancing을 통해 클라이언트의 요청을 분산시킨다면, 요청마다 달라질 수 있는 서버에 따라 session 불일치 문제가 발생할 수 있고, 사용자는 매 요청마다 인증을 해야하는 상황이 발생할 수 있다.
Session을 사용하는 서버의 Load balancing 시 발생할 수 있는 문제점

Sticky Session

Sticky session이란, 특정 세션의 요청을 처음 처리한 서버로만 전송하는 기술을 뜻한다. 클라이언트의 첫 요청에 대해 응답을 준 서버에 달라붙어 세션을 유지한다는 의미를 담고있다.
Sticky session은 Cookie를 사용하거나 클라이언트의 IP를 트래킹 하는 방식으로 구현할 수 있다.
Sticky session 방식에 존재하는 한계점은 다음과 같다.
사용자가 접속해야하는 서버가 정해져있기에, 특정 서버에 대해 트래픽 과부하가 발생할 수 있다.
특정 서버의 시스템 오류 시, 해당 서버의 세션은 소실될 가능성이 높다. 서버에 장애가 발생하는 경우, 해당 서버를 이용하고 있던 사용자들은 다시 인증절차를 밟아야 한다.
이러한 한계점을 극복하기 위해 Session clustering 방식을 구상하게 되었다.

Session Clustering

Session clustering이란, 두 대 이상의 WAS 간, 또는 Load balancing, Failover, Auto scaling 을 통해 대체된 WAS에게 세션이 공유되도록 하는 기술이다.
*Failover - 서버 이중화 등을 통해 장애 발생시 예비시스템으로 자동전환하여 장애를 극복하는 기술
*Auto scaling - 클라우드 시스템의 부하에 따라 인스턴스를 자동으로 생성하고 삭제해주는 서비스
세션 클러스터를 이루는 시스템에선 특정 WAS서버 장애 시, 다른 WAS서버에서 클라이언트와 통신 하여 서비스를 제공할 수 있다. 이렇게 시스템 실패 시, 지속적으로 서비스를 진행할 수 있는 특성Availability(가용성)이라 부른다.
Session clustering을 구성하기 위해선 두가지 방식이 존재한다.
1.
WAS 간 구성
세션 데이터별 Primary/BackUp 인스턴스를 지정하여 공유하는 방식
Tomcat5 이상의 버전부터 제공하는 기능으로, 별도의 서버 인프라 없이 가능하지만, 장애 발생시 Session의 replication의 이슈가 발생
2.
Session server 구성
별도의 Session server를 운영하는 방식
인스턴스간 세션 공유 설정이 용이하지만, SPOF(Single Point of Failure; 단일 장애 발생 지점)이기 때문에 복제된 백업을 구성해야 한다. 또한, Session 데이터에 있어선 Load balancing이 일어나지 않기 때문에 성능이 낮아진다.
이미지

Distributed Session Server

Session Server의 SPOF 이슈는 분산 서버 운용에 아주 해로운 문제점이다. 분산 시스템의 가용성을 높이기 위해 Session server의 SPOF를 제거해야 했기에 고성능의 분산 데이터베이스 시스템을 필요로 하게 되었다.

In-Memory Database

IMDB(In-Memory Database)란, disk-based DB와는 달리 메모리에 데이터를 저장하는 기술이다.
IMDB의 특징은 다음과 같다.
IMDB는 메모리에 모든 데이터가 있기 때문에 지연이 적다.
IMDB는기본적으로 영속성(persistence)을 보장하지 않는다.
IMDB는 메모리에 데이터를 저장하기 때문에 저장 공간이 한정되어있다.
IMDB는기본적으로 분산 시스템이 아니다.[2]
Redis는 IMDB의 대표적인 제품이다. Key-value 형태의 데이터 모델을 가지고 있으며, Redis cluster를 이용하여 분산환경을 구축할 수 있다.

In-Memory Data Grid

IMDG(In-Memory Data Grid)란, 여러 시스템의 메모리에 데이터를 분산시켜 저장하는 기술이다.
IMDG의 특징은 다음과 같다.[3]
데이터가 여러 서버에 분산돼서 저장된다.
각 서버는 active 모드로 동작한다.
데이터 모델은 보통 객체 지향형이고, non-relational이다.
필요에 따라 서버를 추가하거나 줄일 수 있는 확장성을 지닌다.
JBoss Infinispan는 IMDG의 대표적인 제품이다.

IMDB vs IMDB

IMDG와 IMDB의 차이는 크게 말해서 클러스터 된 상태에서의 아키텍쳐에 따라 분류되는데, IMDG는 master-slave의 구분이 없는 active 모드이며, IMDB는 master-slave의 구분이 있다.[4]

Session Storage 분리

데이터의 정합성과 시스템의 고가용성을 보장하기 위해 session 저장소를 분리하여 구성하는 방식이다. 이 방식에선 기존 서버가 갖고 있는 로컬 세션 저장소를 이용하는 것이 아니라 별도의 세션 저장소를 사용한다. Session storage 또한 분산된 DB 서버와 마찬가지로 분산시켜 Load balancing을 통한 부하 분산과 고가용성을 확보하는 전략이다.[5]
Session storage를 분리하여 구성할 때 얻을 수 있는 효과는 다음과 같다.
Disk-based DB보다 빠른 I/O
트래픽이 비정상적으로 몰리는 현상 방지
데이터의 정합성 문제 해결 및 가용성 확보
불필요한 별도의 세션 복제

참고자료

[1] Load balancer란?
[2] Redis, distributed or not?
[3] IMDG란?
[4] IMDB vs IMDG
[5] Session storage 분리