본문 바로가기

Web

🤷🏻 여러 서버에서 세션은 어떻게 처리할까?

📌 서론

하나의 서버에서 모든 트래픽을 감당한다고 가정해보자. 이렇게 되면 클라이언트가 많아질수록 부하가 생길 수 있다. 그래서 scale-out으로 서버를 여러대로 늘리고 앞에 로드 밸런서를 두어서 트래픽을 분배하도록 하는데 그렇다면 아래와 같은 상황이 발생할 수 있다.

  1. 로그인을 한다.
  2. 1번 WAS에서 로그인을 처리한다.
  3. 상품을 주문한다.
  4. 2번 WAS에서 요청을 받는다.

이때 발생할 수 있는 문제점은 무엇일까?

1번 WAS에서 로그인을 처리하고 세션으로 관리하는데 2번 WAS에 요청하게 되면 로그인 정보가 없다. 따라서 사용자는 로그인을 다시 해야 하는 상황이 발생할 수 있다. 어떻게 해결할지 한번 알아보자.

📌 Sticky Session

그림[1] - sticky 단어의 뜻

Sticky Session은 쿠키나 세션을 사용하여 트래픽을 분산하며, Sticky의 사전적 의미처럼 첫 요청을 처리한 서버에게 달라붙어있다고 볼 수 있다. 예시를 들어보자.

  1. 철수가 로그인을 한다.
  2. 1번 WAS에서 철수의 로그인을 처리한다.
  3. 영희가 로그인을 한다.
  4. 2번 WAS에서 영희의 로그인을 처리한다.

위와 같은 상황에서 Sticky Session을 이용했을 때, 철수와 영희는 다음 요청도 같은 WAS에서 처리된다. 하지만 매번 같은 WAS에 요청을 하게 되면 특정 WAS가 부하가 발생할 수 있다는 단점이 있다. 또 로드 밸런싱이 제대로 이루어지지 않으면 문제가 발생할 수 있다. 그러면 다른 방법을 더 알아보자.

📌 세션 클러스터링

클러스터링이란?

간단하게 여러 서버가 한가지 일을 수행하도록 만드는 것이라고 생각하자.

세션 클러스터링이란?

여러 WAS가 존재하는 경우 동일한 세션을 관리하는 것을 의미한다. 세션을 공유하기 위한 저장소로 Redis를 많이 사용한다. Redis는 데이터 저장소로 가장 I/O 속도가 빠른 메모리를 사용하고, key, value 형식의 데이터 처리에 특화되어 있어서 이에 적합하지 않을까? 생각이 든다. 하지만 아래와 같은 글도 참고해보자.

 

카카오 "레디스, 잘못쓰면 망한다"

국민메신저 카카오톡 개발 업체인 카카오가 웹애플리케이션 서비스를 만드는 개발자들을 대상으로 오픈소스 기술 '레디스(Redis)' 활용 경험을 소개했다. 우수 활용사례가 아니라 절대 하면 안 되는 작업들을 열거하며 주...

www.zdnet.co.kr

📌 참고

https://www.youtube.com/watch?v=gzKf2BTZToQ