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

HoyongLee·2023년 5월 27일
0
post-thumbnail

단일 서버

웹 앱, 데이터베이스, 캐시 등 모든 컴포넌트를 한 대의 서버에서 실행시킨다.
-> 컴퓨팅 자원의 부족, 단일 장애점의 문제점

데이터베이스

웹 앱과 데이터베이스를 분리함으로써 각각을 독립적으로 확장시킬 수 있다.

RDBMS vs NoSQL

NoSQL의 종류

  • 키-값 저장소
  • 그래프 저장소
  • 컬럼 저장소
  • 문서 저장소

NoSQL이 바람직한 경우

  • 아주 낮은 레이턴시가 요구될 때
  • 다루는 데이터가 비정형일 때
  • 데이터에 대한 직렬화 or 역직렬화만 필요할 때
  • 매우 많은 데이터를 저장할 때

스케일 업 vs 스케일 아웃

스케일 업

  • 서버에 고사양 자원을 추가하는 것
  • 단순하다는 장점이 있음.
  • 하지만, 자원을 무한정 추가할 수 없음.
  • failover(자동복구), 다중화 방안이 없음. 단일 장애점.

스케일 아웃

  • 위와 같은 스케일 업의 단점 때문에 대규모 어플리케이션을 지원할 때 스케일 아웃이 보다 적절함.

  • 로드밸런서

    • 부하 분산 집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분배.
    • 트래픽이 증가하면 웹 서버 계층에 서버를 추가하면 된다.
    • 서비스 전체가 다운되는 일을 방지할 수 있다.
    • 클라이언트의 요청은 로드밸런서로 전달되고, 사설 IP를 통해 로드밸런서가 트래픽을 분배(더 나은 보안).
  • 데이터베이스 다중화

    • 마스터 - 워커 구조로 데이터베이스를 다중화한다.
    • 쓰기 연산은 마스터에서만 지원, 워커에서는 읽기 연산만 지원한다.
    • 병렬로 처리할 수 있는 쿼리가 증가(성능 향상)
    • 서버 일부가 파괴되어도 데이터 보존 가능(안정성 향상)
    • 서버 일부에 장애가 발생해도 서비스 가능(가용성 향상)

캐시

비용이 많이 드는 연산 결과 혹은 자주 참조되는 데이터를 메모리에 두고 요청이 보다 빨리 처리될 수 있도록 하는 저장소

  • 캐시도 계층을 나눔으로써 독립적인 확장이 가능하다.

캐시 사용시 고려할 점

  • 갱신은 자주 일어나지 않고 참조는 빈번하게 일어나는 정보
  • 중요한 데이터를 캐시에 놓아도 되는가?
  • 만료 시간
    • 너무 길면 일관성 Down
    • 너무 짧으면 원본 데이터베이스 접근 Up
  • 캐시와 원본 데이터 간의 일관성 -> 단일 트랜잭션에서 둘 다 수정되는가?
  • 장애 대처 -> SPOF가 되지 않도록 다중화, 분산
  • 메모리 크기 -> 너무 작으면 eviction이 잦음.
  • eviction 정책 -> lru, fifo, lfu,,,

CDN

정적 컨텐츠를 전송하기 위한 지리적으로 분산된 서버 네트워크.

Stateless 웹 계층

서버를 스케일 아웃했을 때, 서버마다 요청한 사용자의 정보를 가지면 어떨까?

만약 그 정보가 로그인 여부와 같은 정보라면 사용자는 로그인 한 서버에만 요청을 보내거나, 로그인을 계속해야될 수도 있다.

이것은 stateful 한 서버이다.

로드밸런서가 sticky-session(L7 스위치의 기능) 을 지원하면 클라이언트가 같은 서버로 요청할 수 있도록 도와준다.
하지만,

  • 이는 로드밸런서에 부담을 줄 수 있고,
  • 서버를 확장, 축소하거나 장애를 처리하기도 어렵다.

따라서 공유저장소에 상태 정보를 저장하여 관리하는 stateless 웹 계층을 구성해야 한다. 이는,

  • 단순하고,
  • 확장이 쉽고,
  • 장애 대응에 보다 용이하다.

메시지 큐

메시지의 무손실(큐에 저장된 메시지는 소비자가 꺼낼 때까지 안전하게 보관되는 특성)을 보장하고 비동기 통신을 지원하는 컴포넌트.

  • 시스템을 큰 규모로 확장하기 위해서는 시스템의 컴포넌트를 분리하여 각각 독립적으로 확장될 수 있도록 해야 한다.
  • 메시지 큐를 이용하여 독립된 시스템 컴포넌트가 통신할 수 있다.
  • 시스템 컴포넌트 간의 결합이 느슨해진다(한 컴포넌트가 죽어도 메시지를 보낼 수 있음).

데이터베이스 규모 확장

수직적 확장

  • 기존 서버에 더 많은 자원 혹은 더 고성능인 자원을 증설하는 방법.

문제점

  • SPOF(단일장애지점)이다.
  • 하드웨어에는 한계가 있으므로 CPU, RAM을 무한증설할 수 없다.
  • 비용적인 문제.

수평적 확장

  • 더 많은 서버를 증설함으로써 확장하는 방법.

샤딩 : 동일한 스키마의 데이터를 중복되지 않도록 여러 서버에 분리

  • 데이터가 어떻게 분산될 지를 결정하는 샤딩 키를 정하는 것이 가장 중요함.

  • 샤딩을 하며 풀어야 할 문제들이 있음.

    • 데이터의 재 샤딩
    • 핫스팟 키 : 특정 샤드에 쿼리가 집중되어 서버에 과부하가 걸림.
    • 조인과 비정규화 : 샤드에 걸친 데이터를 조인하기 힘들다. 따라서 데이터를 비정규화하여 하나의 테이블에서 질의가 수행되도록 하는 것.

파티셔닝 : 동일한 스키마를 가진 테이블을 여러 개 만들어 분산 저장

  • 인덱스의 크기가 작아지기 때문에 성능적인 이점이 있다.
profile
아직 반지하

0개의 댓글