일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 티스토리챌린지
- 디자인교육
- 디자인강의
- 자바
- mysql
- Spring
- 국비지원교육
- Be
- 내일배움카드
- baekjoon
- 오픈챌린지
- 백엔드 부트캠프
- 국비지원
- 국비지원취업
- UXUI챌린지
- 내일배움캠프
- Java
- OPENPATH
- 패스트캠퍼스
- 오블완
- UXUI기초정복
- 객체지향
- 디자인챌린지
- UXUIPrimary
- KDT
- 백준
- 부트캠프
- 환급챌린지
- 백엔드개발자
- 오픈패스
- Today
- Total
군만두의 IT 공부 일지
[스터디9] 01. 사용자 수에 따른 규모 확장성 본문
목차
1장. 사용자 수에 따른 규모 확장성
단일 서버
웹/앱 데이터베이스 캐시 등이 전부 서버 한 대 내에서 실행된다.
사용자 요청 처리 흐름
- 사용자는 도메인 이름(api.mysite.com)을 이용하여 웹사이트에 접속한다. 이 접속을 위해서는 도메인 이름을 도메인 이름 서비스(Domain Name Service, DNS)에 질의하여 IP 주소로 변환하는 과정이 필요하다. DNS는 제3 사업자(third party)가 제공하는 유료 서비스를 이용하게 되므로, 우리 시스템의 일부는 아니다.
- DNS 조회 결과로 IP 주소가 반환된다. 예제에서는 그 주소(웹 서버의 주소)가 15.125.23.214로 한다.
- 해당 IP 주소로 HTTP(HyperText Transfer Protocol) 요청이 전달된다.
- 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다.
실제 요청 흐름
- 이 요청들은 두 가지 종류의 단말로부터 오는데, 하나는 웹 앱이고 다른 하나는 모바일 앱이다.
- 웹 애플리케이션: 비즈니스 로직, 데이터 저장 등을 처리하기 위해서는 서버 구현 언어(자바, 파이썬 등)를 사용하고, 프레젠테이션용으로는 클라이언트 구현 언어(HTML, 자바스크립트 등)를 사용한다.
- 모바일 앱: 모바일 앱과 웹 서버 간 통신을 위해서는 HTTP 프로토콜을 이용한다. HTTP 프로토콜을 통해서 반환될 응답 데이터의 포맷으로는 보통 JSON(JavaScript Object Notation)이 간편하여 널리 쓰인다.
데이터베이스
사용자가 늘면 서버 하나만으로는 충분하지 않아서 여러 서버를 두어야 한다.
- 하나는 웹/모바일 트래픽 처리 용도, 다른 하나는 데이터베이스용이다.
- 웹/모바일 트래픽 처리 서버(웹 계층)와 데이터베이스 서버(데이터 계층)를 분리하면 각각을 독립적으로 확장할 수 있다.
어떤 데이터베이스를 사용할 것인가?
전통적인 관계형 데이터베이스(relational database)와 비관계형 데이터베이스 사이에 고를 수 있다.
- 관계형 데이터베이스:
- 관계형 데이터베이스 관리 시스템(Relational Database Management System, RDBMS)이라고도 부른다.
- RDBMS 가운데 가장 유명한 것으로는 MySQL, 오라클 데이터베이스, PostgreSQL 등이 있다.
- 관계형 데이터베이스는 자료를 테이블과 열, 칼럼으로 표현하며 SQL을 사용하면 여러 테이블에 있는 데이터를 그 관계에 따라 조인(join)하여 합할 수 있다.
- 비관계형 데이터베이스: NoSQL이라고도 부른다.
- 대표적인 것으로는 CouchDB, Neo4j, Cassandra, HBase, Amazon DynamoDB 등이 있다.
- NoSQL은 다시 네 분류로 나눌 수 있는데, 키값 저장소(key-value store), 그래프 저장소(graph store), 칼럼 저장소(column store), 문서 저장소(document store)이다.
- 비관계형 데이터베이스는 일반적인 조인 연산을 지원하지 않는다.
- 아래와 같은 경우에는 비관계형 데이터베이스를 선택하는 것이 좋다.
- 아주 낮은 응답 지연 시간(latency)이 요구됨.
- 다른 데이터가 비정형(unstructured)이라 관계형 데이터가 아님.
- 데이터(JSON, YAML, XML 등)를 직렬화(serialize) 또는 역직렬화(deserialize)할 수 있기만 하면 됨.
- 아주 많은 양의 데이터를 저장할 필요가 있음.
수직적 규모 확장 vs 수평적 규모 확장
- 스케일 업(scale up)이라고도 하는 수직적 규모 확장(vertical scaling) 프로세스는 서버에 고사양 자원(더 좋은 CPU, 더 많은 RAM 등)을 추가하는 행위를 말한다.
- 수평적 규모 확장(scale out)이라고도 하는 수평적 규모 확장 프로세스는 더 많은 서버를 추가하여 성능을 개선하는 행위를 말한다.
- 수직적 확장의 장단점
- 장점: 서버로 유입되는 트래픽의 양이 적을 때 좋다. 단순하다.
- 단점: 한 대의 서버에 CPU나 메모리를 무한대로 증설할 방법이 없다. 장애에 대한 자동 복구(failover) 방식이나 다중화(redundancy) 방식을 제시하지 않는다. 서버에 장애가 발생하면 웹사이트/앱은 완전히 중단된다.
- 대규모 애플리케이션을 지원하는 데는 수평적 규모 확장이 더 적절하다.
- 로드밸런서: 부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 한다. 사용자는 로드밸런서의 공개 IP 주소(public IP address)로 접속한다. 따라서 웹 서버는 클라이언트의 접속을 직접 처리하지 않는다. 서버 간 통신에는 사설 IP 주소(private IP address)가 이용된다.
- 데이터베이스 다중화: 쓰기 연산은 마스터에서만 지원되고, 부 데이터베이스는 주 데이터베이스로부터 그 사본을 전달받으며, 읽기 연산만 지원한다. 데이터베이스를 변경하는 명령어들은 주 데이터베이스로만 전달되어야 한다.
- 더 나은 성능
- 안정성(reliability)
- 가용성(availability)
캐시
응답 시간은 캐시(cache)를 붙이고 콘텐츠 전송 네트워크(Content Delivery Network, CDN)를 도입하여 개선할 수 있다.
- 캐시: 값비싼 연산 결과 또는 자주 접근하는 데이터를 메모리에 두고, 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소
- 웹 페이지를 새로고침 할 때마다 표시할 데이터를 가져오기 위해 한 번 이상의 데이터베이스 호출이 발생한다. 애플리케이션의 성능이 데이터베이스를 얼마나 자주 호출하느냐에 따라 좌우되는 문제를 완화할 수 있다.
- 캐시 계층(cache tier): 데이터가 잠시 보관되는 곳으로 데이터베이스보다 훨씬 빠르다. 별도의 캐시 계층을 두면 성능이 개선될 뿐 아니라 데이터베이스의 부하를 줄일 수 있고, 캐시 계층의 규모를 독립적으로 확장시킬 수 있다.
- 캐시를 사용 시 고려할 점
- 캐시는 어떤 상황에 바람직한가?
- 어떤 데이터를 캐시에 두어야 하는가?
- 캐시에 보관된 데이터는 어떻게 만료(expire)되는가?
- 일관성(consistency)은 어떻게 유지되는가?
- 장애에는 어떻게 대처할 것인가?
- 캐시 메모리는 얼마나 크게 잡을 것인가?
- 데이터 방출(eviction) 정책은 무엇인가?
콘텐츠 전송 네트워크(CDN)
- CDN: 정적 콘텐츠를 전송하는 데 쓰이는 지리적으로 분산된 서버의 네트워크. 이미지, 비디오, CSS, JavaScript 파일 등을 캐시할 수 있다.
- 어떤 사용자가 웹사이트를 방문하면, 그 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달하게 된다. 사용자가 CDN 서버로부터 멀면 멀수록 웹사이트는 천천히 로드될 것이다.
- CDN 사용 시 고려할 점
- 비용
- 적절한 만료 시간 설정
- CDN 장애에 대한 대처 방안
- 콘텐츠 무효화(invalidation) 방법
- CDN 서비스 사업자가 제공하는 API를 이용하여 콘텐츠 무효화
- 콘텐츠의 다른 버전을 서비스하도록 오브젝트 버저닝(object versioning) 이용
무상태(stateless) 웹 계층
이제 웹 계층을 수평적으로 확장하기 위해서는 상태 정보(사용자 세션 데이터와 같은)를 웹 계층에서 제거하여야 한다. 상태 정보를 관계형 데이터베이스나 NoSQL 같은 지속성 저장소에 보관하고, 필요할 때 가져오도록 하는 것이다. 이렇게 구성된 웹 계층을 무상태 웹 계층이라 부른다.
- 상태 정보 의존적인 아키텍처: 상태 정보를 보관하는 서버는 클라이언트의 이전 정보나 상태를 유지하여 요청들 사이에 공유되도록 한다. 무상태 서버는 이런 장치가 없다. 클라이언트로부터의 요청은 항상 같은 서버로 전송되어야 한다는 문제가 있다.
- 무상태 아키텍처: 사용자로부터의 HTTP 요청은 어떤 웹 서버로도 전달될 수 있다. 웹 서버는 상태 정보가 필요할 경우 공유 저장소(shared storage)로부터 데이터를 가져온다. 따라서 상태 정보는 웹 서버로부터 물리적으로 분리되어 있어 구조가 단순하고, 안정적이며, 규모 확장이 쉽다.
데이터 센터
장애가 없는 상황에서 사용자는 가장 가까운 데이터 센터로 안내되는데, 이 전략을 지리적 라우팅(geoDNS-routing 또는 geo-routing)이라고 부른다. 지리적 라우팅에서의 geoDNS는 사용자의 위치에 따라 도메인 이름을 어떤 IP 주소로 변환할지 결정할 수 있도록 해 주는 DNS 서비스다.
- 다중 데이터 센터 아키텍처 설계 시 고려할 점
- 트래픽 우회
- 데이터 동기화(synchronization)
- 테스트와 배포(deployment)
시스템을 더 큰 규모로 확장하기 위해서는 시스템의 컴포넌트를 분리하여 독립적으로 확장될 수 있도록 한다. 메시지 큐(message queue)는 많은 실제 분산 시스템이 이 문제를 풀기 위해 사용하고 있는 핵심적 전략이다.
메시지 큐
- 메시지 큐: 메시지의 무손실(durability)을 보장하는 비동기 통신(asynchronous communication)을 지원하는 컴포넌트.
- 메시지의 버퍼 역할을 하며, 비동기적으로 전송한다.
- 메시지 큐의 기본 아키텍처는 간단하다. 생산자 또는 발행자(producer/publisher)라고 불리는 입력 서비스가 메시지를 만들어 메시지 큐에 발행(publish)한다. 큐에는 소비자 혹은 구독자(consumer/subscriber)라 불리는 서비스 혹은 서버가 연결되어 있는데, 메시지를 받아 그에 맞는 동작을 수행하는 역할을 한다.
- 메시지 큐를 이용하면 서비스 또는 서버 간 결합이 느슨해져서, 규모 확장이 보장되어야 하는 안정적 애플리케이션을 구성하기 좋다. 생산자는 소비자 프로세스가 다운되어 있어도 메시지를 발행할 수 있고, 소비자는 생산자 서버가 가용한 상태가 아니더라도 메시지를 수신할 수 있다.
로그, 메트릭 그리고 자동화
몇 개 서버에서 실행되는 소규모 웹 사이트를 만들 때는 로그나 메트릭(metric), 자동화(automation) 같은 것이 필요하지 않다. 하지만 사업 규모가 커지면, 이런 도구의 필요성은 급증한다.
- 로그: 여러 로그를 모니터링 하는 것은 중요하다. 시스템의 오류나 문제를 보다 쉽게 찾아낼 수 있도록 돕기 때문이다.
- 메트릭: 메트릭을 잘 수집하면 사업 현황에 대한 유용한 정보를 얻을 수도 있고, 시스템의 현재 상태를 손쉽게 파악할 수도 있다.
- 호스트 단위 메트릭: CPU, 메모리, 디스크 I/O에 관한 메트릭
- 통합(aggregated) 메트릭: 데이터베이스 계층의 성능, 캐시 계층의 성능
- 핵심 비즈니스 메트릭: 일별 능동 사용자(daily active user), 수익(rev-enue), 재방문(retention)
- 자동화: 시스템이 크고 복잡해지면 생산성을 높이기 위해 자동화 도구를 활용해야 한다. 가령 지속적 통합(continuous integration)을 도와주는 도구를 활용하면 개발자가 만드는 코드가 어떤 검증 절차를 자동으로 거치도록 할 수 있어서 문제 발생을 감지할 수 있다. 이 외에도 빌드, 테스트, 배포 등의 절차를 자동화할 수 있다.
데이터베이스의 규모 확장
저장할 데이터가 많아지면 데이터베이스에 대한 부하도 증가하는데, 데이터베이스를 증설할 방안을 찾아야 한다.
- 데이터베이스의 규모를 확장하는 방법
- 수직적 확장: 스케일 업이라고도 부르는 수직적 규모 확장법은 기존 서버에 더 많은, 또는 고사양의 자원(CPU, RAM, 디스크 등)을 증설하는 방법이다. 고성능 데이터베이스 서버는 많은 양의 데이터를 보관하고 처리할 수 있다.
- 단점:
- 데이터베이스 서버 하드웨어에는 한계가 있으므로 CPU, RAM 등을 무한 증설할 수는 없다.
- SPOF(Single Point of Failure)로 인한 위험성이 크다.
- 비용이 많이 든다.
- 단점:
- 수평적 확장: 데이터베이스의 수평적 확장은 샤딩(sharding)이라고도 부르는데, 더 많은 서버를 추가함으로써 성능을 향상시킬 수 있다. 샤딩은 대규모 데이터베이스를 샤드(shard)라고 부르는 작은 단위로 분할하는 기술을 일컫는다. 모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없다.
- 단점:
- 데이터의 재 샤딩(resharding)
- 유명 인사(celebrity) 문제
- 조인과 비정규화(join and de-normalization)
- 단점:
- 수직적 확장: 스케일 업이라고도 부르는 수직적 규모 확장법은 기존 서버에 더 많은, 또는 고사양의 자원(CPU, RAM, 디스크 등)을 증설하는 방법이다. 고성능 데이터베이스 서버는 많은 양의 데이터를 보관하고 처리할 수 있다.
백만 사용자, 그리고 그 이상
시스템의 규모를 확장하는 것은 지속적이고 반복적(iterative)인 과정이다. 시스템 규모 확장을 위해 살펴본 기법들을 정리하면 다음과 같다.
- 웹 계층은 무상태 계층으로
- 모든 계층에 다중화 도입
- 가능한 한 많은 데이터를 캐시할 것
- 여러 데이터 센터를 지원할 것
- 정적 콘텐츠는 CDN을 통해 서비스할 것
- 데이터 계층은 샤딩을 통해 그 규모를 확장할 것
- 각 계층은 독립적 서비스로 분할할 것
- 시스템을 지속적으로 모니터링하고, 자동화 도구들을 활용할 것
✔️ 복습하기
- 단일 서버로 운영 중인 서비스에서 갑자기 사용자가 급증하여 성능 이슈가 발생했을 때, 이를 어떻게 해결할 것인가?
- 서버 성능을 높이는 두 가지 방법(수직적 확장, 수평적 확장)은?
- 관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL)의 차이점은?
- 샤딩(Sharding)이란?
- 로드밸런서(Load Balancer)이란?
- 공용 IP 주소와 사설 IP 주소의 차이점은?
- 캐시(Cache)란?
- 콘텐츠 전송 네트워크(CDN)이란?
- 무상태(Stateless) 웹 계층이란?
- 메시지 큐(Message Queue)란?
이 글은 『 가상 면접 사례로 배우는 대규모 시스템 설계 기초』 책을 학습한 내용을 정리한 것입니다.
'프로그래밍' 카테고리의 다른 글
[스터디9] 04. 뉴스 피드 시스템 설계 - 실습2 (0) | 2025.07.08 |
---|---|
[스터디9] 03. 뉴스 피드 시스템 설계 - 실습1 (0) | 2025.06.27 |
[Java] 자바 개발환경 구축 (JDK, IntelliJ) (0) | 2024.02.14 |