Scale Out 환경에서 세션 정합성 문제 해결
Album 프로젝트는 트래픽 부하 분산을 위해 스케일 아웃(Scale Out) 방법을 사용하고 있다.
스케일 아웃 방법을 사용할 경우, 서비스는 다중 서버 환경으로 동작하게 된다.
다중 서버 환경에서는 각각의 서버가 각각의 세션 저장소를 독립적으로 갖게 되어,
서버 간에 세션 정보를 공유하지 못하는 문제가 발생한다.
Album 프로젝트도 이와 관련하여 문제가 발생했다.
Album 프로젝트는 세션을 통해 로그인 정보를 관리하고 있다.
그런데 다중 서버 환경이 구축되다 보니 A서버에서 로그인을 했더라도, B 서버로 다시 접속하게 되면 로그인 상태가 유지되지 않는 문제가 발생했다.
다중 서버 환경에서의 세션 공유 문제를 해결하기 위한 대표적인 방법으로는 Sticky Session, Session Clustering, Session Storage가 있다.
Sticky Session
스티키 세션(Sticky Session)이란 특정 클라이언트를 해당 클라이언트의 세션이 처음 생성된 서버와 바인딩하고, 동일한 세션을 가진 클라이언트의 요청을 바인딩 된 서버로 보내는 방법이다. 세션 정보가 저장된 서버로만 요청이 가다보니 세션 불일치 문제가 발생하지 않는다.
단점
- 특정 서버에 트래픽이 몰릴 수 있다는 단점이 있다. 클라이언트들이 처음 요청했을 당시에는 서버들의 트래픽 부하 정도를 고려하여 요청들을 적절하게 분산 배분했을 것이다. 그러나 시간이 지나면서 특정 서버에 바인딩 된 클라이언트들만 서비스 이용을 계속 할 수도 있다. 이런 경우, 트래픽이 서버들에게 고르게 분배되지 않고 특정 서버에만 과부하 될 수 있다.
- 그리고 세션 정보가 사라질 수 있다는 단점이 있다. 세션 정보를 서버에서 직접 관리하고 있기 때문에 해당 서버가 예기치 않게 종료될 경우, 종료된 서버와 바인딩 되어있던 클라이언트들의 세션 정보가 소실될 수 있다.
Session Clustering
세션 클러스터링(Session Clustering)은 여러 서버에 흩어져 있는 세션들을 하나의 세션처럼 관리하는 방법이다.
각 서버에서 발생하는 세션 정보의 변경 사항을 복제하여 다른 세션에도 적용하여 모든 서버가 동일한 세션 정보를 갖고 있게 만든다. 이것을 통해 클라이언트의 요청이 어떤 서버로 전달되더라도, 해당 클라이언트의 세션 정보가 유지된다.
단점
- 클라이언트의 수, 서버의 수가 늘어나면 세션 데이터 처리에 대한 과부하 문제가 발생할 수 있다. 클라이언트의 수, 서버의 수가 늘어남에 따라 복제해야할 세션 데이터가 기하급수적으로 늘어나기 때문이다.
Session Storage 분리
세션 스토리지(Session Storage) 분리는 세션을 서버의 메모리에 저장하지 않고, 외부의 저장소에 저장하는 것이다.
외부 저장소에 모든 서버들의 세션 정보를 모아서 저장할 수 있으므로, 세션 불일치 문제를 해결할 수 있다.
또한 특정 클라이언트의 요청을 특정 서버에 전달하도록 고정할 필요가 없으므로 특정 서버에 대한 트래픽 과부하 문제를 해결할 수 있다.
그리고 세션 데이터의 변경사항을 다른 저장소로 복제할 필요가 없으므로 세션 데이터 처리에 대한 과부하 문제도 해결할 수 있다.
단점
- 세션 데이터를 저장하기 위해서 하나의 외부 저장소만 사용할 경우 외부 저장소의 예기치 못한 종료로 인해 모든 세션 데이터를 소실할 수 있다는 단점이 있다. 따라서 안정성을 위해 외부 저장소를 복제해둬야 할 필요가 있다.
결정
세 가지 방법의 장단점을 비교한 결과, 세션 스토리지 분리 방법이 나머지 두 가지 방법의 단점을 보완한 방법이라고 생각되었다. 그래서 Album 프로젝트에서는 세션 스토리지 분리 방법을 통해 세션 불일치 문제를 해결하기로 결정하였다.