일반적으로 많은 사람들이 이용하는 서비스는 하나의 서버로 모든 부하를 감당할 수 없어서, 로드 밸런서를 이용한 분산서버 구조를 활용해서 문제를 해결합니다.
그리고 클라이언트와 서버는 HTTP로 통신을 하겠죠. 근데 HTTP의 한가지 특성때문에 위 그림과 같은 구조에는 문제가 발생할 수 있습니다. 바로 HTTP는 무상태(Stateless) 프로토콜이라는 것이죠.
**혹시 HTTP에 대한 글을 안보셨다면 여기를 먼저 보고 와주세요!
즉 다시 말하면 서버는 클라이언트의 상태를 저장하지 않고 각각의 요청을 독립적인 트랜잭션으로 취급한다는 의미입니다.
이게 왜 문제가되죠??
서비스별로 특정 이유로 session 을 사용하여 현재 사용자의 상태를 저장하고 저장된 데이터를 사용해야 상황이 발생할 수 있습니다. session을 사용한다는건 정보가 서버에 저장되는 것을 의미합니다. 하지만 위 그림과 같은경우 처음 요청할때는 server1로 요청했다가 로드밸런서로 인해 두번째 요청시에는 server2로 요청이 갈 수 있습니다. 요청은 똑같이 처리할 수 있겠지만.. server1에 저장돼있던 session은 더이상 사용할수가 없게되겠죠 ㅠ
하지만 당연히 우리는 정답을 찾을것입니다. 늘 그래왔듯이..
첫번째 방법) 고정 세션 (Sticky Session) 사용
요청할 때마다 다른 서버로 바인딩 되는게 문제가된다면, 특정 사용자는 계속 한 서버로만 이어지도록하면되지! 라고 해서 나온 개념이 고정 세션입니다. 클라우드 플랫폼에서는 로드밸런서 설정시 고정세션 (Sticky session)을 사용할지 설정할 수 있으며, 고정세션을 설정하게되면 사용자의 IP 등 사용자를 파악하여 계속해서 하나의 서버로만 바인딩되도록 도와줍니다!
- 장점:
- 장점은 위에서 나온 세션을 사용할때 문제점을 해결해주는 것과 계속 하나의 서버와만 바인딩되기때문에 해당서버의 RAM을 캐시로 사용이 가능합니다
- 단점:
- 특정사용자는 계속해서 하나의 서버로 바인딩되기때문에 결국에는 로드밸런서가 제 역할을 못하게되어 한 서버에 세션이 누적되면 과부하가 걸릴 수 있습니다
두번째 방법) DB를 세션 저장소로 활용
세션에 저장한 정보가 하나의 서버에 있다는게 문제가 된다면, 그걸 DB에 저장해서 모든 서버에서 그 DB를 바라보게 하면되지! 하고 나온 해결책입니다.
당연히 디스크에 정보를 쓰게된다면 읽고/쓰기에 큰 오버헤드가 발생할것임으로 보통은 Redis 같은 인메모리 DB를 활용합니다.
출처:
- 분산 서버 환경에서 세션 공유 문제 해결하기
'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 |