1) 세션이란?
- 세션이란 서비스를 사용하는 클라이언트의 상태 정보를 의미한다.
애플리케이션은 현재 서비스에 로그인돼 있는 클라이언트가 누구인지,
그 클라이언트가 어떤 활동을 하고 있는지 저장하고 있으며,
유저가 서비스를 떠나면 세션 스토어에서 유저의 정보를 삭제한다.
- 예를 들어, 쇼핑몰 사이트에서 유저가 장바구니에 어떤 물건을 담았는지,
혹은 최근 봤던 아이템은 어떤 것인지 등의 정보를 세션에 저장해두면
사용자가 로그인한 동안에는 해당 정보가 계속 유지된다.
- 많은 서비스에서 레디스를 세션 스토어로 사용하고 있다.
유저가 로그인해 있는 동안에는 세션의 데이터를 끊임없이 읽고 쓰게 되므로
빠른 응답 속도는 필수적이다.
- 또한, 레디스는 키-값 형식으로 사용이 간단하며,
string, set, hash 등의 자료 구조를 제공하기 때문에 사용자 데이터를 저장하기에 용이하다.
2) 세션 스토어가 필요한 이유
- 서비스 초창기, 혹은 프로토타입용 서비스에서는 굳이 세션 스토어가 필요치 않다.
각 웹 서버에 세션 스토어를 두고 자체적으로 세션을 관리할 수 있기 때문이다.
- 하지만 서비스가 확장돼 웹 서버가 여러 대로 늘어나는 상황을 가정해보자.
웹 서버를 늘리면 여러 개의 웹 서버에 트래픽을 분배할 수 있기 때문에
더 많은 유저를 수용할 수 있게 된다.
- 이 때, 각 웹 서버별로 세션 스토어를 따로 관리한다면 유저는 유저의 세션 정보를 갖고 있는
웹 서버에 종속돼야 한다.
그렇지 않다면 유저 데이터 정합성에 문제가 생기기 때문이다.
쇼핑 카트에 분명히 아이템을 저장했는데, 서버에 재접속할 때마다 아이템이 사라졌다 생겼다 한다면
정상적인 서비스 이용이 불가능하다.
- 따라서 특정 웹 서버에 유저가 몰려 트래픽이 집중되는 상황이 발생하더라도
유저는 다른 서버를 사용할 수 없어,
결국 트래픽을 분산시킬 수 없는 상황이 발생한다. 이를 sticky session이라 한다.
- 이 경우 유저의 세션 정보를 모든 웹 서버에 복제해서 저장하는 방법을 생각해볼 수 있다.
이를 all-to-all 방법이라 한다.
- all-to-all 방법은 유저를 여러 웹 서버에 분산시킬 수 있지만,
유저의 세션 데이터는 여러 서버로 복사돼 저장되기 때문에
불필요한 저장 공간을 차지하게 된다.
- 하나의 유저는 한 번에 하나의 웹 서버에만 접속하기 때문에
다른 웹 서버에 저장된 유저의 세션 정보는 무의미하기 때문이다.
또한, 데이터를 복제하는 과정에서 불필요한 네트워크 트래픽도 다수 발생하게 된다.
- 혹은 데이터베이스를 세션 스토어로 사용하는 방법도 고려해볼 수 있다.
- 하지만 앞서 언급했듯이 각 유저는 세션이 활성화돼 있는 동안
세션 스토어에 활발하게 액세스한다.
만약 세션 스토어의 응답 속도가 느려지면
이는 곧바로 클라이언트의 응답 속도 저하로 이어질 수 있다.
- 서비스가 커져 유저가 많아질수록 데이터베이스를 세션 스토어로 사용하는 것은
서비스 전반적인 응답 속도를 저하시키는 요인이 될 수 있다.
- 따라서 아래 그림과 같이 레디스를 세션 스토어로 사용해
서버, 데이터베이스와 분리시켜 놓은 뒤
여러 서버에서 세션 스토어를 바라보도록 구성한다면 앞선 모든 이슈를 해결할 수 있다.
- 유저는 세션 스토어에 구애받지 않고 어떤 웹 서버에 연결되더라도
동일한 세션 데이터를 조회할 수 있어 트래픽을 효율적으로 분산시킬 수 있으며
데이터의 일관성도 고려할 필요가 없다.
그리고 레디스는 관계형 데이터베이스보다 훨씬 빠르고 접근하기도 간편하므로
데이터를 가볍게 저장할 수 있다.
- 레디스의 hash 자료 구조는 세션 데이터를 저장하기에 알맞은 형태다.
'개발자를 위한 레디스' 카테고리의 다른 글
[개발자를 위한 레디스] sorted Set (0) | 2024.12.13 |
---|---|
[개발자를 위한 레디스] 레디스의 자료 구조 - SET (0) | 2024.12.13 |
[개발자를 위한 레디스] 레디스의 자료 구조 - hash (0) | 2024.12.13 |
[개발자를 위한 레디스] 레디스의 Pub/Sub (0) | 2024.12.12 |
[개발자를 위한 레디스] 레디스를 캐시로 사용하기 - 메모리 관리와 maxmemory-policy 설정 (0) | 2024.12.05 |