토이프로젝트는 네이버 뉴스 서비스를 참고하여 대용량 서비스를 가정했기에 멀티서버 구조를 가져갔다.

beststar-1.tistory.com/35

 

뉴스 서비스 토이프로젝트 - 멀티서버 구조 적용

네이버 뉴스 서비스가 대용량 서비스 환경이어서 토이프로젝트도 이를 이해하고 구현하는 목적을 설정해 대용량 서비스 환경을 가정했다. 그 예시를 찾아본 결과 등록 사용자 수, 월 사용자 수,

beststar-1.tistory.com

 

이때 사용자가 많을수록 서버에 트래픽이 발생하기 때문에 이를 해결하기 위해 멀티서버에서 서버의 로드율 증가, 부하량, 속도저하, 장애를 고려해 적절히 분산처리 해주는 로드밸런서(Load balancer)가 있다.

 

토이프로젝트에서는 로그인 기능을 제공하고 로그인 상태세션으로 유지하기로 정했는데, 이때 어느 서버에 클라이언트별 세션을 저장할지 정하는게 필요해 조사한 결과 로드밸런싱 알고리즘(Round-robin, Least connection, 가중치 추가 등)으로 서버별 그룹을 정하는법, 고정 IP 주소로 서버별 그룹을 정하는법, 서버별 정보나 클라이언트 IP 주소를 담은 쿠키 통신을 활용한 스티키 세션(Sticky Session) 방법 등이 있었다.

 

그런데 로드밸런싱 알고리즘의 경우 의도대로 동작하지 않았을때 세션 정합성 문제가 있고, 고정 IP 주소나 스티키 세션의 경우 특정 서버 과부하/특정 서버 장애시 데이터 유실로 인한 가용성 저하 문제가 있어서 해결법을 조사 후 세션 클러스터링(Session Clustering)으로 해결 가능한 것을 확인했다.

 

세션 클러스터링이란 여러대의 컴퓨터가 세션 정보를 공유하는 것을 말하며 

그 방법에는 WAS 간 내장 세션으로 All-to-all이나 Primary-Secondary(BackUp) 서버 구성, 인메모리 DB 기반의 별도 세션서버 스토리지 구성, 인메모리 데이터 그리드 기반의 구성이 있다.

 

그런데 WAS 간 내장 세션 데이터는 All-to-all 방식에선 정합성이 보장되지만 유지 세션 데이터 만큼 메모리가 필요하며 트래픽이 증가되는 문제가 있었다. 이를 보완하기 위해 Primary-Secondary 방식으로 Primary 서버 외에는 JSessionID만 복제해 메모리를 절약할 수 있다. 하지만 PrimarySecondary를 제외한 서버에 세션을 요청할 경우 다시 Primary 서버를 거쳐야하는 문제가 있다.

따라서 별도 세션서버 스토리지를 구성한다면 스케일아웃(Scale-out) 하더라도 해당 서버에 스토리지 정보만 입력해주고 세션 정보를 공유할 수 있어서 복제할 필요도 없어진다.

 

Key-Value 타입의 대표적 NoSQL 스토리지들 중 RedisMemcached를 비교했다. 그 결과 아래 사항들 때문에 Redis가 우세하다고 판단했고 Spring Sesssion Data Redis 모듈을 사용했다.

  • 세션 서버 장애시 스냅샷을 활용하거나 명령어 실행마다 기록을 하는 AOF(Append Only File)를 활용해 디스크 저장이 가능하다.
  • 로그인 세션이 댓글/반응/기사작성 등 서비스 사용시 자주 읽어야하는 데이터이므로 동일한 읽기 횟수 대비 메모리 사용량이 더 낮다.
  • 수많은 기사/댓글 정보를 캐싱하는데에도 사용할 수 있다.

출처

뉴스 서비스 토이프로젝트

github.com/hwangwongyu/news

 

HwangWonGyu/news

Contribute to HwangWonGyu/news development by creating an account on GitHub.

github.com

 

세션 참고 부분

interconnection.tistory.com/74

 

로드 밸런서 개념과 필요성 부분

nesoy.github.io/articles/2018-06/Load-Balancer

d2.naver.com/helloworld/284659

 

로드 밸런서 동작방식 참고자료

www.digitalocean.com/community/tutorials/what-is-load-balancing#how-does-the-load-balancer-choose-the-backend-server

 

로드 밸런싱 알고리즘 부분

www.incodom.kr/Load_Balancing#h_50ae12cbecdbd4cae44364ba6888ff10

 

세션을 유지하는 방식 부분

hyuntaeknote.tistory.com/6

 

세션 클러스터링 부분 - WAS 간 내장 세션, 인메모리 DB 기반의 별도 세션서버 스토리지, 인메모리 데이터 그리드 기반의 방식까지

www.opennaru.com/openmaru/openmaru-cluster/

 

Spring이 NoSQL 스토리지엔 Redis를 세션 스토리지로 적용한 이유 부분

docs.spring.io/spring-data/data-redis/docs/current/reference/html/#why-spring-redis

 

Redis vs Memcached

deveric.tistory.com/65

aws.amazon.com/ko/elasticache/redis-vs-memcached/

stackoverflow.com/questions/10558465/memcached-vs-redis