서버를 한개만 사용하다보면, 서버의 처리 능력보다 많은 양의 트래픽이 들어오는 상황이 발생하는 문제가 발생하기도 한다.
우리 서비스를 이용하고 싶어도 처리 능력의 한계 때문에 이용이 불편해지거나 심각하면 서버의 장애가 발생해 서비스 중단을 초래하고 회사의 매출, 수익 악화로 직결된다. 이럴 때를 위해 서버의 처리 능력을 향상시키는 방법으로 2가지가 존재한다.
💡 서버의 처리 능력을 향상시키는 방법
1) Scale up
: 한 대의 서버를 구성하는 부품(CPU, RAM, DISK etc.)을 추가하거나 업그레이드해서 그 서버 자체의 처리 능력을 향상시키는 방법
2) Scale out
: 서버의 절대적인 수를 늘려 많은 트래픽을 여러 서버가 나눠서 처리하는 방법
Scale out 은
1) 운영 중인 서버에 영향을 끼치지 않으면서 서버의 중단 없이 처리 능력을 향상시킬 수 있고,
2) 여러 대의 서버를 동시에 운영하는 구조이기 때문에 하나의 서버에 문제가 발생해 장애가 나더라도 다른 서버에서 트래픽을 처리하면 돼서 서비스에 끼치는 영향이 작다.
는 장점으로 많은 사람들이 한 서버가 모든 트레픽을 감당하게 되서 발생하는 문제점들을 해결하기 위해 Scale out을 사용합니다. Scale out으로 서버를 운영하기 위해서는 로드밸런싱이 필요하고, 이것이 세션 불일치 이슈를 발생하게 만든다.
로드밸런싱 : 대용량 트레픽을 장애없이 처리하기 위해 여러 대의 서버에 적절히 트래픽을 분배하는 것
Scale out을 통해 서버를 총 3대를 운영하고 있는 상태에서 새로운 사용자가 서버1에 접속하여 세션이 생성되었다. 이 때 아직 서버2와 서버3은 이 유저의 세션 정보에 대해 알지 못한다. 이런 상태에서 유저가 다시 서비스에 접속할 때 요청이 서버2나 서버3에게 할당된다면, 이 서버들은 유저의 세션 정보를 찾지 못하기 때문에 인증 처리가 되지 않는다. 그럼 유저는 요청을 보낼 때마다 매번 인증을 위해 매번 다시 로그인을 해야하는 상황이다.
따라서, 여러 대의 서버를 동시에 운영하기 위해서는 세션을 동기화시킬 수 있는 방안을 반드시 마련해야 합니다. 이 문제를 해결하기 위해서 크게 3가지 방법이 있다.
💡 세션을 동기화시킬 수 있는 방안
- Sticky Session : 클라이언트별로 담당 처리 서버를 지정하는 방법
- Session Clustering : 서버끼리 자기 서버에 보관하고 있는 세션의 변경사항을 실시간으로 주고받는 방법
- Session Server :세션 정보를 서버가 아닌 다른 외부 저장소에 저장하는 방법
최초 요청을 받은 서버가 해당 클라이언트에 대한 요청을 모두 책임지는 형태
장점 - 가장 구현이 간단하고 응답속도도 가장 빠름
단점 - 한 서버에 부하가 집중, 해당 서버가 다운되면 모든 세션 정보가 손실
세션 정보를 TCP Socket으로 서버끼리 공유하는 방법
장점
단점
최초 요청을 받은 서버가 세션 정보를 생성해서 외부 저장소에 저장
장점 - Sticky Session, Session Clustering의 단점 보완
단점 - 세션을 저장하고 있는 저장소 자체에 장애가 발생할 경우 모든 세션을 잃을 버릴 수 있음.