-
Scale out 분산 환경에서의 세션 관리SpringBoot 2021. 8. 13. 19:49
후에 Scale out 분산 서버를 구축해보기 위해 작성한 포스팅입니다.
몇 가지의 토이 프로젝트들을 진행하면서 단일 서버로만 구축해 진행해보았습니다
개발을 해 나가면서 수많은 사용자들이 사용하는 서비스들은 어떻게 구축되었고, 어떤 방법들이 있는지에 대해 궁금해져 찾아보고 정리해보고 분산 서버 환경에서의 Session 관리는 어떻게 되는지 공부해보기로 했습니다.
먼저 단일 서버로 구현된 서비스는 많은 사용자가 몰려 서버가 감당할 수 없거나, 서버에 장애가 발생하면 치명적인 손실로 다가올 수 있을 것 같습니다. 그렇기에 많은 서비스들이 여러 대의 서비스를 두어 사용하는 것으로 알고 있는데 먼저 서버의 확장 방법은 Scale up, Scale out이 있습니다.
확장 방법
1. Scale up
수직적 확장 방법
서버의 성능 자체를 증가시키는 확장 방법으로 코어, 메모리 등의 스펙을 향상해 서버의 처리 성능을 향상하는 기법
장점
1. 서버의 스펙을 올려주면 되기 때문에 시스템적으로 건들게 별로 없어 확장이 쉬움
2. 서버 간 연결을 위한 네트워크 비용 등이 절감됨
3. 단일 서버로 동작하기 때문에 다른 서버와의 데이터 불일치 등이 발생하지 않음
단점
1. 물리적 장치로 서버를 확장시키는 것에 대한 한계가 있음
2. 단일 서버로 동작하기 때문에 서버 오류에 치명적인 손실이 발생할 수 있음
3. 장애를 만났을 때 처리하기 어려움
2. Scale out
수평적 확장 방법
단일 서버가 아닌 다중 서버를 구축함으로 처리 성능을 향상하는 기법
각 처리가 복잡하지 않고 병행 수행으로 서버 부하를 줄일 때 사용
장점
1. 하나의 서버에서 장애가 발생해도 전체 서비스에 큰 영향을 주지 않을 수 있음
2. 분산 환경으로 병렬적으로 처리하기 때문에 처리량이 뛰어나고 서버의 부하를 분산해줌
단점
1. 확장의 한계가 있음
2. 여러 서버를 관리하는데 필요한 비용이 늘어남
3. 여러 서버를 사용하기에 처리해야 할 일도 늘어남
4. 각 서버 간 데이터 공유 시 데이터 불일치가 발생할 수 있음
Scale out에서의 데이터 관리
EX) U1,U2,U3 사용자, S1,S2,S3 서버를 사용하고 서버 간 Session 기반의 사용자 정보를 공유하는 상황
보통 WAS는 1개의 WAS당 1개의 세션을 생성한다고 알고 있습니다.
S1 서버에 U1 사용자의 Session이 있을 때 U1 사용자의 요청이 Session이 저장된 S1 서버가 아닌 다른 서버로 요청했을 때 데이터 불일치로 문제가 발생할 수 있음을 예상할 수 있습니다.
이를 해결하기 위한 기법을 찾아본 결과 총 3가지 방법을 알게 되었습니다.
Sticky Session
로드 밸런싱을 통해 사용자의 세션 정보가 저장되어 있는 서버에만 요청을 전달하는 방법
Sticky Session 그림과 같이 사용자 1의 세션 정보를 서버 3이 저장하고 있다면
사용자 1이 요청했을 때 로드 밸런싱을 통해 서버 3으로 요청을 전달해 응답하는 방법입니다.
장점
1. 세션이 저장된 서버로 사용자의 요청을 전달하기 때문에 세션을 저장하지 않은 서버로 데이터를 요청해 데이터 불일치가 발생하지 않음.
단점
1. 하나의 서버로 요청이 몰려 서버 부하가 몰릴 수 있음
2. 분산 환경을 제대로 사용할 수 없음 ( 사용자 1의 세션 정보를 저장한 서버 3에 장애가 발생했을 경우 사용자 1은 서비스를 이용할 수 없는 문제가 발생할 수 있음 )
Session Clustering
하나의 서버에 세션이 저장되면 연결된 서버 간 세션을 공유하는 방법
Session Clustering 사용자 1의 세션 정보가 어떤 서버에 저장되더라도 WAS 간 세션 정보를 공유해 모든 서버가 사용자 1의 세션 정보를 가지고 있는 방법입니다.
장점
1. 하나의 서버에서 장애가 발생해도 다른 서버에 요청해 서비스를 사용할 수 있음
2. 서버의 부하 분산이 가능함
단점
1. 서버 간 네트워크 공유 비용이 증가함
2. 서버 간 네트워크 공유가 잦으면 성능이 저하됨
Session을 외부에서 관리
서버에 세션을 저장하지 않고 외부 서버 ( 레디스 등 )에 세션을 저장해 사용하는 방법
세션 정보를 외부 저장소에 넣고 사용하는 방법으로
서버에 세션 정보를 저장하지 않아 Stateless 하게 사용할 수 있으며 서버 부하의 분산이 가능하고 전면 장애로 이어지지 않는 장점이 있습니다.
또한 Redis를 사용할 경우 Redis의 HA를 사용해 고 가용성으로 서비스를 구축할 수 있다는 장점이 있습니다.
Redis에는 Replication, Sentinel, Clustering 등 장애를 대비하기 위한 기능이 존재하므로 더욱 안전하게 서비스를 할 수 있다는 장점이 있습니다. (레디스 글 -> https://tjdans.tistory.com/32)
장점
1. Sticky Session에서 발생하던 문제인 트래픽이 집중되는 것과, 한 서버에 장애 발생 시 서비스를 사용할 수 없는 문제 해결할 수 있음
2. Session Clustering에서 발생하던 문제인 서버 간 네트워크 공유 비용, 성능 저하를 해결할 수 있음
단점
1. 외부 저장소의 별도의 처리를 해주어야 함 ( 장애 대비 등 )