-
가상 면접 사례로 배우는 대규모 시스템 설계 기초Books/가상 면접 사례로 배우는 대규모 시스템 설계 기초 (1,2) 2024. 11. 4. 20:21반응형
Chapter 1장
사용자 수에 따른 규모 확장성
- 수백만 사용자를 지원하는 시스템을 설계하는 것은 도전적인 과제이며, 지속적인 개량과 끝없는 개선이 요구되는 여정
단일 서버
- 웹 앱, 데이터베이스, 캐시 등이 전부 서버 한 대에서 실행되는 시스템
사용자의 요청이 처리되는 과정
- 사용자는 도메인 이름(api.mysite.com)을 이용하여 웹사이트에 접속한다. 이 접속을 위해서는 도메인 이름을 도메인 이름 서비스(DNS)에 질의하여 IP주소로 변환하는 과정이 필요하다. DNS는 보통 제3 사업자 (third party)가 제공하는 유료 서비스를 이용하게 되므로, 우리 시스템의 일부는 아니다.
- DNS 조회 결과로 IP주소가 반환된다.
- 해당 IP주소로 HTTP(HyperText Transfer Protocol) 요청이 전달된다.
- 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다.
데이터베이스
- 사용자가 늘면 서버 하나로는 충분하지 않아서 여러 서버를 두어야 함
- 하나는 웹/모바일 트래픽 처리 용도이고, 다른 하나는 데이터베이스용
- 웹/모바일 트래픽 처리 서버(웹 계층)과 데이터베이스 서버를 분리하면 그 각각을 독립적으로 확장할 수 있음
어떤 데이터베이스를 사용할 것인가?
- 전통적인 관계형 데이터베이스와 비-관계형 데이터베이스 사이에서 고를 수 있음
- 관계형 데이터베이스는 자료를 테이블과 열, 칼럼으로 표현. SQL을 사용하면 여러 테이블에 있는 데이터를 그 관계에 따라 조인하여 합칠 수 있음
- NoSQL. 키-값 저장소, 그래프 저장소, 칼럼 저장소, 문서 저장소
- 이런 비-관계형 데이터베이스는 일반적으로 조인 연산은 지원하지 않음
비관게형 데이터베이스가 바람직한 경우
- 아주 낮은 응답 지연시간이 요구됨
- 다루는 데이터가 비정형이라 관계형 데이터가 아님
- 데이터(JSON, YAML, XML 등)를 직렬화하거나 역직렬화할 수 있기만 하면 됨
- 아주 많은 양의 데이터를 저장할 필요가 있음
수직적 규모 확장 vs 수평적 규모 확장
- 수직적 규모 확장: 스케일 업(scale up). 서버에 고사양 자원(더 좋은 CPU, 더 많은 RAM 등)을 추가하는 행위
- 수평적 규모 확장: 스케일 아웃(scale out). 더 많은 서버를 추가하여 성능을 개선하는 행위
무엇이 더 적절할까?
- 서버로 유입되는 트래픽의 양이 적을 때는 수직적 확장이 좋은 선택이며, 이 방법의 가장 큰 장점은 단순함잉다.
- 그러나 이 방법에는 몇 가지 심각한 단점이 있다.
- 수직적 규모 확장에는 한계가 있음. 한 대의 서버에 CPU나 메모리를 무한대로 증설할 방법은 없다.
- 수직적 규모 확장법은 장애에 대한 자동복구(failover) 방안이나 다중화 방안을 제시하지 않음
- 서버에 장애가 발생하면 웹사이트/앱은 완전히 중단됨
이런 단점 때문에 대규모 애플리케이션을 지원하는 데는 수평적 규모 확장법이 보다 적절하다.
로드밸런서
- 로드밸런서는 부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 함
로드밸런서 동작 과정
- 사용자는 로드밸런서의
공개 IP 주소(public IP address)
로 접속한다. 따라서 웹 서버는 클라이언트의 접속을 직접 처리하지 않는다. - 더 나은 보안을 위해 서버 간 통신에는
사설 IP 주소(private IP address)
가 이용된다. 사설 IP주소는 같은 네트워크에 속한 서버 사이의 통신에서만 쓰일 수 있는 IP 주소로 인터넷을 통해서는 접속할 수 없다. 로드밸런서는 웹 서버와 통신하기 위해 이 사설 주소를 이용한다. - 서버1이 다운되면 모든 트래픽은 서버2로 전송된다. 따라서 웹 사이트 전체가 다운되는 일이 방지된다. 부하를 나누기 위해 새로운 서버를 추가할 수도 있다.
- 웹 사이트로 유입되는 트래픽이 가파르게 증가하면 두 대의 서버로 트래픽을 감당할 수없는 시점이 오는데, 웹 서버 계층에 더 많은 서버를 추가하기만 하면 된다.
- 그러면 로드밸런서가 자동적으로 트래픽을 분산한다,.
데이터베이스 다중화
- 많은 데이터베이스 관리 시스템이 다중화를 지원
- 서버 사이에 주(master)-부(slave) 관계를 설정
- 데이터 원본은 주서버에, 사본은 부 서버에 저장하는 방식
- 쓰기 연산(write operation)은 마스터에서만 지원
- 부 데이터베이스는 주 데이터베이스로부터 그 사본을 전달받으며 읽기 연산만을 지원
- 대부분의 애플리케이션은 읽기 연산의 비중이 쓰기 연산보다 훨씬 높다 -> 따라서 통상 부 데이터베이스의 수가 주 데이터베이스의 수보다 많다.
- 데이터베이스를 다중화하면 다음과 같은 장점이 있다.
- 더 나은 성능: 모든 데이터 변경 연산은 주 데이터베이스 서버로만 전달되는 반면 읽기 연산은 부 데이터베이스 서버들로 분산됨. 병렬로 처리될 수 있는 질의 (query)의 수가 늘어나므로 성능이 좋아짐
- 안정성: 자연 재해 등의 이유로 데이터베이스 서버 가운데 일부가 파괴되어도 데이터는 보존됨
- 가용성: 데이터를 여러 지역에 복제해둠으로써, 하나의 데이터베이스 서버에 장애가 발생하더라도 다른 서버에 있는 데이터를 가져와 계속 서비스할 수 있음
캐시
- 값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소다.
캐시 계층
- 캐시 계층(cache tier)은 데이터가 잠시 보관되는 곳으로 데이터베이스보다 훨씬 빠름
- 만일 데이터가 캐시에 있으면 캐시에서 데이터를 읽음
- 데이터가 캐시에 없으면 데이터베이스에서 해당 데이터를 읽어 캐시에 씀
- 웹 서버에 데이터 반환
- 요청을 받은 웹 서버는 캐시에 응답이 저장되어 있는지를 봄
- 만일 저장되어 있다면 해당 데이터를 클라이언트에 반환
- 없는 경우에는 데이터베이스 질의를 통해 데이터를 찾아 캐시에 저장한 뒤 클라이언트에 반환
- 이러한 캐시 전략을 읽기 주도형 캐시 전략이라고 부름
캐시 사용 시 유의할 점
- 캐시를 사용할 때는 아래 사항들을 고려해야함
- 데이터 갱신은 자주 일어나지 않지만 참조는 빈번하게 일어나는 경우
- 캐시는 데이터를 휘발성 메모리에 두므로 영속적으로 보관할 데이터를 캐시에 두는 것은 바람직하지 않음
콘텐츠 전송 네트워크 (CDN)
- CDN은 정적 콘텐츠를 전송하는데 스이는 지리적으로 분산된 서버의 네트워크
- 이미지, 비디오, CSS, JavaScript 파일 등을 캐싱할 수 있음
- 어떤 사용자가 웹사이트를 방문하면 그 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달함
CDN 동작 설명
- 사용자 A가 이미지 URL을 이용해 image.png에 접근한다. URL의 도메인은 CDN 서비스 사업자가 제공한 것
- CDN 서버의 캐시에 해당 이미지가 없는 경우 서버는 원본 서버에 요청하여 파일을 가져옴. 원본 서버는 웹 서버일 수도 있고 아마존 S3 같은 온라인 저장소일 수도 있음
- 원본 서버가 파일을 CDN 서버에 반환한다. 응답의 HTTP 헤더에는 해당 파일이 얼마나 오래 캐시될 수 있을지를 설명하는 TTL(Time-To-Live)값이 들어있음
- CDN 서버는 파일을 캐시하고 사용자 A에게 반환한다. 이미지는 TTL에 명시된 시간이 끝날 때까지 캐시된다.
- 사용자 B가 같은 이미지에 대한 요청을 CDN 서버에 전송한다.
- 만료되지 않은 이미지에 대한 요청은 캐시를 통해 처리
CDN 사용 시 고려해야할 사항
- 비용
- 적절한 만료 시한 설정
- CDN 장애에 대한 대처 방안
- 콘텐츠 무효화 방안
반응형