웹 계층은 무상태 계층으로

수평적으로 확장하기 위해서는 서버에선 상태 정보를 저장하면 안된다.

 

그러니까 사용자 세션 데이터 같은 것들을 저장하지 않고 JWT 를 사용하고 데이터베이스에 저장해둬야한다.

 

요청이 어느 서버로 향하든 상관 없어야지 확작성을 가진다.

 

Q) 세션 정보를 서버에 저장하고 있으면 발생하는 문제는?

  • 사용자 A 가 서버 1, 2, 3 중에 서버 1에서 인증을 했다고 가정하고 서버 1이 세션 정보를 내부적으로 가지고 있다고 생각해보자.
  • 사용자 A 는 그러면 서버 2 와 3 에게 요청을 보내면 실패할 수도 있다. 서버 1이 인증 정보를 가지고 있으니까.

 

Q) 로드 밸런서에 스티키 세션(Sticky Session) 기능을 이용하면 되지 않나요?

  • 이런 의존성을 가지는 방법은 문제가 많다. 로드 밸런서에서 세션 유지를 하기 위한 정보를 가지고 있어야 하기도 하다.

 

모든 계층에 다중화 도입

어플리케이션 서버와 데이터베이스에 다중화를 지원해야한다. 가용성과, 부하 분산과 확장성을 위해서.

 

어플리케이션의 다중화:

  • 로드 밸런서에 서버를 추가해주면 됨.

 

데이터베이스 다중화:

  • Master-Slave 관계 구축. Slave 는 Read 연산, Master 는 Wrtie 연산
  • Master 장애 시에 Slave 가 Master 가 되도록 구축
    • Slave 가 Master 가 될 떄 최신 데이터를 포함한 상태로 복구될 수 있도록 해야한다.
    • 다중 마스터를 쓰는 것도 방법이다.

 

가능한 많은 데이터를 캐시하는 것

자주 참조되는 데이터는 캐시를 써서 부하를 분산시키는 것.

 

캐시를 적용할 때 고려해야 할 점:

  • 캐시 할 데이터 고르기. 갱신이 자주 일어나지 않고, 자주 참조되는 데이터가 좋음.
  • 일관성 고려하기. 캐시의 데이터와 데이터베이스의 데이터는 일관성이 다를 수 있다.
  • 캐시 데이터 만료 정책 정하기
  • 캐시 데이터 또한 다중화를 해서 SPOF 문제를 방지하는 것.
  • 캐시 메모리의 크기 정하기

 

여러 데이터 센터를 지원하는 것

고가용성을 의해서 여러 데이터 센터를 사용해야한다.

 

데이터 센터로의 라우팅은 로드 밸런서가 해줄거임.

  • GeoDNS 같은 걸 이용하면 지리적으로 가장 가까운 데이터 센터로 트래픽이 라우팅 된다.

 

여러 데이터 센터를 지원할 때 고려해야 하는 것:

  • 데이터 센터간의 동기화 문제.
  • Thundering herd events 에 대응하기 위한 Load Shedding 기능
    • Netflix 에서는 Spring Cloud Zuul 을 이용해서 구현함. 
  • 하나의 데이터 센터가 장애가 났을 때, 이를 인지하고 정상적인 데이터 센터로 트래픽을 라우팅 해줄 수 있는 기능
    • DNS 정보를 빠르게 변경해줘야한다.
  • 여러 데이터 센터로의 어플리케이션 배포와 테스트

 

정적 콘텐츠는 CDN 을 통해 서비스화 하는 것

CDN 을 적용할 때 고려해야할 사항:

  • CDN 은 데이터 양에 따라서 요금을 내게 된다. 자주 사용하는 데이터만 캐싱해둬야 비용 효율적임.
  • 적절한 만료시간 설정
  • CDN 장애에 대한 대처 방안을 고려해야한다. (이 경우에는 원본 서버에서 직접 콘텐츠를 전송할 수 있도록 해야함.)

 

Q) 정적 콘텐츠 캐싱과 동적 콘텐츠 캐싱이란?

  • 정적 콘텐츠 캐싱:
    • Javascript 파일, 이미지, 비디오, CSS 파일 등을 캐싱해두는 것
  • 동적 콘텐츠 캐싱:
    • 동적으로 생길 수 있는 HTML 파일을 캐싱해두는 것. Request Path, 쿼리 스트링, Request Header, Cookie 정보를 이용해서 캐싱해두는 것을 말한다.

 

데이터 계층은 샤딩을 통해 확장하는 것

샤딩을 통해 수평적으로 확장하는 것.

 

샤딩에서 고려해야할 것:

  • 샤딩 키 선정. 데이터를 올바르게 분산시킬 수 있도록
  • resharding 고려: 하나의 샤드가 너무 뚱뚱해지면 다시 샤딩을 해야할 수 있다. Consistent Hashing 기법을 이용하면 이 문제를 해결할 수 있다.
  • Hot Spot 문제: 하나의 샤드가 트래픽의 대부분을 차지하는 문제가 발생할 수 있다.
  • 조인과 비정규화: 샤드로 데이터를 나눠 놓으면 조인하기가 힘들어진다. 이를 비정규화를 통해 해결해볼 수 있다.

 

각 계층은 독립적 서비스로 분할하는 것

시스템을 목적에 맞게 더 작은 서비스로 쪼개놔야 할 수 있다.

 

시스템을 지속적으로 모니터링하고, 자동화 도구들을 활용하는 것.

로그와 시스템 매트릭들을 수집하고 모니터링하면서, 시스템이 불안정해질 때 빠르게 대응하도록 하는게 필수다.

 

CI/CD 와 같은 자동화 도구들을 이용해서 안전하고 빠르게 배포할 수 있도록 만드는 것이 중요하다.

+ Recent posts