-
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 1장) 사용자 수에 따른 규모 확장성DESIGN PATTERN & ARCHITECTURE 2024. 10. 21. 22:35
단일 서버
- 모든 컴포넌트가 단 한대의 서버에서 실행됨
사용자의 요청 처리 흐름
- 사용자가 도메인 이름을 이용하여 웹 사이트에 접속
- 도메인 이름을 DNS에 질의하여 IP 주소로 변환
- 해당 IP 주소로 HTTP 요청 전달
- 요청 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답 반환
모바일 앱과 웹 서버간 통신을 위해서는 HTTP 프로토콜을 이용
응답으로 반환되는 데이터의 포맷으로는 보통 JSON을 사용
데이터베이스
사용자가 늘어남에 따라 트래픽을 감당하기 위해 여러 서버를 구성하게 됨
- 웹 / 모바일 트래픽 처리 용도
- 데이터 베이스 용
따로 구성함에 따라 독립적 확장이 가능해짐
데이터 베이스의 선택
- 관계형 데이터베이스 (RDBMS)
- 자료를 테이블과 열, 칼럼으로 표현
- SQL을 사용하여 여러 테이블에 있는 데이터를 관계에 따라 조인 가능
- 비관계형 데이터베이스 (NoSQL)
- 4가지 분류로 나뉨
- 키-값 저장소
- 그래프 저장수
- 칼럼 저장소
- 문서 저장소
- 조인 연산은 지원하지 않음
- 비 관계형 데이터 베이스의 선택이 필요한 케이스
- 아주 낮은 응답 지연 시간이 요구됨
- 다루는 데이터가 비정형으로 관계형 데이터가 아님
- 데이터를 직렬화하거나 역직렬화 하기만 하면 되는 상황
- 아주 많은 양의 데이터를 저장해야 하는 경우
- 4가지 분류로 나뉨
수직적 규모 확장 VS 수평적 규모 확장
- 수직적 규모 확장 ( = 스케일 업 )
- 서버에 고사양 자원을 추가
- 서버로 유입되는 트래픽의 양이 적을 때 좋은 선택 (자원이 필요한 상황)
- 단, 한대의 서버에 CPU나 메모리를 무한대로 증설할 수 없으며 장애에 대한 자동 복구 방안이나 다중화 방안이 제시되지 않음
- 장애 발생시 서버가 완전히 중단됨
- 수평적 규모 확장 ( = 스케일 아웃 )
- 더 많은 서버를 추가하여 성능 개선
- 대규모 애플리케이션을 지원하는 데에 적절
로드밸런서
- 부하 분산 집합에 속한 웹 서버들에게 트래픽 부하를 분산하는 역할
- 로드밸런서는 보안을 위해 서버간 통신시에는 같은 네트워크에 속한 서버 사이의 통신에만 사용될 수 있는 사설 IP 주소를 사용함
- 웹 서버를 추가하면 장애를 자동복구하지 못하는 문제를 해결하고 트래픽을 분산시켜 가용성을 향상 시킴
데이터베이스 다중화
- 서버 사이에 master - slave 관계를 설정하고 데이터 원본은 master, 사본은 slave에 저장하는 방식
- Master
- 쓰기연산 지원 (Create, Read, Update, Delete)
- Slave
- 읽기 연산만을 지원 (Read)
- Master로 부터 사본을 전달 받고 읽기 연산 만을 지원
- Master
- 읽기 연산은 병렬 처리로 성능이 좋아지고 분산된 데이터로 안정성이 증진되며 지역적으로 떨어진 여러 위치에 다중화 가능, 장애 상황에서도 서비스 제공 가능으로 가용성 증진
만약 데이터 베이스 서버중 한대가 다운된다면
- Slave 서버 다운의 경우
- 읽기 연산이 일시적으로 Master 서버에 전달
- 새로운 Slave 서버가 준비되면 장애 서버를 대체
- Master 서버 다운의 경우
- 다른 Slave 서버가 Master 서버가 됨
- 모든 데이터 베이스 연산은 일시적으로 새로운 Master 서버에서 수행됨
- 누락된 데이터는 복구 스크립트를 돌려 추가해야 함
- 다중 마스터나 원형 다중화 방식 도입시 대처가 가능해짐
응답 속도 개선
- 캐시나 CDN(정적 콘텐츠 전송 네트워크) 를 통해 가능
캐시
- 값비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두고 뒤이은 요청이 보다 빨리 처리될 수 있도록 하는 저장소
- 캐시 계층
- 데이터가 잠시 보관되는 곳
- 데이터 베이스보다 훨씬 빠름
- 성능 개선 및 데이터베이스 부하 감소
- 캐시 계층 규모 독립적 확장 가능
- 캐시할 데이터 종류, 크기, 액세스 패턴에 맞는 캐시 전략 선택 가능
- 주의할 점
- 데이터를 휘발성 메모리에 두므로, 영속적인 데이터를 캐시에 두면 안됨
- 만료기간을 통해서 만료된 데이터는 캐시에서 삭제되어야 함
- 캐시와 저장소간의 데이터 일관성을 챙겨야 함
- 캐시 서버가 한대라면 해당 서버는 단일 장애 지점 (SPOF)이 될 수 있음
- 여러지역에 걸쳐 캐시서버를 분산해야 함
- 캐시 메모리가 너무 작으면 eviction으로 인해 캐시의 성능이 떨어질 수 있음
- 캐시 메모리를 과할당 함으로서 막을 수 있음
- 경우에 맞게 데이터 방출 정책을 사용할 수 있음
CDN (콘텐츠 전송 네트워크)
- 정적 콘텐츠를 전송하는데 쓰이는 지리적으로 분산된 서버의 네트워크
- 동적 콘텐츠 캐싱은 별도의 공부 필요
- request path ,query string, cookie, request header 등의 정보에 기반하여 HTML 페이지를 캐시
- 웹사이트에 접근시 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달
- 사용 예시
- 사용자가 이미지 파일에 접근
- CDN 서버 캐시에 해당 이미지가 없는 경우 서버는 원본 서버에 요청하여 파일을 가져옴
- 원본 서버가 응답 HTTP 헤더에 해당 파일의 TTL을 포함하여 CDN 서버에 파일을 반환
- CDN 서버는 파일을 캐시 후 사용자에게 반환 (이미지는 TTL에 명시된 시간까지 캐시)
- 다른 사용자가 동일한 이미지 요청
- 만료되지 않은 이미지라면 캐시를 통해 응답
- 주의 사항
- CDN은 보통 제 3 사업자에 의해 운영 되며 CDN으로 들어가고 나가는 데이터 양에 따라 비용이 지불되므로, 자주 사용되는 데이터만 CDN에 보관하도록 해야함
- 시의성이 중요한 콘텐츠의 경우 만료 시한을 잘 설정해야 함
- CDN 자체가 죽었을 경우 문제를 감지하여 웹 / 앱에서 어떻게 동작하는지도 고려해야 함
- 만료되지 않은 콘텐츠라도 다음의 방법으로 콘텐츠 무효화 가능
- CDN 서비스 사업자가 제공하는 API를 활용
- 콘텐츠의 다른 버전을 서비스하도록 오브젝트 버저닝 이용
- URL의 마지막에 버전 번호를 인자로 전달
무상태(stateless) 웹 계층
- 수평적 확장을 위해서는 상태 정보를 웹 계층에서 제거해야 함
- 공유 상태 정보를 지속성 저장소에 보관하고 필요할 때 가져오도록 설정
- 상태정보에 의존적인 아키텍처의 경우 같은 클라이언트로부터의 요청이 항상 같은 서버로 전송되어야 하기 때문에 로드밸런서가 고정세션을 이용하여 한서버에게 트래픽을 전달해야함
- 로드밸런서에 부담
- 로드밸런서 뒷단에 서버를 추가하거나 제거하기도 까다로워짐
- 무상태 아키텍처
- 사용자의 HTTP 요청은 어떤 웹 서버로도 전달 가능
- 상태 정보가 필요한 경우 공유 저장소로부터 데이터를 조회
- 트래픽 양에 따른 수평적 규모 확장이 간편해짐
데이터 센터
- 지리적 라우팅 (geoDNS)
- 장애가 없는 상황에서 사용자는 가장 가까운 데이터 센터로 안내됨
- 사용자의 위치에 따라 도메인 이름을 어떤 IP 주소로 변환할 지 결정할 수 있도록하는 DNS 서비스
- 데이터 센터 중 하나에 심각한 장애 발생시 모든 트래픽은 장애가 없는 트래픽으로 전송
- 다중 데이터 센터 주의사항
- 트래픽 우회
- 올바른 데이터 센터로 트래픽을 보내는 효과적인 방법을 찾아야 함
- 데이터 동기화
- 데이터 센터마다 별도의 데이터베이스를 사용한다면, 장애가 자동으로 복구되어 트래픽이 다른 데이터 베이스로 우회된다고 해도 데이터가 유실될 수 있음
- 데이터를 여러 데이터 센터에 걸쳐 다중화 한다면 이를 해결할 수 있음
- 웹사이트 또는 애플리케이션을 여러 위치에서 테스트 해보는 것이 중요
- 자동화된 배포 도구 필요
- 데이터 센터마다 별도의 데이터베이스를 사용한다면, 장애가 자동으로 복구되어 트래픽이 다른 데이터 베이스로 우회된다고 해도 데이터가 유실될 수 있음
- 트래픽 우회
메세지 큐
- 무손실 비동기 지원 컴포넌트
- 메세지의 버퍼 역할을 하며 비동기적으로 전송
- publisher와 consumer / subscriber 로 연결됨
- 메세지 큐를 이용하면 서비스 / 서버간의 결합이 느슨해져 규모 확장성이 보장되어야 하는 안정적 애플리케이션 구성에 유리
- 생산자와 소비자는 각각의 프로세스가 다운되더라도 메세지 송수신이 가능
- 시간이 오래걸릴 수 있는 프로세스의 경우 비동기적으로 구현하면 편리함
로그 / 메트릭 / 자동화
- 로그
- 에러 로그를 모니터링 하는 것은 중요
- 로그를 단일 서비스로 모아주는 도구를 활용하면 더 편리하게 검색하고 조회 가능
- ex) 데이터 독
- 메트릭
- 사업 현황에 관한 유용한 정보를 얻거나 현재 상태를 손쉽게 파악 가능
- 메트릭 단위
- 호스트 단위 메트릭
- CPU, 메모리, 디스크 I/O에 관한 메트릭
- 통합 메트릭
- 데이터 베이스 계층의 성능, 캐시 계층의 성능 등
- 핵심 비즈니스 메트릭
- 일별 능동 사용자 (Daily Active User), 수익, 재방문 등
- 호스트 단위 메트릭
- 자동화
- 지속적 통합 (CI) 를 도와주는 도구, 빌드 테스트, 배포등의 절차 자동화 도구를 통해 개발 생산성 향상
데이터 베이스의 규모 확장
- 저장할 데이터가 많아지면 데이터 베이스에 대한 부하도 증가
- 수직적 확장
- 고성능 자원 (CPU, RAM, 디스크 등) 의 증설을 통한 scale up
- 데이터 베이스 서버 하드웨어에는 한계까 있어 CPU, RAM등을 무한 증설 불가
- SPOF로 인한 위험성이 큼
- 수평적 확장
- 샤딩 (sharding)
- 더 많은 서버를 추가함으로써 성능을 향상
- 대규모 데이터베이스를 샤드라고 부르는 작은 단위로 분할하는 기술
- 모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없음
- 해시 함수를 통해 데이터가 보관되는 샤드를 결정
- 샤딩키 (파티션 키) 전략
- 데이터가 어떻게 분산될 지 정하는 하나 이상의 칼럼으로 구성
- 샤딩키를 정할 떄는 데이터를 고르게 분할 할 수 있도록 하는게 가장 중요
- 주의 사항
- 데이터의 재샤딩
- 샤드 소진
- 데이터가 너무 많아져서 하나의 샤드로 감당이 어렵거나, 샤드간 데이터 분포가 균등하지 못해 특정 샤드에 할당된 공간 소모가 다른 샤드에 비해 빨리 진행되는 경우
- -> 샤드 키를 계산하는 함수를 변경하고 데이터를 재배치 해야 함
- ex) 안정 해시 기법
- 샤드 소진
- 유명 인사 (핫스팟 키)
- 특정 샤드에 질의가 집중되어 서버에 과부하가 걸리는 문제
- 조인과 비정규화
- 여러 샤드에 걸친 데이터를 조인하기 힘들어짐
- 데이터 베이스를 비정규화 하여 하나의 테이블에서 질의가 수행되도록 할 수 있음
- 여러 샤드에 걸친 데이터를 조인하기 힘들어짐
- 데이터의 재샤딩
- 샤딩 (sharding)
- 수직적 확장
백만 사용자, 그리고 그 이상
- 시스템 규모 확장을 위해 다음과 같은 기법 사용 가능
- 웹 계층을 무상태 계층으로
- 모든 계층을 다중화
- 가능한 많은 데이터를 캐시
- 여러 데이터 센터를 지원
- 정적 콘텐츠는 CDN을 통해 서비스
- 데이터 계층은 샤딩을 통해 규모 확장
- 각 계층은 독립적 서비스로 분할
- 시스템을 지속적으로 모니터링하고 자동화 도구를 활용
'DESIGN PATTERN & ARCHITECTURE' 카테고리의 다른 글
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 3장) 시스템 설계 면접 공략법 (1) 2024.10.21 가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 2장) 개략적인 규모 추정 (0) 2024.10.21 도메인 주도 개발 시작하기 CH.8 ~ CH.9 (1) 2024.07.03 도메인 주도 개발 시작하기 CH.6 ~ CH.7 (0) 2024.06.26 도메인 주도 개발 시작하기 CH.4 ~ CH.5 (0) 2024.06.19