본문 바로가기
Develop/Server

다중 서버 환경에서 Session 클러스터링 하기

by 코딩의성지 2021. 9. 16.

실무에서 서비스를 한대의 서버로 운영하는 경우는 거의 없다.

보통은 동일한 기능을 제공하는 여러대의 서버를 제공하고, 서비스의 부하를 분산 시킨다.

 

예를 들어 내가 Was 서버 3대를 운용한다고 가정해보자.

그런데 위의 시스템은 치명적인 문제가 있다. 바로 각서버가 세션 정보를 공유하지 못한다는 것이다. 그러다보니 로그인 서비스를 통해  Session ID 가 Was 1번 서버에 생성이 되고 저장이 되어도, 다른 서비스가  1번 was가 아닌 2번이나 3번 was로 요청이 되면 session ID가 없어 500에러를 발생시킬 것이다.

 

이러한 문제를 해결하기위해 우리가 서버단에서 별도로 Session 관리를 해주어야한다. 오늘은 Session을 처리할 수 있는 몇가지 방법을 소개하고자 한다.

 

1. Sticky Session

 

기본적으로 거래가 들어올때는 앞단의 Load Balancer 를 통해서 거래가 들어오는데 만약에 Sticky Session을 통해 session을 처리하면 접속된 각 유저는 생성된 session 정보가 있는 서버로만 서비스를 요청하고 접근하게 된다. 이렇게 하면 유저의 세션이 유지되는 동안은 동일한 서버만 사용하게 되어 정합성 이슈가 사라진다. 

 

하지만 고정된 세션을 사용한다는 것 자체가 특정 서버에 트래픽을 집중시켜 버릴 위험이 있고 결국 서버의 장애로 이어질수 있다. 이렇게되면 해당 서버를 사용하는 사용자들은 세션 정보를 잃어버리게 되는 문제를 야기한다.

 

2. all-to-all Session 복제 방법

만약 여러분이 Tomcat 환경을 사용하신다면 'DeltaManager'를 이용하여 각서버로 세션을 복제해 사용하는 방법을 쓸수 있다.

이런 방법은 서버 하나가 죽더라도 서비스가 중단되지 않고 운영이 가능하게 한다. 하지만 이러한 세션 복제 방식은 단점이 존재한다. 일단 모든 세션 객체를 복제하다 보니 메모리 소요가 많다. 그리고 세션 저장소에 데이터가 들어올때마다 모든 서버에 값이 입력되니 네트워크 트래픽도 증가할 것이다. 

 

소규모의 서비스는 크게 상관 없겠지만  대규모의 서버를 가진 서비스는 여러모로 문제가 많은 방식이다. 그렇다면 이는 어떻게 해결하면 좋을까?

 

3. Primary-secondary 세션 복제 방식

위의 문제를 해결하기 위해  Tomcat의 'BackupManager' 를 활용한 primary-secondary 세션 복제 방식을 사용할 수 있다.

위에 보이는 것처럼 Primary 서버는 백업 서버인 Secondary 서버에 세션 객체를 복사한다. 그리고 그 이외의 서버에는 session id 만 복제되고 객체 자체는 null 로 두어 메모리 사용을 줄인다. 실제로 해당 세션을 사용하려할때에서야 객체값을 복사하게 한다.

 

하지만 이 방법 역시 완전히 모든게 해결되는 방법은 아니다. 결국 세션을 사용하려면 객체를 받아와야 하기 때문이다.

 

4. Session Storage 별도 분리

결국 이러한 문제를 해결하기 위해서는 별도의 Session Storage를 분리해줘야한다. 서버가 가지고 있는 로컬 저장소가 아닌 별도의 세션 저장소가 있다는 의미이다. 이렇게 구축해두면 서버가 아무리 늘어난다고 해도 세션 스토리지에 대한 정보만 각각의 서버에 입력해주면  세션을 공유할수 있게 된다.

 

이런식의 세션 스토리지가 있으면 가용성과 정합성 문제 모두가 해결될 수 있다. 하지만 해당 세션 저장소가 문제가 생기면 모든 세션이 이용 불가능해진다는 말이기 때문에 백업 세션 저장소를 함께 구축해야하는 것도 명심하자.

 

그리고 Session Storage의 세션 정보는 디스크를 사용하지않고 인메모리 방식으로 데이터를 관리한다. 세션 자체가 영구적으로 저장될 필요가 없는 데이터이기 때문에 인메모리 방식으로 데이터 관리가 가능하다. 쉽게 말해서 세션 정보가 없어지면 로그인을 다시해주면 된다는 말이다. 

 

물론 그냥 방치하지 않는다. 서비스 중단을 막기 위해 인메모리 db 도 Replication을 이용해 failover를 지원할 수 있다.

많이 사용하는 세션 저장소로는 redis를 예로 들수 있다. Redis를 통해 세션을 관리하는 스토리지 구축은 별도로 시간이 날때 꼭 포스팅을 해보도록하겠다.

 

반응형

댓글