리버스프록시 세션 동기화 방법

2023. 1. 13. 22:17카테고리 없음

상황 :

유저가 로그인을 하고 나서 마이페이지에 들어갔을때 로그인이 풀리는 상황

 

이유:

이것은 user1이 톰켓서버를 통해 세션 id값을 부여 받고 다시 요청을 했을때 그 요청이 원래 처음 세션 id값을 받았던

서버가 아닌 다른 서버로 로드밸런싱 될수 있다 그렇게 될경우 다른 서버에는 해당 user1에 세션 id값이 없다보니

로그인이 풀리는 상황이 발생하게 된다.

 

이는 로드밸런싱으로 인해서 다중서버에서 발생하는 문제로 이문제를 해결하기 위한 방법들이 있다.

 

sticky session 

: 이경우는 해당 세션id를 받은 톰켓 서버로만 계속 요청이 가게 하는 방식이다 , 

즉 내가 처음 들어갔던 서버에서만 계속 요청이 가도록 고정하는 방식인데 

이렇게 될경우 트레픽이 발생 할수있기에 문제가 있다.

 

session clustering 

: 이 방식은 서버여러 곳을 동기화 ( 하나의 컴퓨터) 처럼 사용하는 방식으로 다른 서버에서도 해당 세션 id값을

복제 하는 것이다 그렇게 될 경우 너무 많은 메모리가 발생하게된다.

 

 

스케일 아웃 로드 밸런싱 ,  데이터 불일치

세션 스토리지 분리//데이터 베이스

: 그래서 마지막으로 나온 방식이 세션 스토리지 분리 방식이 나오게 된다.

이것은 새로 세션을 저장하는 스토리지를 서버 내부가 아닌 외부에 만드는 것이다.

 

이 데이터 베이스로 많은 것들이 있지만 in Memory 방식과 디스크 기반 방식이 있는데 오라클 같은 경우는

디스크 기반이다 ,디스크 기반 방식은 세션아이디를 주기적으로 반복해서 읽어서 처리하는 작업에서는

불필요하게 시간이 오래걸리는 단점이 있다, 그 세션 아이디를 확인 할때 마다 디스크까지 가서 가져와야 한다는 것이다 .

그래서 in Memory방식을 사용하는데 그것은 메모리에 올려서 가져오는 방식이다.  이렇게 되면 장점은 디스크 보다

메모리에서 데이터를 가져오기에 시간을  단축 시킬수있다는 것이다.

하지만 이 방식에서의 문제점은 램에 올린다는 것은 휘발성이 있기에 해당 브라우저 종료시에 다 날아가 버린다.

그래서 세션 아이디 값 같은 경우는 브라우저가 종료되면 날아가는 정보이기에 이런 값을 저장하는데 있어서는 

오히려 효율적일수있다.

 

이런 데이터 베이스로는 레디스랑 맴캐시드 가 있는데 .

이들의 장단점이 있따 레디스같은 경우는 캐시 메모리의 단점인 데이터의 영속성을 해결 하기 위해서 aop같이 

영속성을 보장하기위한 방법이 있고,  

 failover(장애 극복 기능) 이라고 , Replication 복제 하는 것을 지원하기에 서버 하나에  문제가 생기더라도 

복제된 slave 서버를 master로 승격 시켜서 서비스를 운영 할수 있다.

하지만 맴 케시드는 그런 것이 없고 그대신 다중 서버를 둔다 , 서버에 데이터를 분산하여 저장 하게 되다 보니

데이터가 유실된다고 하더라도 30%미만 정도 유실 되게 되고 , 또한 서버의 장애에 대한 피해가 준다.

맴케시드도 직접 장애 극복 기능을 구현 할수도 있다.

 

또한 레디스는 싱글 스레드 방식으로 동작을 하고 맴캐시드는 여러 쓰레드로 동작을 하게되는데 

이는 성능 부분에서 큰 차이가 없는 것이 싱글스레드여도 cpu의 작업속도는 워낙 빠르고 메모리에 올려서 

작업 을 하다 보니 크게 차이 가 없다는 것이다 하지만 예외로  단일스레드로 작업하다보니 시간이 오래걸리는 작업이

있다면 그뒤에 작업이 실행되지 않기에 그로인한 이슈는 있다.

 

마지막으로 메모리에 올리는 방식이기에 주의 해야 하는 사항들이 있다.

그것은 물리적인 메모리가 가득 찼을 경우에 발생할수 있는 문제점이다. 특히 레디스 같은 경우는 

 jemalloc알고리즘을 사용하기에  메모리 단편화 문제가 있다.

 

 

보통은 메모리가 부족할시 디스크에 스왑 영역을 통해서 가상메모리 통해서 해결을 할수있지만

시간이 좀더 걸리는 부분이 있다 . 아무튼 그래서 메모리 관리가 너무나도 중요한 이슈가 있다.

 

그리고 

레디스는 방식 두가지 가 있는데 우선 맴케시드 보다 읽어 오는 것이 속도가 빠르고 메모리 사용도 적다.

 

1. 먼저 세션 id값을 캐시 서버에서 찾는 다 , 그때 없을시에 db를 뒤져본다, 그다음에 그걸 가져와서 캐시서버에 

저장을 한후 응답을 한다.

캐시 히드, 캐시 미스 등 

 

 

2. 데이터 저장시 캐시서버에 저장이 되고 일정시간이 지나면 db로 이동되어 저장된다 그리고 캐시서버에 있는 것은

삭제 된다 .

 

 

 

메인 메모리(RAM)가 부족할 경우 메모리에 올린 프로세스들이 부족한 공간을 해결하기 위해 하드디스크에 SWAP 공간을 만들어 임시 저장하게 된다. 메모리 부족을 해결하기 위한 좋은 방법이 될 수 있다. 하지만 치명적인 단점이 발생한다. 바로 SWAP을 하는동안 레이턴시가 발생하게 된다.

 

 

in memory, 디스크 기반 

 

레디스 , 맴 캐시드 ( 영속성)

 

메모리 방식 

https://blog.bespinglobal.com/post/redis-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%EC%9D%80-%EC%9D%B4%EB%A0%87%EA%B2%8C/