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

1장에서는 1명의 사용자를 지원하는 시스템에서 최종적으로 몇 백만 사용자를 지원하는 시스템을 설계한다.

단일 서버

모든 컴포넌트가 단 한 대의 서버에서 실행되는 간단한 시스템으로 웹 앱, 데이터베이스, 개시 등이 전부 한 대의 서버에서 실행된다.

사용자 요청 처리 흐름

  • 사용자는 도메인 이름(api.mysite.com)을 이용하여 웹사이트에 접속한다.
  • 도메인 이름을 도메인 이름 서비스 (Domain Name Service, DNS)에 질의하여 IP 주소를 받는다.
  • 해당 IP 주소로 HTTP(HyperText Transfer Protocol) 요청이 전달 된다.
  • 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다.
  • HTTP 프로토콜을 통해서 반환될 응답 데이터의 포맷으로 보통 JSON(JavaScript Object Notation)이 간결함 덕에 널리 사용된다.

데이터베이스

사용자가 늘어나면서 웹/모바일 트래픽 처리 용도와 데이터베이스 용도로 서버를 분리하면 각각을 독립적으로 확장해 갈 수 있다.

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

  1. 전통적인 관계형 데이터베이스(Relational Database Management System, RDBMS)

자료를 테이블과 열, 칼럼으로 표현하며, SQL을 사용하면 여러 테이블에 있는 데이터를 그 관계에 따라 조인(join)하여 합칠 수 있다.


  1. 비-관계형 데이터베이스(NoSQL, Key-value Database)

일반적으로 비-관계형 데이터베이스는 조인(join) 연산은 지원하지 않는다.
NoSQL은 다시 네 부류로 나눌 수 있다.

  • 키-값 저장소(key-value store)
  • 그래프 저장소(graph store)
  • 칼럼 저장소(column store)
  • 문서 저장소(document store)

< 비-관계형 데이터베이스를 선택하는 경우 >

  • 아주 낮은 응답 지연시간(latency)이 요구됨
  • 다루는 데이터가 비정형(unstructured)이라 관계형 데이터가 아님
  • 데이터(JSON, YAML, XML 등)를 직렬화하거나(serialize) 역질렬화(deserialize)할 수 있기만 하면 됨
  • 아주 많은 양의 데이터를 저장할 필요가 있음

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

  • 수직적 규모 확장(vertical scaling)
    - Scale up 이라고 부르는 프로세스
    • 서버에 고사양 자원(더 좋은 CPU, 더 많은 RAM 등)을 추가하는 행위를 말한다.
    • 트래픽의 양이 적을 때 선택
    • 가장 큰 장점은 단순함
    • 수직적 규모 확장에는 한계가 있다는 단점이 있다. 한 대의 서버에 CPU나 메모리를 무한대로 증설할 방법이 없기 때문이다.
    • 장애에 대한 자동복구(failover)방안이나 다중화(redundancy)방안을 제시하지 않는다. 이로 인해서 서버에 장애가 발생하면 웹 사이트/앱 은 완전히 중단된다.
  • 수평적 규모 확장(horizontal scaling)
    - Scale out 이라고 부르는 프로세스로 더 많은 서버를 추가하여 성능을 개선하는 행위를 말한다.
    • 자동복구 또는 다중화 방안이 있어서 대규모 애플리케이션을 지원하는 데 적절하다.

웹 서버가 다운되어 사용자가 웹 사이트에 접속할 수 없거나,
너무 많은 사용자가 접속하여 웹 서버가 한계에 도달하게 외더 응답 속도가 느려지거나 서버 접속이 불가능 할 때.

이런 문제를 해결하는 데는 부하 분산기 또는 로드밸런서(load balancer)를 도입하는 것이 최선이다.

로드밸런서

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

< 로드 밸런서 동작 시나리오 >
사용자는 로드밸런서의 공개 IP 주소(public IP address)로 접속한다.
웹 서버는 클라이언트의 접속을 직접 처리하지 않게 되고, 보안을 위해서 서버 간 통신에는 사설 IP 주소(private IP address)가 이용된다. 부하 분산 집합에 서버를 2개 설치하게 되면, 장애를 자동 복구하지 못하는 문제(no failover)가 해소되며, 웹 계층의 가용성(availability)가 향상된다.

사설 IP 주소란?
같은 네트워크에 속한 서버 사이의 통신에만 쓰일 수 있는 IP주소로, 인터넷을 통해서는 접속할 수 없다. 로드밸런서는 웹 서버와 통신하기 위해서 사설 IP 주소를 이용한다.

데이터베이스 다중화

보통 서버 사이에 주(Master)-부(Slave) 관계를 설정하고 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식이다.
쓰기 연산(Write operation)은 마스터에서만 지원하며 데이터베이스를 변경하는 명령어인 insert, delete, update 등은 마스터 디비로 전달되어야 한다. Slave DB는 Master DB로 부터 그 사본을 전달 받아 읽기 연산(Read operation)만을 지원한다.
읽기 연산의 비중이 쓰기 연산보다 훨씬 높다. 그래서 slave DB의 수가 master DB의 수보다 많다.

데이터베이스 다중화 이점

  • 더 나은

0개의 댓글