대규모 서비스 기반 지식

qwer·2022년 3월 20일
3

대규모 서비스에 대해 공부하면서 흩어져 있던 지식들을 정리하려고 함

웹 어플리케이션 서버 scale out

  • CPU 부하일 경우 같은 구성의 서버를 느리고 로드밸런서로 분산
  • 웹 계층을 수평적으로 확장하기 위해서는 무상태(stateless) 이어야 함
    • 사용자 세션 데이터와 같은 정보가 웹 계층에 저장되는 경우 수평적 확장이 힘듬
    • stateless 아키텍처일 경우 로드밸런서를 통해 어떤 웹서버로도 전달될 수 있기 때문에 단순하고, 안정적이며, 규모 확장이 쉬움
  • 클라우드 플랫폼에서는 auto-scaling 기능을 제공함으로써 동적으로 서버를 확장 가능

캐시

  • 일반적인 웹 어플리케이션에서의 병목지점은 대부분 데이터베이스에서의 disk I/O
  • 캐시 기능을 잘 활용하면 disk I/O를 최대한 줄일 수 있음
  • 캐시 계층의 규모를 독립적으로 확장 가능
  • 일반적으로 DB를 조회하기 이전에 redis와 같은 인메모리 DB를 먼저 조회하여 disk I/O를 피하는 방식
  • ex) redis, memcached

콘텐츠 전송 네트워크(CDN)

  • 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전송(image, js, css 등)
  • CDN 서버는 내부적으로 한번 전송한 콘텐츠를 캐시함

데이터베이스

  • DB 서버의 메모리 확장(scale up)
    • 리눅스에서는 기본적으로 한번 읽은 파일은 페이지 캐시 기능을 이용하여 메모리에 캐시함
    • 데이터 규모 < 물리 메모리 이면 전부 캐싱 가능
    • 하지만 scale up 방식은 확장에 한계가 존재
  • 데이터의 분산(scale out)
    • Master-Slave 기반 복제
      • DB의 경우 일반적으로 write 보다 read 양이 많음
      • DB의 replicaion 기능을 이용해 write만 가능한 master와 read만 가능한 다수의 slave DB로 분리
      • 하지만 write는 분산되지 않음
    • 샤딩(sharding)
      • 각각의 DB가 데이터의 일부분을 나눠 가지게 구성
        • 수평 분할(horizontal sharding)과 수직 분할(vertical sharding) 방법이 있음
        • 수평 분할
          • 하나의 테이블의 row를 쪼개는 것
          • 하나의 테이블의 데이터를 여러 DB로 분할
        • 수직 분할
          • 하나의 테이블의 column을 쪼개는 것
          • 보통 쿼리가 데이터 테이블 column의 일부만 요청하는 경우 효과적
      • 하지만 샤딩을 하게 되면 시스템 복잡도가 증가함
      • 최근에는 샤딩을 기본적으로 제공하는 데이터베이스 플랫폼이 존재(Vitess 등)
  • 인덱스 설계의 중요성

메세지큐

  • 메세지큐를 이용하면 생산자와 소비자가 분리됨으로써 서비스 또는 서버 간 결합이 느슨해짐
  • 사용 예로는 이미지 보정 기능 같은 경우 처리 시간이 오래걸리기 때문에 메세지큐를 이용해 비동기적으로 완료

마이크로서비스 아키텍처(MSA)

  • MSA는 단일 애플리케이션을 도메인 별로 나누어 작은 서비스의 조합으로 구축하는 아키텍처
  • 이번 게시글 관련 장점만 나열
    • 도메인(기능) 별로 서비스를 나누기 때문에 별도의 DB 구축 가능
      • DB의 scale out 가능
      • 서비스의 특성에 맞는 DB 선택 가능
    • 유연한 확장 가능
      • 모놀리틱 아키텍처와 달리 확장이 필요한 서비스만 scale out 가능
  • 하지만 여러가지 단점 또한 존재하기 때문에 상황에 맞는 도입 필요

정리

  1. 웹 계층은 무상태(stateless) 계층으로
  2. 모든 계층에 다중화 도입
  3. 가능한 한 많은 데이터를 캐시
  4. 정적 콘텐츠는 CDN을 통해 서비스
  5. 데이터 계층은 샤딩을 통해 규모 확장
  6. MSA를 도입함으로써 각 계층을 독립적 서비스로 분할

참고자료

0개의 댓글