사용자 수에 따른 규모 확장성단일 서버사용자의 요청이 처리되는 과정웹 애플리케이션모바일 앱데이터베이스[어떤 데이터베이스를 사용할 것인가?]수직적 규모 확장 vs 수평적 규모 화장로드밸런서데이터베이스 다중화
수백만 사용자를 지원하는 시스템을 설계하는 것은 도전적인 과제이고 지속적인 계량과 끊없는 개선이 요구되는 여정이다.
사용자 수에 따른 규모 확장성
단일 서버
- 웹, 앱 데이터베이스, 캐시 등이 전부 서버 한대에서 실행되는 구조
사용자의 요청이 처리되는 과정
- 사용자는 도메인 이름(api.mysite.com)을 이용하여 웹사이트에 접속한다.
- 이 접속을 위해서는 도메인 이름을 도메인 이름 서비스에 질의하여 IP주소로 변환하는 과정이 필요함 DNS는 보통 제3 사업자가 제공하는 유료 서비스를 이용하게 되므로 우리 시스템의 일부는 아님
- DNS 조회 결과로 IP 주소가 반환되고 해당 주소로 HTTP 요청이 전달되고 3-way핸드셰이킹이 발생하하고
- 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다.
웹 애플리케이션
- 비즈니스 로직, 데이터 저장 등을 처리하기 위해서는 서버 구현용 언어를 사용하고 프레젠테이션용으로는 클라이언트 구현용 언어 HTML, 자바스크립트를 사용함
모바일 앱
- 모바일 앱과 웹 서버간 통신을 위해서는 HTTP 프로토콜을 이용한다. HTTP 프로토콜을 통해서 반환될 응답 데이터의 포맷으로는 보통 JSON이 그 간결함 덕에 널리 쓰이고 있음.
데이터베이스
- 사용자가 늘면 서버 하나로는 충분하지 않아서 여러 서버를 두어야 한다. 하나는 웹/모바일 트래픽 처리 용도고 다른 하나는 데이터베이스 용이다.
- 웹, 모바일 트래픽 처리 서버(웹계층)와 데이터베이스 서버(데이터계층)을 분리하면 각각을 독립적으로 확장해 나갈 수 있게 된다.
[어떤 데이터베이스를 사용할 것인가?]
- 전통적인 관계형 데이터베이스와 비-관계형 데이터베이스 사이에서 고를 수 있다.
- 관계형 데이터베이스는 RDBMS라고도 부르며 가장 유명한 것으로 MySQL, 오라클, PostgreSQL등이 있다. 관계형 데이터베이스는 자료를 테이블과 열, 컬럼으로 표현한다. SQL을 사용하면 여러 테이블에 있는 데이터를 관계에 따라 조인하여 합칠 수 있다.
- 비 관계형 데이터베이스는 NoSQL로 부른다. 대표적으로 DynamoDB, Cassandra, Mongo등이 있다. NoSQL은 네 분류로 나눌 수 있다. RDBMS와 차이로 조인을 지원하지 않는다.
- 키-값 저장소
- 그래프 저장소
- 컬럼 저장소
- 문서 저장소
- 대부분의 개발자에게는 관계형 데이터베이스가 최선일 것이지만, 40년 이상 시장에서 살아남아 잘 사용되어 온 시스템이기 때문이다. 하지만 우리가 구축하려는 시스템에 적합하지 않은 경우에는 관계형 데이터베이스 이외에 저장소도 살펴보아야 한다. 아래와 같은 경우에는 비-관계형 데이터베이스가 바람직한 선택일 수 있다.
- 아주 낮은 응답 지연시간(latency)이 요구됨
- 다루는 데이터가 비정형이라 관계형 데이터가 아닌 경우
- 데이터를 직렬화 하거나 역직렬화 할 수 있기만 하면 됨
- 아주 많은 양의 데이터를 저장할 필요가 있음
수직적 규모 확장 vs 수평적 규모 화장
- 스케일 업 이라고도 하는 수직적 규모 확장 프로세스는 서버에 고사양 자원을 추가하는 행위를 뜻한다.
- 스케일 아웃은 수평적 규모 확장 프로세스는 더 많은 서버를 추가하여 성능을 개선하는 행위를 뜻한다.
- 서버로 유입되는 트래픽의 양이 적을 때는 수직적 확장이 좋은 선택이며, 이 방법의 가장 큰 장점은 단순함이다. 하지만 심각한 단점이 존재한다.
- 수직적 규모 확장에는 결국 한계가 있다. 한 대의 서버에 CPU나 메모리를 무한대로 증설하는 방법은 없다.
- 수직적 규모 확장법은 장애에 대한 자동복구 방안이나 다중화 방안을 제시하지 않는다. 서버에 장애가 발생하면 웹사이트/앱은 완전히 중단되고 만다.
- 이러한 단점 때문에 대규모 애플리케이션을 지원하는 데는 수평적 규모 확장법이 보다 적절하다.
- 너무 많은 사용자가 접속하여 웹 서버가 한계 상황에 도달하게 되면 응답 속도가 느려지거나 서버 접속이 불가능해 질 수도 있다. 이 문제를 해결하기 위해 분산기 또는 로드밸런서를 도입하는 것이 최선이다.
로드밸런서
- 로드밸런서는 부하 분산 집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 한다.
- 사용자는 로드밸런서의 공개 IP주소로 접속한다. 따라서 웹 서버는 클라이언트의 접속을 직접 처리하지 않는다. 더 나은 보안을 위해 서버 간 통신에는 사설 IP가 이용된다.
- 사설 IP 주소는 같은 네트워크에 속한 서버 사이의 통신에서만 쓰일 수 있는 IP 주소로, 인터넷을 통해서는 바로 접속할 수 없다. 로드밸런서는 웹 서버와 통신하기 위해 이 사설 주소를 이용하게 된다.
데이터베이스 다중화
- 많은 데이터베이스 관리 시스템이 다중화를 지원한다고 위키피디아에 나와있다.