Knowledge/이론

세션 스토어로서의 레디스

똑똑한망치 2024. 6. 20. 09:00
728x90
반응형

세션이란?

세션이란 서비스를 사용하는 클라이언트의 상태 정보를 의미한다. 애플리케이션은 현재 서비스에 로그인돼 있는 클라이언트가 누구인지, 그 클라이언트가 어떤 활동을 하고 있는지 저장하고 있으며, 유저가 서비스를 떠나면 세션 스토어에서 유저의 정보를 삭제한다.

 

많은 서비스에서 레디스를 세션 스토어로 사용하고 있다. 유저가 로그인해 있는 동안 세션의 데이터를 끊임없이 읽고 쓰게 되므로 빠른 응답 속도는 필수적이다. 또한 레디스는 키-값 형식으로 사용이 간단하며 string, set, hash 등의 자료 구조를 제공하기 때문에 사용자 데이터를 저장하기에 용이하다.

 

세션 스토어가 필요한 이유

 

 

위의 그림과 같이 서비스 초창기, 혹은 프로토타입용 서비스에서는 → 굳이 세션 스토어가 필요 ❌

  • 각 웹 서버에 세션 스토어를 두고 자체적으로 세션을 관리할 수 있기 때문이다.

하지만 서비스가 확장돼 웹 서버가 여러 대로 늘어나는 상황을 가정해보자. 웹 서버를 늘리면 여러 개의 웹 서버에 트래픽을 분배할 수 있기 때문에 더 많은 유저를 수용할 수 있게 된다.

 

 

이 때 각 웹 서버별로 세션 스토어를 따로 관리한다면 유저는 유저의 세션 정보를 갖고 있는 웹 서버에 종속돼야 한다. 그렇지 않다면 유저 데이터 정합성에 문제가 생기기 때문이다.

 

따라서 그림 5-13 처럼 특정 웹 서버에 유저가 몰려 트래픽이 집중되는 상황이 발생하더라도 유저는 다른 서버를 사용할 수 없어, 결국 트래픽을 분산시킬 수 없는 상황이 발생된다. 이를 sticky session 이라 한다.

  • sticky session - 특정 세션의 요청을 처음 처리한 서버로만 전송하는 것

 

1) 세션 스토어 - all-to-all

 

sticky session을 해결하기 위해 그림 5-14 처럼 유저의 세션 정보를 모든 웹 서버에 복제해서 저장하는 방법을 all-to-all 방법이라고 한다.

 

  • 장점 
    • 유저는 분배돼 여러 웹 서버에 분산시킬 수 있다.
  • 단점
    • 유저의 세션 데이터는 여러 서버로 복사돼 저장되기 때문에 불필요한 저장 공간을 차지하게 된다. 하나의 유저는 한 번에 하나의 웹 서버에만 접속하기 때문에 다른 웹 서버에 저장된 유저의 세션 정보는 무의미하기 때문이다.
    • 데이터를 복제하는 과정에서 불필요한 네트워크 트래픽도 다수 발생하게 된다.

 

2) 세션 스토어 - 데이터베이스를 이용

 

데이터베이스를 세션 스토어로 사용하는 방법이다.

  • 문제점
    • 각 유저는 세션이 활성화돼 있는 동안 세션 스토어에 활발하게 액세스함
    • 만약 세션 스토어의 응답 속도가 느려지면 이는 곧바로 클라이언트의 응답 속도 저하로 이어질 수 있음
    • 서비스가 커져 유저가 많아질수록 데이터베이스를 세션 스토어로 사용하는 것은 서비스 전반적인 응답 속도를 저하시키는 요인이 될 수 있음

 

3) 세션 스토어 - redis (레디스 세션 클러스터링)

 

 

 

레디스를 세션 스토어로 사용하는 방법, 데이터베이스와 분리시켜 놓은 뒤 여러 서버에서 세션 스토어를 바라보도록 구성한다.

유저는 세션 스토어에 구애받지 않고 어떤 웹 서버에 연결되더라도 동일한 세션 데이터를 조회할 수 있어 트래픽을 효율적으로 분산시킬 수 있으며, 데이터의 일관성도 고려할 필요가 없다.

 

 

 

레디스의 hash 자료 구조는 세션 데이터를 저장하기에 알맞은 형태다.

 

 

 

캐시와 세션의 차이

레디스를 캐시와 세션 저장소로 사용할 때의 차이점을 비교해보자.

 

 

레디스를 캐시로 사용할 때의 가장 일반적인 look aside 전략을 이용할 때는 아래의 그림과 같이 동작한다.

 

캐시는 데이터베이스의 완벽한 서브셋으로 동작한다. 즉, 캐시가 갖고 있는 데이터는 모두 데이터베이스에 저장돼 있으며, 따라서 캐시 내부의 데이터가 유실되더라도 해당 데이터는 데이터베이스에서 찾을 수 있다.

 

캐시에 저장된 데이터는 여러 애플리케이션에서 함께 사용할 수 있다. 여러 애플리케이션에서 함께 사용할수록 더 효율적이다.

하지만, 세션 스토어에 저장된 데이터는 여러 사용자 간 공유되지 않으며, 특정 사용자 ID에 한해 유효하다.

일반적인 세션 스토어에서는 유저가 로그인하면 세션 데이터는 세션 스토어에 저장된다. 유저가 로그인해 있는 동안, 즉 세션이 활성화돼 있는 동안에는 애플리케이션은 유저의 데이터를 데이터베이스가 아닌 세션 스토어에만 저장한다.

반응형

'Knowledge > 이론' 카테고리의 다른 글

JPA와 Spring Data JPA 차이점 (+Hibernate)  (0) 2024.06.22
레디스를 메시지 브로커로 사용하기  (0) 2024.06.21
레디스를 캐시로 사용하기  (0) 2024.06.19
Redis  (1) 2024.06.18
TDD (Test Driven Development)  (0) 2024.06.14