참고 : https://hyuntaeknote.tistory.com/4?category=867120
https://hyuntaeknote.tistory.com/6?category=867120
https://hyuntaeknote.tistory.com/7?category=867120
모든 내용과 이미지는 해당 블로그를 참조하였습니다.
단일 서버의 성능을 증가시키는 방식으로써, 철저하게 ACID가 지켜져야하는 환경에 적합합니다..
동일한 사양의서버를 추가하여 성능을 증가시키는 방식으로써 , 다수의 처리를 동시 병행적으로 행해야 하는 경우 적합합니다..
데이터 정합성 문제가 가장 까다로운 문제입니다.
로그인을 할 때, 하나의 서버에 세션을 관리한다고 가정하겠습니다.
세션은 하나의 서버에 저장되는데, 여러 대의 서버가 있을 경우,
로드 밸런싱에 의해, 세션이 저장되지 않은 서버로 요청이 갈 경우
인증된 사용자가 아니게 됩니다.
고정된 서버로 모든 요청을 처음 세션을 생성한 서버로 보내는 것을 의미합니다.
정합성 문제로부터 자유로워 질수는 있으나, 트래픽이 집중되는 경우 문제가 생길 수 있습니다.
세션이 있는 서버로 트래픽이 몰릴 경우, 사용자는 세션이 없는 다른 서버를 이용할 수 없기 때문입니다.
또한, 해당 서버의 장애가 발생할 경우 세션 정보를 잃어버려 가용성이 떨어집니다.
생성된 세션을 모든 서버의 세션저장소로 복제하는 방식입니다.
이렇게 되면 , 사용자는 고정된 서버로 요청을 보낼 필요가 없어집니다.
뿐만 아니라, 상대적으로 트래픽과 장애로부터 자유로워 집니다.
하지만, 모든 서버에 복제해야 하므로, 많은 메모리를 낭비하게 됩니다.
고로 , 해당 방식은 4개 이상의 서버를 가진 경우에는 추천하지 않는다고 합니다.
생성된 세션 객체를 Secondary(Backup)서버에는 전체를 복사하고
그 나머지 서버는 JSESSION ID만을 복제하는 것입니다.
이전 방식에 비해 상대적으로 메모리를 덜 낭비할 수 있으며 , 특
정 서버의 장애를 대비할 수 있습니다.
하지만 , JSESSION ID만을 받고 , 세션 객체를 가지고 있는
Primary 서버에 요청하여 해당 객체를 받아와야 한다는 단점이 있
습니다.
별도의 세션 저장소를 사용하는 것을 의미합니다.
해당 방식의 경우 , 정합성 문제 , 복사 비용등을 모두 해결할 수 있습니다.
세션 저장소를 분리함으로써 , 많은 문제들이 해결되었지만
이 또한 문제점을 언급하자면, 분리된 세션 저장소를 방문해야 한다는 점입니다.
성능에 영향을 최소화 하기 위해서는 세션 저장소로써 적합한 데이터 베이스를 선택해야 합니다.
이 때 크케 In-Memory 방식과 디스크 기반 방식이 있습니다.
MySQL,Oralcle 등과 같은 관계형 데이터 베이스가 있습니다.
디스크에 저장되어 영구적으로 보관할 수 있지만, 속도가 느리고
휘발성 데이터인 세션을 저장하기에 적합하지 않습니다.
스토리지 엔진에 따라서 메모리에 저장하기도 합니다.
메모리에 저장하고 관리합니다.
또한 디스크 기반보다 빠른 속도를 자랑합니다.
물론, 메모리에 저장되기에 전원이 공급되지 않게 되면 모두 날라가 버리게 되지만
일부 In-Memory 데이터 베이스에서는 Replication이라는 기능을 통해 failover를 지원한다고 합니다.
즉, 장애에 대비하여 Master DB를 Slave DB에 복제하여 Master
DB에서 장애가 발생할 경우 Slave DB로 대체하는 것입니다.
세션 객체가 저장되는 방식과 유사하게 Key-Value 형태로 데이터를 저장하는 데이터베이스가 있습니다.
이를 Key-Value 데이터베이스 혹은 Key-Value Model NoSQL
이라고 합니다.
관계형 DB처럼 복잡한 조회 연산을 지원하지는 않지만, 단일 키 처리만을 지원하기에 고속 읽기와 쓰기에 최적화된 경우가 많습니다.
세션 또한 간단한 연산을 통해 처리할 수 있기에, Key-Value 형태의 DB가 적합하다고 볼 수 있습니다.
그 중에서도 가장 많이 사용되는 것이 Redis와 Memcached입니다.
Redis와 Memcached의 경우 , 나중에 학습 후 포스팅하겠습니다.