1. 사용자 수에 따른 규모 확장성

기훈·2024년 11월 23일

한 명의 사용자를 지원하는 시스템에서 시작하여 몇백만 사용자를 지원하는 시스템을 순차적으로 설계 해보자.

1. 단일서버

모든 컴포넌트가 한대의 서버에서 실행되는 간단한 시스템이다.


2. 데이터베이스

사용자가 늘면 서버 하나로는 충분치 않다. 웹/모바일 트래픽 서버, 데이터베이스용으로 서버를 분리했다.


3. 로드밸런서

부하 분산 집합에 속한 웹 서버들에게 트래픽을 고르게 분산하는 역할을 한다.


4. 데이터베이스 다중화

대부분의 애플리케이션은 읽기 연산 비중이 쓰기 연산보다 훨씬 높다. 이를 고려해 데이터베이스를 다중화 한
다.


5. 로드밸런서 + 데이터베이스 다중화


6. 캐시

값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고 요청이 보다 빨리 처리될 수 있다록 하는 저
장소다. 캐시를 사용할 때는 아래의 사항들을 고려하여야 한다.

  • 어떤 상황에 바람직한가? 데이터 갱신은 자주 일어나지 않지만 참조는 빈번하다면 고려해볼 만하다.
  • 어떤 데이터를 캐시에 두어야 하는가?
  • 캐시에 보관된 데이터는 어떻게 만료 되는가? 이에 대한 정책을 마련하는 습관을 들이자.
  • 일관성은 어떻게 유지되는가? 여러 지역에 걸쳐 시스템을 확장해 나가는 경우 캐시와 저장소 사이의 일관성을 유지하는 것은 어려운 문제가 된다.
  • 장애는 어떻게 대처할 것인가? 캐시 서버를 한 대만 두는 경우 해당 서버는 SPOF가 될 가능성이 높다.
  • 캐시 메모리는 얼마나 크게 잡을 것인가? 캐시 메모리가 너무 작으면 엑세스 패턴에 따라서는 데이터가 너무 자주 캐시에서 밀려나 버린다.
  • 데이터 방출 정책은 무엇인가? 캐시가 꽉 차버리면 추가로 캐시에 데이터를 넣어야 할 경우 기존 데이터를 내보내야 한다.

7. CDN

정적콘텐츠를 전송하는데 쓰이는, 지리적으로 분산된 서버의 네크워크이다. CDN을 사용할 때 아래 사항들을 고려해야 한다.

  • 비용
  • 적절한 만료 시한 설정
  • CDN 장애 대처 방안
  • 콘텐츠 무효화 방법

8. 무상태 웹 계층

웹 계층을 수평적으로 확장하기 위해서 상태정보(세션 데이터와 같은)를 웹 계층에서 제거해야 한다.


9. 데이터 센터

가용성을 높이고 전 세계 어디서도 쾌적하게 사용 할 수 있도록 여러 데이터 센터를 지원하자. 데이터 센터를 사용할 때 아래 사항들을 고려해야 한다.

  • 올바른 데이터 센터로 트래픽을 보내는 효과적인 방법을 찾아야 한다. GeoDNS는 가장 가까운 데이터 센터로 트래픽을 보낼 수 있게 해준다.
  • 데이터 센터마다 다른 데이터베이스를 사용한다면 어떻게 동기화 할 것인지 고려해야 한다.
  • 여러 데이터 센터를 사용하도록 시스템이 구성된 상황이라면 여러 위치에서 테스트해보는 것이 중요하다.

10. 메세지 큐, 로그, 메트릭, 자동화 등을 반영한 설계안

메세지큐는 각 컴포넌트의 결합을 느슨하게 하고 로그, 모니터링, 메트릭, 자동화 등을 지원하기 위한 장치를 추가하였다.


11. 데이터베이스 규모 확장

샤딩을 통해 데이터베이스를 수평적으로 확장 해보자. 샤딩은 데이터 베이스를 샤드라고 하는 작은 단위로 분할하는 기술로, 모든 샤드는 같은 스키마를 쓰지만 보관되는 데이터 사이에는 중복이 없다. 샤딩을 구현할 때 아래 사항들을 고려해야 한다.

  • 데이터가 너무 많아져서 하나의 샤드로 감당하지 못한거나 샤드 간 데이터 분포가 고르지 못할 때 어떻게 해야할 것인가?
  • 특정 샤드에 질의가 집중되어 서버가 과부화 되는 유명인사 문제를 어떻게 해결할 것인가?
  • 하나의 데이터베이스를 여러 샤드 서버로 쪼개고 나면 조인을 어떻게 할 것인가?


12. 최종 설계안

최종 설계안이다. 아래는 살펴본 기법들을 다시 정리하였다.

  • 웹 계층은 무상태 계층으로 한다.
  • 모든 계층에 다중화를 도입한다.
  • 가능한 많은 데이터를 캐싱한다.
  • 여러 데이터 센터를 지원한다.
  • 정적 콘텐츠는 CDN을 통해 서비스한다.
  • 데이터 계층은 샤딩을 통해 그 규모를 확장한다.
  • 각 계층은 독립적 서비스로 분할한다.
  • 시스템을 지속적으로 모니터링하고, 자동화 도구들을 활용한다.

(출처: 가상 면접 사례로 배우는 대규모 시스템 설계 기초)

0개의 댓글