728x90
가상 면접 사례로 배우는 대규모 시스템 설계 기초 "사용자 수에 따른 규모 확장성"을 요약한 내용입니다.
이번 장에서는 한 명의 사용자를 지원하는 시스템에서 시작하여 최종적으로는 몇백만 사용자를 지원하는 시스템을 설계해볼 것이다.
규모 확장성와 관계된 설계 문제를 푸는 데 쓰일 유용한 지식들을 마스터할 수 있을 것이다.
단일 서버
- 모든 컴포넌트가 단 한대의 서버에서 실행되는 간단한 시스템부터 설계해 보자
- [그림 1-1] 웹, 앱, 데이터베이스, 캐시 등이 전부 서버 한 대에서 실행된다.
- 사용자 요청 처리 흐름부터 살펴보자 [그림 1-2]
- 사용자는 도메인 이름을 이용하여 웹사이트에 접속한다.
- DNS 조회 결과로 IP 주소가 반환된다.
- 해당 IP 주소로 HTTP 요청이 전달 된다.
- 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다
데이터베이스
- 사용자가 늘면 여러 서버를 두어야 한다.
- 하나는 웹/모바일 트래픽 처리 용도, 다른 하나는 데이터베이스용이다.
- 웹/모바일 트래픽 처리 서버(웹 계층), 데이터베이스 서버(데이터 계층)를 분리하면 각각 독립적으로 확장해 나갈 수 있게 된다.
어떤 데이터베이스를 사용할 것인가?
- 관계형 데이터베이스와 비-관계형 데이터베이스 사이에서 고를 수 있다.
- 관계형 데이터 베이스(RDBMS)
- 대표적으로 MySQL, 오라클, PostgreSQL 등이 있다
- 자료를 테이블과 열, 칼럼으로 표현
- SQL을 사용하면 여러 테이블에 있는 데이터를 관계에 따라 조인(JOIN)하여 합칠 수 있다.
- 비-관계형 데이터베이스(NoSQL)
- 대표적으로 CouchDB, Neo4J, Cassandra, HBase 등이 있다.
- NoSQL은 네 가지 부류로 나눌 수 있음
- 키-값 저장소
- 그래프 저장소
- 칼럼 저장소
- 문서 저장소
- 일반적으로 조인(JOIN)연산은 지원하지 않음
- 대부분의 개발자에게는 관계형 데이터베이스가 최선일 가능성이 높음
- 비-관계형 데이터 베이스가 바람직한 경우
- 아주 낮은 응답 지연시간이 요구됨
- 다루는 데이터가 비정형이라 관계형 테이터가 아님
- 데이터(JSON, YAML, XML등)를 직렬화하거나 역직렬화 할 수 있기만 하면 됨
- 아주 많은 양의 데이터를 저장할 필요가 있음
- 비-관계형 데이터 베이스가 바람직한 경우
수직적 규모 확장 vs 수평적 규모 확장
- 수직적 규모 확장 스케일 업(scale up) : 서버에 고사양 자원(CPU, RAM 등)을 추가하는 행위를 말한다.
- 서버로 유입된느 트래픽의 양이 적을 때는 수직적 확장이 좋은 선택
- 가장 큰 장점은 단순함
- 심각한 단점
- 수직적 규모 확장에는 한계가 있다.
- CPU나 메모리를 무한대로 증설항 방법이 없다.
- 장애에 대한 자동복구 방안이나 다중화 방안을 제시하지 않는다.
- 수직적 규모 확장에는 한계가 있다.
- 수평적 규모 확장 스케일 아웃(scale out) : 더 많은 서버를 추가하여 성능을 개선하는 행위를 말한다.
- 대규모 애플리케이션을 지원하는 데는 수평적 규모 확장법이 보다 적절
로드밸런서(Load Balancer)
- 로드밸런서는 부하 분산 집합(Load Balancing Set) 에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역활을 한다.
- [그림 1-4]는 로드밸런서가 어떻게 동작하는지 보여주고 있다.
- 사용자는 로드밸런서의 공개 IP주소로 접속
- 웹 서버는 클라이언트의 접속을 직접 처리하지 않는다.
- 서버 보안을 위해, 서버 간 통신에는 사설 IP 주소(Private IP Address)가 이용된다.
- 같은 네트워크에 속한 서버 사이의 통신에만 쓰일 수 있는 IP 주소
- 인터넷을 통해 접속 할 수 없다.
- 부하 분산 집합에 또 하나의 웹 서버를 추가하고 나면 장애를 복구하지 못하는 문제는 해소되며, 웹 계층의 가용성이 향상 된다.
- 서버 1이 다운되면 모든 트래픽은 서버 2로 전송된다.
- 부하를 나누기 위해 새로운 서버를 추가 할 수 있다.
- 트래픽이 가프르게 증가하면 두 대의 서버로 트래픽을 감당할 수 없는 시점이 올때 로드밸런서가 있으면 우하하게 대처할 수 있다.
- 사용자는 로드밸런서의 공개 IP주소로 접속
데이터베이스 다중화
- 많은 데이터베이스 관리 시스템이 다중화를 지원한다.
- 서버 사이에 주(Master)-부(Slave) 관계를 설정
- 데이터 원본은 주 서버에, 사본은 부 서버에 저장하는 방식
- 쓰기 연산은 주 서버에서만 지원, 부 서버는 주 서버로부터 사본을 전달 받아 읽기 연산만 지원
- 대부분은 읽기 연산 비중이 높아 부 서버 수가 주 서버수 보다 많다
- 데이터베이스를 다중화 하면 다음과 같은 이득이 있다.
- 더 나은 성능
- 주-부 다중화 모델에서 데이터 변경 연산과 읽기 연산이 분산이 된다.
- 병렬로 처리될 수 있는 질의(query) 의 수가 늘어나므로 성능이 좋아지낟.
- 안정성
- 자연 재해 등의 이유로 데이터베이스 서버 가운데 일부가 파괴되어도 데이터는 보존될 것이다.
- 데이터를 지역적으로 떨어진 여러 장소에 다중화 시켜놓을 수 있다.
- 가용성
- 데이터를 여러 지역에 복제해 둠으로써, 데이터 베이스 서버에 장애가 발생하더라도 다른 서버에서 데이터를 가져와 계속 서비스 할 수 있다.
- 더 나은 성능
- 데이터베이스 서버 가운데 하나가 다운되면 무슨 일이 벌어지는가?
- 부 서버가 한대 뿐인데 다운된 경우
- 일기 연산은 한시적으로 모두 주 데이터베이스로 전달됨
- 부 서버가 여러대인 경우
- 읽기 연산은 나머지 부 서버들로 분산
- 새로운 부 서버가 장애 서버를 대체
- 주 서버가 한대 뿐인데 다운된 경우
- 부 서버가 새로운 주 서버가 됨
- 모든 연산은 일시적으로 새로운 주 서버가 수행
- 프로던션 환경에서는 좀더 복잡
- 부 서버에 데이터가 최신 상태가 아닐 수 있음
- 없는 데이터는 복구 스트립트를 돌려 추가 해야함
- 다중 마스터, 원형 다중화 등 방식으로 해결하는데 도움 될 수 있음
- 부 서버가 한대 뿐인데 다운된 경우
- [그림 1-6] 로드밸런서와 데이터베이스 다중화를 고려한 설계안
- 사용자는 해당 IP주소를 사용해 로드밸런서에 접속
- HTTP 요청은 서버 1이나 서버2로 전달
- 웹 서버는 사용자의 데이터를 부 서버에서 읽는다.
- 웹 서버는 데이터 변경 연산은 주 서버로 전달한다. (데이터 추가, 삭제, 갱신 등의 연산)
캐시
- 값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소
- 애플리케이션의 성능은 데이터베이스를 얼마나 자주 호출하느냐에 크게 좌우되는데, 캐시는 그런 문제를 완화할 수 있다.
캐시 계층
- 캐시 계층은 데이터가 잠시 보관되는 곳으로 데이터베이스보다 훨씬 빠르다.
- 캐시 계층을 두면 서능이 개설될 뿐 아니라 데이터베이스의 부하를 줄일 수 있다.
- 캐시 계층의 규모를 독립적으로 확장시키는 것도 가능하다
캐시 사용 시 유의할 점
- 데이터 갱신은 자주 일어나지 않지만 참조는 비번하게 일어난다면 고려해볼 만하다
- 영속적으로 보관할 데이터를 캐시에 두는 것은 바람직하지 않다.
- 캐시 서버가 재시작되면 캐시 내의 모든 데이터는 사라진다.
- 중요 데이턴느 여전히 지속적 저장소에 두어야 한다.
- 만료된 데이터는 캐시에서 삭제되어야 한다.
- 만료 정책이 없으면 데이터는 캐시에 계속 남게 된다.
- 만료 기한이 너무 짧으면 데이터베이스를 너무 자주 읽게 됨으로 캐시 효과가 낮아진다.
- 너무 길면 원본과 차이가 날 가능성이 높아진다.
- 저장소의 원본을 갱신하는 연산과 캐시를 갱신하는 연산이 단일 트랜잭션으로 처리되지 않는 경우 일관성이 깨질 수 있다.
- 캐시 서버를 한 대만 두는 경우 해당 서버는 단일 장애 지점이 되어버릴 가능성이 있다.
- 여러 지역에 걸쳐 캐시 서버를 분산시켜야 한다.
- 캐시 메모리나 너무 작으면 데이터가 너무 자주 캐실에서 밀려나버려 캐시 성능이 떨어진다.
- 캐시 메모리가 과할당하는 것이 데이터가 갑자기 늘어났을 때 생길문제도 방지할 수 있다.
- 캐시가 꽉 차버리면 기존 데이터를 내보내야 한다.
- 널이 쓰이는 데이터 방출 정책
- LRU(Least Recently Used) - 마지막으로 사용된 시점이 가장 오래된 데이터를 삭제
- LFU(Least Frequently Used) - 사용 빈도가 가장 낮은 데이터를 삭제
- FIFO(First In First Out) - 가장 먼저 캐시에 들어온 데이터를 가장 먼저 삭제
- 널이 쓰이는 데이터 방출 정책
콘텐츠 전송 네트워크(CDN)
- CDN은 정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크
- 이미지, 비디오, CSS, JavaScript 파일 등을 캐시할 수 있다.
- 어떤 사용자가 웹사이트를 방문하면 가장 가까운 CDN 서버가 정적 콘텐츠를 전달하게 된다.
- 사용자가 CDN 서버로부터 멀면 멀수록 웹사이트는 천천히 로드 될 것이다.
- [그림 1-10]은 CDN이 어떻게 동작하는지 설명한다.
- 사용자 A가 이미지 URL을 이용해 image.png에 접근한다.
- URL의 도메인은 CDN 서비스 사업자가 제공
- CDN 서버의 캐시에 해당 이미지가 없는 경우, 서버는 원본(origin) 서버에 요청하여 파일을 가져온다.
- 원본 서버가 파일을 CDN 서버로 반환한다.
- 응답의 HTTP 헤더에 해당 파일이 얼마나 오래 캐시될 수 있는지를 설명하는 TTL(Time-ToLive)값이 들어 있다.
- CDN 서버는 파일을 캐시하고 사용자 A에게 반환한다.
- 이미지는 TTL에 명시된 시간이 끝날 때까지 캐시된다.
- 사용자 B가 같은 이미지에 대한 요청을 CDN 서버에 전송한다.
- 만료되지 않은 이미지에 대한 요청은 캐시를 통해 처리 된다.
- 사용자 A가 이미지 URL을 이용해 image.png에 접근한다.
CDN 사용 시 고려해야할 사항
- 비용
- CDN으로 들어가고 나가는 데이터 전송양에 따라 요금을 내게 된다.
- 자주 사용되지 않는 콘텐츠를 캐싱하는 것은 이득이 크지 않으므로 CDN에서 빼는 것을 로려하도록 하자
- 적절한 만료시한 설정
- 시의성이 중요한(Time-Sensitive) 콘텐츠의 경우 만료시점을 잘 정해야한다.
- CDN 장애에 대한 대처 방안
- CDN 자체가 죽었을 경우 어떻게 동작해야하는지 고려해야 한다.
- 해당 문제를 감지하고 원본 서버로 요청하는 부분을 고려해야 할 수도 있다.
- 콘텐츠 무효화 방법
- CDN 서비스 사업자가 제공하는 API를 이용하여 콘텐츠 무효화
- 콘텐츠의 다른 버전을 서비스하도록 오브젝트 버저닝 이용
- URL 마지막에 버전 번호를 인자로 주면 됨(ex: image.png?v=2)
무상태(stateless) 웹 계층
- 웹 계층은 수평적으로 확장하는 방법을 고민해 볼 수 있다.
- 상태 정보(사용자 세션 데이터와 같은)를 웹 계층에서 제거하여야 한다.
상태 정보 의존적인 아키텍처
- 사용자 A의 세션 정보다 프로파일 이미지 같은 상태 정보는 서버 1에 저장된다.
- 사용자 A를 인증하기 위해 HTTP 요청은 반드시 서버 1로 전송 되어야 한다.
- 사용자 A 요청이 서버 2로 전송되면 인증은 실패할 것이다.
같은 클라이언트 요청은 항상 같은 서버로 전송되어야 함, 대부분의 로드밸런서가 이를 지원하기 위해 고정 세션을 기능을 제공, 이는 로드밸런서에 부담을 준다
무상태 아키텍처
- 사용자로부터 요청은 어떤 웹서버로도 전달 될 수 있다.
- 웹 서버는 상태 정보가 필요한 경우 공유 저장소로부터 데이터를 가지고 온다.
- 상태 정보는 웹서버로 부터 물리적으로 분리되어 있다.
- 구조가 단순하고, 안정적이며, 확장이 쉽다.
데이터 센터
- 두개의 데이터 센터를 이용할 경우 장애가 없는 상황에서 사용자는 가장 가까운 데이터 센터로 안내 된다.
- 데이터 센터 중 하나에 심각한 장애가 발생하면 모든 트래픽은 장애가 없는 데이터 센터로 전송된다.
- 다중 데이터 센터 아키텍처를 만들려면 몇가지 기술적 난제를 해결해야 한다.
- 트래픽 우회
- 데이터 동기화
- 테스트와 배포
메세지 큐
- 메시지 큐는 메시지의 무손실을 보장하는 비동기 통신을 지원하는 컴포넌트
- 메시지의 버퍼 역활을 하며 비동기적으로 전송한다.
- 생산자(producer/publisher)가 메시지를 만들어 메시지 큐에 발행, 소비자(consumer/subscriber)가 메시지를 받아 동작을 수행
- 메시지 큐를 이용하면 서비스간 결합이 느슨해져서 규모 확장성이 보장되어야 하는 안정적인 애플리케이션을 구성하기 좋다
로그, 메트릭 그리고 자동화
- 소규모 웹 사이트를 만들 때는 로그나 메트릭, 자동화 같은 것을 하면 좋지만 꼭 할 필요는 없다.
- 규모가 커지고나면 필수적으로 투자해야함
- 로그
- 시스템의 오류와 문제들을 보다 쉽게 찾아낼 수도 있다
- 메트릭
- 시스템의 현재 상태를 손쉽게 파악할 수도 있다.
- 자동화
- 시스템이 크고 복잡해지면 생산성을 높이기 위해 자동화 도구를 활용해야 한다.
- 로그
728x90
'가상 면접 사례로 배우는 대규모 시스템 설계 기초' 카테고리의 다른 글
URL 단축기 설계 (0) | 2023.11.09 |
---|---|
분산 시스템을 위한 유일 ID 생성기 설계 (0) | 2023.11.09 |
키-값 저장소 설계 (0) | 2023.11.09 |
안정 해시 설계 (1) | 2023.11.09 |
처리율 제한 장치의 설계 (1) | 2023.11.09 |