개발 서적 완독하기/가상 면접 사례로 배우는 대규모 시스템 설계 기초

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 1장 (사용자 수에 따른 규모 확장성)

코드 살인마 2023. 9. 13. 21:58
728x90

단일서버

모든 컴포넌트가 서버(머신,인스턴스) 1대에서 실행되는 경우이다.

여기서 컴포넌트란 웹, 앱, 데이터베이스, 캐시를 뜻한다.

단일 서버 구조

1. 사용자는 도메인 이름을 이용하여 웹사이트에 접속 (이름 서비스는 DNS 서버에서 IP로 변경)

2. IP 주소로 HTTP 요청 전달

3. 요청을 받은 웹서버에서 HTML 페이지나 JSON 형태의 응답

 

데이터베이스

사용자가 늘면, 컴포넌트를 분리하기 시작한다.

대표적으로 데이터베이스 서버와 웹서버를 분리한다.

- 데이터베이스 서버는 용량 및 처리량이 크기 때문에 서버 분리 우선대상

어떤 데이터베이스를 사용할 것인가?

전통적으로 관계형 데이터베이스와 비관계형 데이터베이스로 나눠진다.

워낙 많이 들어본 내용이기 때문에 간단하게 정리하고 넘어간다. (자세한 내용은 https://code-killer.tistory.com/187 참고)

관계형 데이터베이스

  • mysql Oracle 등등
  • join 가능

비관계형 데이터베이스

  • Redis, DynamoDB
  • 키-값 저장소, 그래프 저장소, 칼럼 저장소, 문서 저장소로 나눠짐
  • join 불가능

아래는 비-관계형 데이터 베이스가 바람직한 경우이다.

  • 아주 낮은 응답 지연시간이 요구됨
  • 다루는 데이터가 비정형이라 관계형 데이터가 아님
  • 데이터를 직렬화 하거나 역 질렬화 할 수 있기만 하면 됨
  • 아주 많은 데이터를 저장할 필요 없음

사실 대규모 시스템에서는 비-관계형, 관계형 2개다 사용하는 경우가 많다.

 

수직적 규모 확장 vs 수평적 규모 확장

수직적은 '스케일 업' 이라고 부르고, 서버(머신, 인스턴스)의 성능을 높이는 것이다.(RAM, CPU 등)
수평적은 '스케일 아웃' 이라고 부르고, 서버의 개수를 늘리는 것이다.

대부분의 회사에서는 수평적 규모 확장을 진행하는데 아래와 같은 이유로 수직적 규모 확장은 하지 않고 있다.

  • 수직적 규모 확장에는 한계가 존재(무한정 성능 높일 수 없다)
  • 자동복구 방안이나, 다중화(이중화) 불가능. 만약 서버에 장애가 발생 시 서비스 중단

수평적 구조 확장에도 문제가 있다. 한개의 서버에 사용자들이 몰린다면, 장애가 발생할 수도 있다. 이를 해결하기 위해 부하 분산기 OR 로드밸런서가 등장한다.

 

로드밸런서

로드밸런서에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 한다.

만약 로드밸런서에 또 하나의 웹서버를 추가한다면 장애를 자동복구 하지 않는 문제와 웹 계층의 가용성이 향상된다. 구체적으로는 아래와 같다.

  • 서버 1이 다운되면 모든 트래픽은 서버 2로 전송되어, 서비스 중단 될 일이 없다.
  • 만약 트래픽이 가파르게 올라 서버 2대로 감당할 수 없다면, 로드밸런서에 서버 1개를 추가하면 된다.

로드밸런서의 등장으로 웹서버는 괜찮아 보이는데, 데이터베이스는 이런 문제를 어떻게 해결 할 것인가?

 

데이터베이스 다중화

위키에 따라면 '많은 데이터베이스 관리 시스템이 다중화를 지원한다. 보통은 서버 사이에 주(master)-부(slave) 관계를 설정하고 데이터 원본은 주서버에, 사본은 부 서버에 저장하는 방식이다.'

예를들어, 쓰기연산은 마스터에서만 지원한다. 부 데이터베이스는 사본만 전달받아 읽기 연산만을 지원한다. 이렇게 된다면 3가지 얻을 수 있는 장점이 있다.

  • 더 나은 성능 : 읽기와 변경의 역할이 다르기 때문에 성능이 좋아진다.
  • 안전성 : 천재지변에 의해 데이터가 날라간다 하더라도, 다른 데이터베이스에 저장되있어 안전
  • 가용성 : 데이터베이스 1대가 장애가 발생한다 해도, 다른 데이터베이스 사용 가능

지금까지 나온 최종 설계안은 아래 그림과 같다.

 

아마 글을 쭉 읽다보면,

모든 것은 컴포넌트 분리와 수평적 규모 확장으로 귀결되는 것을 알 수 있다.

다음 포스팅에서도 계속 나오겠지만, 결국 대규모 시스템을 구축하는데 필요한 첫번째는 컴포넌트의 분리(역할 쪼개기)이고, 두번째는 역할이 큰 컴포넌트(데이터베이스, 웹서버)는 수평적 확장(다중화)** 이다.

 

다음 포스팅에선 첫번째로 말한 컴포넌트를 더 쪼개는 내용이 진행된다.