이번글은 저희가 대용량을 생각하면서 개발을 하자는 목적으로 Delivery프로젝트를 진행했습니다.
저희는 세션을 통한 로그인을 하는데 지금은 애플리케이션이 한개이지만 대용량 처리를 위해 scale-out을
통해서 여러개의 애플리케이션이 존재한다면 발생되는 문제점인 세션 정합성 문제를 해결하기 위한
세션 관리 전략에 대해 알아보겠습니다
정합성이란?
데이터 정합성 : 어떤 데이터들이 값이 서로 일치함.
왜 세션 정합성이 안맞는 문제가 발생할가?
아래와 같이 3대로 scale-out을 진행한다면 유저가 요청마다 Nginx가 요청을 분배해주는데 동일한곳으로 계속 연결을 시켜준다면 이상이없겠지만 요청마다 다른곳으로 요청을 분산시켜준다면 로그인을 했는데 또해야하는 문제가 발생하게될것입니다. 그래서 이러한 문제를 해결하기위한 여러 방법들을 알아보겠습니다.
✔Sticky Session
웹 브라우저의 요청이 로드밸런서를 거치면서 매 번 다른 서버에게 할당될 수 있다. 이 경우 만약 웹 서버 별로 별도의 세션 저장소를 가지고 있다면 다른 웹 서버에 존재하는 웹 브라우저의 세션 정보가 무시될 수 있다.
이러한 문제점을 해결하기 위한 것이 Sticky Session이다.
웹 브라우저의 요청을 IP나 Cookie를 통해 식별해 특정 서버에서만 처리하게끔 하는 방식이다.
이 방식을 사용하게 되면, 사용자의 요청이 여러 서버에서 처리될 수 없으므로 사용자의 세션 정보가 일관되게 유지된다.
그러나 트래픽의 대부분이 특정 서버에 할당된 사용자들에게서 발생된다면, 로드 밸런싱이 균등하게 이루어지지 않는 상황이 되어 분산 서버의 이점을 활용할 수 없게 된다.
🌈Session Clustering
Session Clustering이란 여러 서버들이 세션 저장소를 공유하는 것입니다.
Session clustering은 각 서버의 세션 저장소는 유지한 채로 동기화 시키는 방식과 독립된 세션 스토리지를 구성하는 두 가지 방식으로 나누어 집니다
- 세션 저장소 복제 - 모든 서버 끼리 동일한 세션 저장소를 갖는 방식입니다.(즉 각 애플리케이션마다 저장소를 가진다라는뜻입니다) 한 세션 저장소에서 발생한 변화는 다른 서버의 세션 저장소로 복제된다. 이 방식을 사용할 경우 한 세션 저장소에 오류가 발생하더라도 복구가 가능하다. 그러나 서버의 숫자 만큼 복제시키는데 발생하는 비용이 증가하기 때문에 Scale-Out이 많이 진행될수록 비효율적이 된다.
- 독립된 세션 스토리지 - 각 서버와 연결된 독립된 저장소를 구성하는 것이다. 여러 대의 서버가 하나의 세션 저장소를 공유하기 때문에 데이터의 동기화를 위한 비용이 발생하지 않는다. 일반적으로 Redis와 같은 In-memory 저장소를 활용하며, 일반적인 관계형 데이터베이스 저장소도 사용할 수 있다. (그렇지만 Redis를 사용하는 이유는 세션을 통한 접근이 많기떄문에 캐시를 통한다면 더 효율적이기때문입니다)
왜 Redis를 사용?
인메모리 저장소로 활용하는것의 대표적으로 Redis와 Memcached 두가지가 존재합니다.
저희가 Redis를 사용한이유는 Redis는 여러 데이터 타입을 지원해준다는 이유가 있고
저희가 그래서 선택한것은 Session Clustering전략에서도 독립된 세션 스토리지로 Redis를 선택해 세션을 관리하는 방법을 선택 했습니다
'Delivery' 카테고리의 다른 글
리펙토링 디비조회 (0) | 2022.08.09 |
---|---|
캐싱전략, 메모리 (0) | 2022.08.05 |
레디스에 대해 알아보자 (0) | 2022.08.05 |
Mybatis batch처리 성능과 트랜잭션 (0) | 2022.08.01 |
테스트코드의 MockMvc utf-8 성능측정 (0) | 2022.07.19 |