[네트워크] 분산 서버 환경에서 세션공유 문제 해결법
Network

[네트워크] 분산 서버 환경에서 세션공유 문제 해결법

728x90

일반적으로 많은 사람들이 이용하는 서비스는 하나의 서버로 모든 부하를 감당할 수 없어서, 로드 밸런서를 이용한 분산서버 구조를 활용해서 문제를 해결합니다.

그리고 클라이언트와 서버는 HTTP로 통신을 하겠죠. 근데 HTTP의 한가지 특성때문에 위 그림과 같은 구조에는 문제가 발생할 수 있습니다. 바로 HTTP는 무상태(Stateless) 프로토콜이라는 것이죠.

**혹시 HTTP에 대한 글을 안보셨다면 여기를 먼저 보고 와주세요! 

 

즉 다시 말하면 서버는 클라이언트의 상태를 저장하지 않고 각각의 요청을 독립적인 트랜잭션으로 취급한다는 의미입니다.

 

이게 왜 문제가되죠??

서비스별로 특정 이유로 session 을 사용하여 현재 사용자의 상태를 저장하고 저장된 데이터를 사용해야 상황이 발생할 수 있습니다. session을 사용한다는건 정보가 서버에 저장되는 것을 의미합니다. 하지만 위 그림과 같은경우 처음 요청할때는 server1로 요청했다가 로드밸런서로 인해 두번째 요청시에는 server2로 요청이 갈 수 있습니다. 요청은 똑같이 처리할 수 있겠지만.. server1에 저장돼있던 session은 더이상 사용할수가 없게되겠죠 ㅠ

 

하지만 당연히 우리는 정답을 찾을것입니다. 늘 그래왔듯이..


첫번째 방법) 고정 세션 (Sticky Session) 사용

요청할 때마다 다른 서버로 바인딩 되는게 문제가된다면, 특정 사용자는 계속 한 서버로만 이어지도록하면되지! 라고 해서 나온 개념이 고정 세션입니다. 클라우드 플랫폼에서는 로드밸런서 설정시 고정세션 (Sticky session)을 사용할지 설정할 수 있으며, 고정세션을 설정하게되면 사용자의 IP 등 사용자를 파악하여 계속해서 하나의 서버로만 바인딩되도록 도와줍니다!

  • 장점:
    • 장점은 위에서 나온 세션을 사용할때 문제점을 해결해주는 것과 계속 하나의 서버와만 바인딩되기때문에 해당서버의 RAM을 캐시로 사용이 가능합니다
  • 단점:
    • 특정사용자는 계속해서 하나의 서버로 바인딩되기때문에 결국에는 로드밸런서가 제 역할을 못하게되어 한 서버에 세션이 누적되면 과부하가 걸릴 수 있습니다

두번째 방법) DB를 세션 저장소로 활용

세션에 저장한 정보가 하나의 서버에 있다는게 문제가 된다면, 그걸 DB에 저장해서 모든 서버에서 그 DB를 바라보게 하면되지! 하고 나온 해결책입니다.

당연히 디스크에 정보를 쓰게된다면 읽고/쓰기에 큰 오버헤드가 발생할것임으로 보통은 Redis 같은 인메모리 DB를 활용합니다.

 

 

출처:
- 분산 서버 환경에서 세션 공유 문제 해결하기
728x90

'Network' 카테고리의 다른 글

[네트워크] 커버로스(kerberos)란?  (0) 2023.04.11
[네트워크] SaltStack 이란?  (0) 2023.04.10
[네트워크] HTTP vs HTTPS  (0) 2022.11.01
[네트워크] TCP와 UDP  (0) 2022.11.01
[네트워크] OSI 7 계층, OSI 참조모델  (0) 2022.11.01