Redis 활용하기 - 세션 스토어(Session Store)
서버 분산 처리 환경에서의 세션 불일치
보통 실무에서는 트래픽 부하를 방지하기 위해 로드밸런서에 서버를 여러대 운영한다.
그러나 서버를 여러대를 운영하게 되면 클라이언트의 세션이 서로 서버마다 달라 서비스 이용에 지장을 줄 수 있다는 문제점을 가지게 된다.
세션 불일치 문제와 해결방안 대한 자세한 내용 참고
--링크--
In-memory DB vs Disk based DB
별도의 세션 스토리지를 구성하여 세션의 정합성 문제를 해결하려고 할 때, Session storage를 이용하는 방법이 가장 이상적이다.
그럼 세션 스토리지로서 적합한 데이터베이스는 무엇일까?
in-memory DB | 메모리(RAM) | 속도는 빠르지만 영속성을 보장하지 않고(데이터 유실 가능), 저장 공간이 한정되어 있음 |
disk-based DB | 외부 저장 장치(디스크) | 데이터를 읽어 메모리에 올리고, 메모리에 올라간 데이터를 읽기 때문에 속도가 느림 |
우리가 만든 웹 서비스를 이용할 때 비인가 사용자와 인가된 사용자 모두 접근할 수 있는 요청도 존재하고, 인가된 사용자(로그인 세션이 존재하는 사용자)만이 접근할 수 있는 요청도 존재할 것이다.
이렇게 인가된 사용자만 접근할 수 있는 요청을 처리할 때 마다 매번 세션 저장소에서 해당 로그인 세션이 존재하는지 확인하는 작업을 진행해야 하기 때문에 성능에 악영향을 주지 않도록 빠르게 세션 정보를 찾아서 제공해야 한다.
Disk based DB는 디스크에서 데이터를 찾아 페이지 단위로 버퍼로 전송하는 시간이 발생하기 때문에 여러 I/O 작업 처리에 있어서 병목 현상이 발생하게 된다.
이러한 이우로 세션이 존재하는지 확인하는 작업을 여러번 반복해야 하는 서비스에서 세션 스토리지로 Disk based DB를 사용하는 것은 성능적인 측면에서 올바른 선택이 아니라고 생각된다.
반면, In-memory DB는 애초에 모든 데이터를 메모리에 저장하기 때문에 Disk I/O 작업이 발생할 일이 없다. 따라서 디스크 기반의 데이터베이스에서 발생하는 병목 현상을 피할 수 있다.
그리고 세션은 HTTP의 비연결 지향과 상태없음(stateless)과 같은 특성을 보완하기 위해 사용하는 것이다.
세션에는 주로 로그인한 사용자의 정보를 저장하는데, 이 정보는 영원히 저장되어야 하는 정보가 아니다.
거기다 세션에 데이터 유실로 인해 발생하는 피해가 다른 데이터에 비해 적다. 극단적인 예로 세션 저장소의 데이터가 유실된다면 사용자는 재 로그인만 진행하면 된다.
그래서 세션 스토리지로 In-memory DB의 사용이 적절하다.
또한 몇 몇 in-memory DB는 세션 스토리지 서버에 문제가 생겨서 데이터가 유실되는 것을 방지하기 위해 동일한 데이터를 또 다른 세션 스토리지에 복사하는 [마스터-슬레이브] 복제 방법을 사용하거나 'Consistent Hashing' 알고리즘을 사용하여 가용성을 보장하기도 한다.
'Study > DB' 카테고리의 다른 글
[DBMS] Redis(레디스)란? - 6 (0) | 2023.01.22 |
---|---|
[DBMS] Redis(레디스)란? - 5 (0) | 2023.01.21 |
[DBMS] Redis(레디스)란? - 3 (0) | 2023.01.19 |
[DBMS] Redis(레디스)란? - 2 (0) | 2023.01.18 |
[DBMS] Redis(레디스)란? (0) | 2023.01.17 |