반응형
단일 서버
- 모든 컴포넌트가 단 한대의 서버에서 실행
- 웹 앱, DB, 캐시 등이 전부 서버 한 대에서 실행됨
사용자 요청 처리 흐름
- 사용자가 도메인을 이용해 웹 사이트에 접속하면 IP 주소로 변환을 위해 DNS로 질의
- DNS 조회 결과로 반환된 IP 주소로 HTTP 요청이 전달됨
- 요청을 받은 웹 서버는 HTML 혹은 JSON 형태의 응답 반환
요청은 웹 앱과 모바일 앱 두가지 종류의 단말로부터 온다.
데이터베이스
- 사용자가 늘어나면 단일 서버로는 충분하지 않아 여러 서버를 두어야 함
- 웹/모바일 트래픽 처리 서버와 데이터베이스 서버를 분리
어떤 데이터베이스를 사용할 것인가?
관계형 데이터베이스
- RDBS(Relational Database Management System)
- ex) MySQL, 오라클 데이터베이스, PostgreSQL 등
- 자료를 테이블과 열, 칼럼으로 표현
- SQL을 사용하면 여러 테이블에 있는 데이터를 관계에 따라 Join 할 수 있음
비 관계형 데이터베이스
- NoSQL
- ex) CouchDB, Neo4j, Amazon DynamoDB 등
- 일반적으로 Join 연산을 지원하지 않음
- 네 분류로 나눌 수 있음
- 키-값 저장소(key-value store)
- 그래프 저장소(graph store)
- 칼럼 저장소(column store)
- 문서 저장소(document store)
비 관계형 데이터베이스가 적합한 경우
- 아주 낮은 지연시간(latency)이 요구됨
- 다루는 데이터가 비정형이라 관계형 데이터가 아님
- 데이터(JSON, YAML, XML 등)를 직렬화하거나 역직렬화 할 수 있기만 하면 됨
- 아주 많은 양의 데이터를 저장할 필요가 있음
수직적 규모 확장 vs 수평적 규모 확장
스케일 업
- 수직적 규모 확장
- 서버에 고사양 자원을 추가하는 행위
- 유입되는 트래픽의 양이 적을 때
장점
- 단순함
단점
- 한 대의 서버에 CPU나 메모리를 무한대로 증설할 방법은 없음
- 장애에 대한 자동복구(failover) 방안이나 다중화(redundancy) 방안을 제시하지 않음
- 장애가 발생하면 웹사이트/앱이 완전히 중단됨
스케일 아웃
- 수평적 규모 확장
- 더 많은 서버를 추가하여 성능을 개선
- 대규모 애플리케이션을 지원하는데 적절
로드밸런서
- 부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할
- 사용자는 로드밸런서의 공개 IP 주소로 접속하여 웹 서버가 클라이언트의 접속을 직접 처리하지 않음
- 보안을 위해 서버간 통신에서는 사설 IP 주소가 사용됨(로드밸런서는 웹 서버와 통신할 때 사설 IP 사용)
- 사설 IP : 같은 네트워크에 속한 서버 사이의 통신에만 쓰일 수 있는 IP 주소, 인터넷을 통해 접속할 수 없음
장애를 자동 복구하지 못하는 문제 해결
- 서버 1이 다운되면 모든 트래픽은 서버 2로 전송됨
- 따라서 전체가 다운되는 일 방지
웹 계층의 가용성 향상
- 서버를 늘릴 때 우아하게 대처 가능
- 웹 서버 계층에 더 많은 서버를 추가하기만 하면 됨
- 로드밸런서가 자동으로 트래픽 분산
데이터베이스 다중화
- 보통 서버 사이에 주(master)-부(slave) 관계를 설정
- 데이터 원본은 주 서버에, 사본은 부 서버에 저장
- 쓰기 연산은 마스터에서만 지원
- 슬레이브는 마스터로부터 사본을 전달 받고, 읽기 연산만을 지원
- 대부분의 애플리케이션은 읽기 연산의 비중이 쓰기 연산보다 훨씬 높아 통상 슬레이브의 수가 더 많음
더 나은 성능
- 모든 데이터 변경 연산은 마스터로만 전달되는 반면, 읽기 연산은 슬레이브 서버들로 분산됨
- 병렬로 처리될 수 있는 질의 수가 늘어나므로 성능이 좋아짐
안정성
- 데이터베이스 서버 가운데 일부가 파괴되어도 데이터는 보존될 수 있음
- 데이터를 지역적으로 떨어진 여러 장소에 다중화시켜 놓을 수 있기 때문
가용성
- 데이터를 여러 지역에 복제해 줌으로써, 하나의 데이터베이스 서버에 장애가 발생해도 다른 서버에 있는 데이터를 가져와 계속 서비스할 수 있음
시나리오
슬레이브가 한 대 뿐인데 다운됨
- 읽기 연산은 한시적으로 모두 마스터로 전달됨
- 또한 즉시 새로운 슬레이브가 장애 서버를 대체
슬레이브가 여러대일 때 하나가 다운됨
- 읽기 연산은 나머지 슬레이브로 분산되며, 새로운 슬레이브 서버가 장애 서버를 대체
마스터가 다운됨
- 한 대의 슬레이브만 있는 경우, 해당 슬레이브가 마스터가 됨
- 모든 데이터베이스 연산은 일시적으로 새로운 마스터에서 수행됨
- 그리고 새로운 슬레이브를 추가
- 프로덕션 환경이라면 사실 이것보다 더 복잡(슬레이브에 보관된 데이터가 최신이 아닐 수 있기 때문)
- 없는 데이터는 복구 스크립트를 돌려 추가해야 함
- 다중 마스터(multi-master)나 원형 다중화(circular replication) 방식을 도입하면 대처하는데 도움될 수 있음
캐시
- 응답 시간(latency)을 개선할 수 있음
- 값 비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고, 다음 요청이 보다 빨리 처리될 수 있도록 하는 저장소
- 애플리케이션의 성능은 데이터베이스를 얼마나 자주 호출하느냐에 크게 좌우됨 -> 캐시가 해결
- 대부분의 캐시 서버는 일반적으로 널리 쓰이는 프로그래밍 언어로 API 제공
캐시 계층
- 데이터가 잠시 보관되는 곳, 데이터베이스보다 훨씬 빠름
- 별도의 캐시 계틍을 두면 성능 개선 뿐만 아니라 데이터베이스의 부하 감소, 캐시 계층의 규모를 독립적으로 확장 가능
주도형 캐시 전략
- 웹 서버가 요청을 받으면 캐시에 응답이 저장되어 있는지 확인하고 없을 경우에만 데이터베이스 질의
- 이외에도 다양한 캐시 전략이 있지만, 캐시할 데이터 종류, 크기, 액세스 패턴에 맞는 캐시 전략 선택하면 됨
캐시 사용 시 유의할 점
- 어떤 상황에서 바람직?
- 갱신은 자주 일어나지 않으면서, 참조는 빈번하게 일어나는 경우
- 어떤 데이터를 캐시?
- 데이터를 휘발성 메모리에 두므로, 영속적으로 보관할 데이터를 캐시에 두는 것은 바람직하지 않음
- 중요한 데이터는 지속적 저장소에 두어야 함
- 캐시에 보관된 데이터는 어떻게 만료됨?
- 이에 대한 정책 마련하는 것이 좋음
- 만료된 데이터는 캐시에서 삭제되어야 함
- 만료기한이 너무 짧거나 길어도 곤란
- 일관성(consistency)은 어떻게 유지?
- 저장소 원본 갯이 연산과 캐시 갱신 연산이 단일 트랜잭션으로 처리되지 않는 경우 일관성은 깨질 수 있음
- 여러 지역에 걸쳐 시스템을 확장해 나가는 경우 캐시와 저장소 사이의 일관성을 유지하는 것은 어려운 문제
- 장애에는 어떻게 대처?
- 캐시 서버를 한 대만 두는 경우 해당 서버는 당일 장애 지점이 되어버릴 가능성 있음
- 여러 지역에 걸쳐 캐시 서버를 분산시켜야 함
- 단일 장애 지점?
- Single Point of Failure, SPOF
- 어떤 특정 지점에서의 장애가 전체 시스템의 동작을 중단시켜버릴 수 있는 경우, 해당 지점을 단일 장애 지점이라고 부름
- 캐시 메모리는 얼마나 크게 잡을 것인가?
- 너무 작으면 액세스 패턴에 따라서는 데이터가 너무 자주 캐시에서 밀려나버려 캐시 성능이 떨어짐
- 캐시 메모리를 과할당(overprivision)해 보관된 데이터가 갑자기 늘어났을 때 생길 문제도 방지
- 데이터 방출(eviction) 정책은 무엇인가?
- 캐시가 꽉 차버린 상태에서 데이터를 넣는 경우 기존 데이터를 내보내는 정책
- 가장 널리 쓰이는 것은 LRU(Least Recently Used)
- 다른 정책으로는 LFU(Least Frequency Used), FIFO(First In First Out)
콘텐츠 전송 네트워크(CDN)
- 응답 시간을 개선할 수 있음
- 정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크
- 동적 콘텐츠 캐싱은 간단하게 말하면 요청 path, query string, cookie, header 등의 정보에 기반해 HTML 캐시
- 사용자가 웹사이트 방문하면 가장 가까운 CDN 서버가 정적 콘텐츠 전달
- 사용자가 CDN 서버로부터 멀면 멀수록 웹사이트는 천천히 로드됨
동작
- 사용자 A가 이미지 URL을 통해 접근. URL의 도메인은 CDN 서비스 사업자가 제공한 것
- CDN 서버의 캐시에 해당 이미지가 없는 경우, 서버는 원본 서버에 요청해 파일을 가져옴.
원본 서버는 웹서버일 수도 있고 S3같은 온라인 저장소일 수도 있음 - 원본 서버가 파일을 CDN 서버에 반환.
응답의 HTTP 헤더에는 해당 파일이 얼마나 오래 캐시될 수 있는지 설명하는 TTL 값이 들어있음 - CDN 서버는 파일을 캐시하고 사용자 A에게 반환. 이미지는 TTL에 명시된 시간인 끝날 때까지 캐시됨
- 사용자 B가 같은 이미지에 대한 요청을 CDN 서버에 전송
- 만료되지 않은 이미지에 대한 요청은 캐시를 통해 처리됨
고려해야 할 사항
비용
- CDN은 보통 제3 사업자에 의해 운영되며, 우리는 CDN으로 들어가고 나가는 데이터 전송 양에 따라 요금을 냄
- 자주 사용되지 않는 콘텐츠를 캐싱하는 것은 이득이 크지 않음으로 빼는 것을 고려
적절한 만료 시한 설정
- 시의성(time-sensitive)이 중요한 콘텐츠의 경우 만료 시점을 잘 정해야 함
- 너무 길면 신선도가 떨어지고, 너무 짧으면 원본 서버에 빈번히 접속해야 함
CDN 장애에 대한 대처 방안
- CDN 자체가 죽었을 경우 애플리케이션이 어떻게 동작해야하는지 고려해야함
- 일시적으로 CDN이 응답하지 않을 경우, 원본 서버로부터 직접 콘텐츠를 가져오도록 클라이언트를 구성하는 것이 필요할 수 있음
콘텐츠 무효화 방법
- CDN 서비스 사업자가 제공하는 API 이용해 콘텐츠 무효화
- 콘텐츠의 다른 버전을 서비스하도록 오브젝트 버저닝(object versioning) 이용
- 콘텐츠의 새로운 버전을 지정하기 위해서는 URL 마지막에 버전 번호를 인자로 주면 됨
무상태(stateless) 웹 계층
- 수평적으로 확장하는 방법을 고민해보자
- 이를 위해서 상태 정보(사용자 세션 데이터 같은)를 웹 계층에서 제거해야 함
상태 정보 의존적인 아키텍쳐
- 상태 정보를 보관하는 서버는 클라이언트 정보, 즉 상태를 유지하여 요청들 사이에 공유되도록 함
- 무상태 서버에는 이런 장치가 없음
- 같은 클라이언트로부터의 요청은 항상 같은 서버로 전송되어야 함
- 대부분의 로드밸런서가 이를 지원하기 위해 고정 세션(sticky session)이라는 기능을 제공
- 하지만 이는 로드밸런서에 부담되며 뒷단에 서버를 추가하거나 제거하기도 까다로워짐
- 서버의 장애를 처리하기도 복잡
무상태 아키텍처
- 사용자로부터의 요청은 어떤 웹서버로도 전달될 수 있음
- 웹 서버는 상태 정보가 필요할 경우 공유 저장소(shared storage)로부터 데이터를 가져옴
- 따라서 상태 정보는 웹서버로부터 물리적으로 분리되어 있음
- 단순, 안정, 규모 확장 쉬움
- 공유 저장소는 관계형 데이터베이스일 수도, 캐시 시스템일 수도, NoSQL일 수도 있음
- 자동 규모 확장은 트래픽 양에 따라 웹 서버를 자동으로 추가하거나 삭제하는 기능
- 상태정보가 웹 서버들로부터 제거되었으므로 트래픽 양에 따라 웹 서버를 넣거나 빼기만 하면 규모 확장 가능
데이터 센터
데이터 센터란 무엇일까요?
데이터 센터는 엔터프라이즈 컴퓨팅을 가능하게 하는 실제 시설이며, 여기에는 다음이 포함됩니다.
- 엔터프라이즈 컴퓨터 시스템.
- 컴퓨터 시스템이 인터넷이나 기타 비즈니스 네트워크에 지속적으로 연결되도록 보장하는 데 필요한 네트워킹 장비 및 관련 하드웨어.
- 데이터 센터 하드웨어를 보호하고 이의 구동 및 실행을 유지하는 전원 공급 장치와 서브시스템, 전기 스위치, 백업 발전기 및 환경 제어 장치(예: 에어콘 및 서버 냉각 장치).
출처 : https://www.ibm.com/kr-ko/cloud/learn/data-centers
- 가용성을 높이고 전 세계 어디서도 쾌적하게 사용할 수 있도록 함(데이터 센터를 여러개 둘 수 있음)
- 지리적 라우팅(geoDNS-routing, geo-routing)
- 장애가 없는 상황에서 사용자는 가장 가까운 데이터 센터로 안내됨
- 지리적 라우팅에서의 geoDNS는 사용자의 위치에 따라 도메인 이름을 어떤 IP 주소로 변환할지 결정할 수 있도록 해주는 DNS 서비스
- 데이터 센터 중 하나에 심각한 장애가 발생하면 모든 트래픽은 장애가 없는 데이터 센터로 전송됨
다중 데이터 센터 아키텍처를 위한 기술적 난제
트래픽 우회
- 올바른 데이터 센터로 트래픽을 보내는 효과적은 방법을 찾아야 함
- GeoDNS는 사용자에게서 가장 가까운 데이터 센터로 트래픽을 보낼 수 있도록 해줌
데이터 동기화
- 데이터 센터마다 별도의 데이터베이스를 사용하고 있는 상황이라면 장애가 자동으로 복구되어 트래픽이 다른 데이터베이스로 우회된다 해도, 해당 데이터 센터에는 찾는 데이터가 없을 수 있음
- 이런 상황을 막는 보편적 전략은 데이터를 여러 데이터 센터에 걸쳐 다중화하는 것
테스트와 배포
- 여러 데이터 센터를 사용하도록 시스템이 구성된 상황이라면 웹 사이트 또는 애플리케이션을 여러 위치에서 테스트 해보는 것이 중요
- 자동화된 배포 도구는 모든 데이터 센터에 동일한 서비스가 설치되도록 하는데 중요한 역할
메시지 큐
- 메시지의 무손실(durability, 메시지 큐에 일단 보관된 메시지는 소비자가 꺼낼 때까지 안전히 보관된다는 특성)을 보장하는, 비동기 통신(asynchronous communication)을 지원하는 컴포넌트
- 메시지의 버퍼 역할을 하며, 비동기적으로 전송
기본 아키텍쳐
- 생산자 또는 발행자(producer/publicher)라고 불리는 입력 서비스가 메시지를 만들어 메시지 큐에 발행(publish) 함
- 큐에는 보통 소비자 혹은 구독자(consumer/subscriber)라 불리는 서비스 혹은 서버가 연결되어 있음
- 메시지를 받아 그에 맞는 동작을 수행하는 역할을 함
- 서비스 또는 서버 간의 결합이 느슨해져, 규모 확장성이 보장되어야 하는 안정적 애플리케이션을 구성하기 좋음
- 생산자는 소비자 프로세스가 다운되어 있어도 메시지 발행 가능
- 소비자는 생산자 서비스가 가용한 상태가 아니더라도 메시지 수신할 수 있음
사용 예시
- 이미지의 cropping, sharpening, blurring 등을 지원하는 사진 보정 애플리케이션
- 보정은 시간이 오래 걸릴 수 있는 프로세스이므로 비동기적으로 처리
- 웹 서버는 사진 보정 작업을 메시지 큐에 넣음
- 사진 보정 작업 프로세스들은 이 작업을 메시지 큐에서 꺼내 비동기적으로 완료
- 이러면 생산자와 소비자 서비스의 규모는 각기 독립적으로 확장 가능
- 큐의 크기가 커지면 더 많은 처리기 프로세스를 추가해야 처리 시간 줄일 수 있음
- 하지만 큐가 거의 항상 빈 상태라면 처리기 프로세스의 수 줄일 수 있음
로그, 메트릭 그리고 자동화
로그
- 시스템의 오류와 문제들을 보다 쉽게 찾아낼 수 있도록 함
- 서버 단위로 모니터링 할 수도 있지만, 로그를 단일 서비스로 모아주는 도구를 활용하면 더 편리하게 검색하고 조회할 수 있음
메트릭
- 잘 수집하면 사업 현황에 관한 유용한 정보를 얻을 수 있음
- 시스템의 현재 상태를 손쉽게 파악할 수도 있음
호스트 단위 메트릭
- CPU, 메모리, 디스크 I/O에 관한 메트릭
종합(aggregated) 메트릭
- 데이터베이스 계층의 성능, 캐시 계층의 성능
핵심 비즈니스 메트릭
- 일별 능동 사용자(DAU), 수익, 재방문 같은 것
자동화
- 시스템이 크고 복잡해지면 생산성을 높이기 위해 자동화 도구를 활용해야 함
- 지속적 통합을 도와주는 도구를 활용하면 개발자가 만드는 코드가 어떤 검증 절차를 자동으로 거치도록 할 수 있어서 문제를 쉽게 감지
- 이외에도 빌드, 테스트, 배포 등의 절차를 자동화 할 수 있어 개발 생산성을 크게 향상시킬수 있음
- 메시지 큐는 각 컴포넌트가 보다 느슨히 결합될 수 있도록 하고, 결함에 대한 내성을 높임
- 로그, 모니터링, 메트릭, 자동화 등을 지원하기 위한 장치 추가
데이터베이스의 규모 확장
수직적 확장
- 스케일 업
- 기존 서버에 더 많은, 혹은 고성능의 자원(CPU, RAM, 디스크 등)을 증설하는 방법
약점
- 데이터베이스 서버 하드웨어에는 한계가 있으므로, CPU, RAM 등을 무한히 증설할 수는 없음
- SPOF(Single Point of Failure)로 인한 위험성이 큼
- 비용이 많이 듦
수평적 확장
- 샤딩(sharding)
- 서버 증설
- 더 많은 서버를 추가함으로써 성능을 향상시킬 수 있도록 함
샤딩(sharding)
- 대규모 데이터베이스를 샤드(shard)라고 부르는 작은 단위로 분할하는 기술
- 모든 샤드는 같은 스키마를 쓰지만, 샤드에 보관되는 데이터 사이에는 중복이 없음
- ex) 각 사용자 ID 에 따라 어느 샤드에 넣을지 정해짐(해시 함수 사용)
샤딩 키(sharding key)
- 가장 중요한 것은 샤딩 키를 어떻게 정하느냐
- 샤딩 키는 파티션 키라고도 부름
- 데이터가 어떻게 분산될지 정하는 하나 이상의 칼럼으로 구성됨
- 샤딩 키를 정할 때는 데이터를 고르게 분할할 수 있도록 하는 것이 가장 중요
샤딩의 문제점
데이터의 재 샤딩(resharding)
- 데이터가 너무 많아져 하나의 샤드로는 더 이상 감당하지 못할 때 필요
- 샤드 소진(shard exhausition)일 때 필요
- 샤드 간 데이터 분포가 균등하지 못해 어떤 샤드에 할당된 공간 소모가 다른 샤드에 비해 빨리 진행될 때
- 이 경우 샤드 키를 계산하는 함수를 변경하고 데이터를 재배치해야 함
- 안정 해시 기법을 활용해 해결할 수 있음
유명인사(celebrity) 문제
- 핫스팟 키 문제(hotspot key)
- 특정 샤드에 질의가 집중되어 서버에 과부하가 걸리는 문제
- 집중되는 데이터를 각각에 샤드 하나씩 할당하거나
- 심지어 더 잘게 쪼개야할지도
조인과 비정규화(join and de-nomalization)
- 하나의 데이터베이스를 여러 샤드 서버로 쪼개면, 여러 샤드에 걸친 데이터를 조인하기 힘듦
- 데이터를 비정규화하여 하나의 테이블에서 질의가 수행될 수 있도록 해야함
백만 사용자, 그리고 그 이상
- 시스템 규모 확장은 지속적이고 반복적인 과정
정리
- 웹 계층은 무상태 계층으로
- 모든 계층에 다중화 도입
- 가능한 한 많은 데이터를 캐시할 것
- 여러 데이터 센터를 지원할 것
- 정적 콘텐츠는 CDN을 통해 서비스할 것
- 데이터 계층은 샤딩을 통해 그 규모를 확장할 것
- 각 계층은 독립적 서비스로 분할할 것
- 시스템을 지속적으로 모니터링하고, 자동화 도구들을 활용할 것
반응형
'책책책 > 대규모 시스템 설계 기초' 카테고리의 다른 글
[대규모 시스템 설계 기초] 6장. 키-값 저장소 설계 (0) | 2021.12.22 |
---|---|
[대규모 시스템 설계 기초] 5장. 안정 해시 설계 (0) | 2021.12.18 |
[대규모 시스템 설계 기초] 4장. 처리율 제한 장치의 설계 (0) | 2021.12.17 |
[대규모 시스템 설계 기초] 3장. 시스템 설계 면접 공략법 (0) | 2021.12.14 |
[대규모 시스템 설계 기초] 2장. 개략적인 규모 추정 (0) | 2021.12.14 |