1.서버 Upgrade 방법
현재 서버를 Upgrade하는 Scale-Up
더 좋은 CPU, 더 많은 RAM 등을 통해 단순히 서버의 처리 능력을 좋게 만들어서 많은 트래픽을 해당 서버가 처리할 수 있도록 하는 것.
장점으로는 간단하고 따로 프로그램 작업을 해줄 필요가 없다. 하지만 성능 증가 대비 비용이 많이 비싸기 때문에 한계가 있을 수 밖에 없다.
서버를 여러 개로 만드는 Scale-Out
여러 대의 서버가 트래픽을 나눠 가진다. Scale-Up과 달리 업그레이드에 한계가 없는 것이 장점이고, 보다 경제적이다.
하지만 하나의 서버가 아니기 때문에 메모리를 공유하지 않는다는 점에서 여러 문제가 발생한다.
이 때문에 로그인과 관련된 세션 쿠키가 공유되지 못하거나 DB의 데이터가 불일치하는 상황이 발생한다.
이렇게 발생한 데이터 불일치 문제를 데이터 정합성 문제라고 한다.
2.데이터 정합성 문제 해결
고정된 세션을 의미한다. 쉽게 표현하면 각 웹 서버에 유저들을 전담시킨다.
예를 들어 A씨가 로그인을 1번 웹서버에 하면 그 이후의 요청은 계속 1번 웹서버가 담당한다.
단점은 트래픽 분산이 잘 되지 않으며, 한 서버가 예기치 않게 중단되었을 때 해당 세션이 날아가는 상황이 발생할 수 있다.
(1)all-to-all Session Replication
모든 서버가 세션 저장소를 전부 똑같이 복제해서 가지고 있는 것
정합성 문제를 해결 할 수 있지만 같은 데이터를 중복해서 저장하고 있기 때문에 많은 메모리가 필요하고 세션값이 추가 또는 변경될 때 마다 모든 서버의 값을 변경해야 하므로 서버 수에 비례하여 네트워크 트래픽이 증가하게 된다.
따라서 전반적인 성능저하로 이어지기 때문에 대규모 시스템에는 적합하지 않다.
하지만 4개 이하의 소규모 다중서버에는 오히려 좋은 효율을 보여준다고 한다.
(2)primary-secondary Session Replication
all-to-all Session Replication의 메모리 문제를 해결하기 위해 고안한 방식이다.
각 세션별로 Primary서버와 Secondary서버를 지정함으로써 메모리 문제를 해결하고자 하였다.
Primary 서버: 세션 저장
Secondary 서버: 세션 복제본 저장
나머지 서버: JSESSION ID만 저장
기존보다 안정성은 떨어지지만 모든 서버가 세션을 복제&저장하고 있지 않기 때문에 메모리와 트래픽 문제가 어느정도 해소된다.
세션 저장소를 각 서버에 두는게 아니라 따로 분리하여 하나로 통합하는 방식. 따로 세션을 위한 데이터베이스를 만들어서 이를 참조하는 방식이다.
데이터가 어느 곳에 저장이 되는가를 기준으로 디스크에 저장하는 디스크 기반의 데이터베이스와 메모리에 저장하는 In-Memory 데이터베이스로 분류.
디스크 기반 데이터베이스에는 우리가 흔히 사용하는 예로 MySQL 등과 같은 관계형 데이터베이스가 있다.
디스크에 저장하기 때문에 전원이 갑자기 꺼져도 영구적으로 보관이 가능하지만 기계적으로 저장이 되기 때문에 I/O가 느린 디스크 방식은 빈번하게 Read/Write가 이뤄지는 세션 저장소로써는 불리하다.
In-Memory 데이터베이스는 메인 메모리에 설치되어 운영되며 Redis와 Memcached 등이 있다.
메모리에 데이터를 저장하고 관리하기 때문에 I/O에 대한 부담이 적으며 더 적은 CPU명령을 실행한다.
하지만 빠른 속도를 자랑하는 대신 휘발성이기 때문에 전원이 공급되지 않는 순간, 기억하고 있는 데이터를 전부 잃어버리게 된다.
이러한 단점을 극복하기 위해 DB가 재구동될 때 디스크로부터 로그 파일을 읽어와 DBMS구조를 재구축하는 방법도 있다.