본제: 가상 면접 사례로 배우는 대규모 시스템 설계 기초
- 사용자 수에 따른 규모의 확장성을 위한 기본 개념
- 단일 서버: 모든 인프라 및 컴포넌트가 단일 서버에서 실행되는 규모
- 서버의 수직적 vs 수평적 규모 확장
- 수직적: 트래픽의 양이 적을 때는 좋은 선택
- 수평적: 서버를 여러 대 두어 트래픽을 분산하는 확장
- 기본적으로 로드밸런서를 이용하여 트래픽을 분산한다
- 데이터 베이스 규모 확장
- 수직적: 확장이 쉽지만 비용이 비싸고 SPOF가 될 가능성이 높다
- 수평적: 샤딩을 주로 이용하며 확장. 동기화 문제가 발생할 가능성이 높다
- 재 샤딩 문제: 하나의 샤드로 감당이 어려울 때 데이터를 재 배치하는 문제가 존재
- 핫 스팟 키 문제: 특정 샤드에 질의가 집중되어 샤딩의 효과를 제대로 볼 수 없는 문제
- 조인/비 정규화: 데이터 조인이 어렵기 때문에 정규화를 할 수 없는 데이터 발생 가능
- 캐시
- 값 비싼 연산 결과 또는 자주 참조되는 데이터를 메모리 안에 두어 빨리 처리될 수 있게하는 저장소
- 갱신은 자주 되지 않지만 자주 참조되는 데이터에 유용
- 무 상태 계층(stateless): 상태 정보를 영속성 저장소에 보관하고 서버에 저장하지 않는 웹 계층
- 효과적인 설계 면접 팁
- 개략적인 규모 추정은 올바른 절차를 밟느냐가 결과를 내는 것보다 중요하다
- 요구사항을 완전히 이해하기 전에는 답을 내놓지 마라
- 질문을 통해 많은 정보를 얻어야 한다
- 면접관과 소통을 위해 대화하며 설계를 진행하라
- 가장 중요한 컴포넌트부터 설명하고 나머지는 간략히 요약하라
- 시간 분배를 하라 → ex) 문제 이해: 10분/ 개략 설계: 10~15분/ 상세 설계: 10~25분/ 마무리 5분
- 처리율 제한 장치 설계
- 네트워크 시스템에서 클라이언트가 보내는 처리율을 제어하기 위한 장치
- DDos 공격 방지, 비용 절감, 서버 과부하 방지를 위해 사용된다
- 마이크로 서비스에서는 주로 API 게이트웨이에 구현된다
- 제한 알고리즘
- 토큰 버킷
- 통상적으로 API 엔드 포인트마다 별도로 버킷을 둔다
- 구현이 쉽고 버스트 트래픽에도 대응이 가능하다
- 구현
- 버킷에 사전 설정된 양의 토큰을 주기적으로 채운다 → 오버플로된 양은 버린다
- 요청이 들어오면 하나의 토큰을 사용하고 시스템에 전달한다 → 토큰이 없다면 요청은 버려진다
- 누출 버킷
- 요청 처리율이 고정된 알고리즘으로 큐를 사용한다
- 안정적 출력이 필요한 경우 효과적이나 버스트 트래픽 대응은 어렵다
- 구현
- 요청이 오면 큐에 요청을 추가하고 일정한 시간마다 큐에서 꺼내 처리한다
- 큐가 가득찬 경우 이후 도착한 요청은 버린다
- 고정 윈도 카운터
- 고정된 시간 간격으로 윈도우를 만들고 윈도우마다 최대 카운터를 붙이는 방식
- 구현/이해가 쉬우나 윈도우 경계에서 기대 한도치보다 더 많은 양이 처리될 수 있다
- 구현
- 요청이 도착하면 카운터를 1씩 증가시키고 시스템에 전달한다
- 해당 윈도우에서 요청이 초과되면 요청은 버려진다
- 이동 윈도 로깅
- 대량의 메모리를 사용하지만 고정 윈도 카운터의 문제인 경계선 문제를 방지하는 알고리즘
- 주로 레디스 정렬 집합을 이용하여 구현된다
- 구현
- 요청이 올 때마다 타임 스탬프를 하나씩 추가하는 로깅을 한다
- 허용치보다 적은 경우 시스템에 요청을 전달한다
- 허용치보다 많은 경우 요청을 버린다
- 새 요청이 들어 올 때 새 윈도우가 시작된다면 윈도우 시작 시각보다 적은 시각의 요청을 버린다
- 안정 해시 설계
- 요청/데이터를 서버에 균등하게 분배하기 위한 해시 키 설계 방식
- 해시 테이블의 크기가 조정되더라도 key / slot 개의 키만 재 배치하는 해시 기술
- 기존 해시 방식의 재배치 문제
- 일반적인 해시 분배 방식: server_number = hash(key) % server_count
- 1개의 서버만 장애가 나더라도 대부분의 키가 재분배되는 문제가 발생
- 기본 동작 방식
- 특정 링 위에 균등 분포 함수를 사용해 서버를 먼저 배치 한다
- 키를 균등 분포 함수를 이용해 배치 한다
- 키가 저장되는 서버는 오른쪽 방향으로 가장 가까운 서버로 지정한다
- 기본 동작 방식의 문제
- 파티션의 크기를 균등하게 유지하는 것이 어렵다 → 특정 서버에 몰림 현상이 발생한다
- 서버가 적은 경우 키의 균등 분포를 유지하는 것이 어렵다
- 문제점 해결
- 가상 노드: 실제 노드/서버를 가리키는 가상 노드로써 하나의 서버는 여러 개의 가상 노드를 가질 수 있다
- 이 가상 노드를 적절한 수만큼 늘려 균등 분포 함수가 더 균등 할 수 있도록 만든다
- 키-값 저장소 설계
- 고유 식별자를 키로 가지고 특정 값을 저장하는 저장소
- CAP 이론에 따라 필요한 두 가지를 선정하여 저장소를 설계한다
- CP: 가용성을 희생하고 일관성 및 파티션 감내(분단 허용성)를 얻는다 → 네트워크 장애 시 쓰기 불가
- AP: 일관성을 희생하고 파티션 감내(분단 허용성) 및 가용성을 얻는다 → 데이터 불일치 발생 가능
- 데이터 일관성
- 여러 노드의 다중화된 데이터가 적절히 동기화되는 정도를 뜻한다
- N: 사본 개수, W: 쓰기 연산이 성공하기 위한 정족수, R: 읽기 연산이 성공하기 위한 정족수
- R = 1, W = N: 빠른 읽기 연산 시스템
- R = N, W = 1: 빠른 쓰기 시스템. 주로 마스터-슬레이브 방식에서 이용된다
- W+R > N: 강한 일관성을 보장하는 시스템이지만 느리다
- W+R < N: 약한 일관성이나 성능을 높이기 위해 사용된다
- 비 일관성 문제을 해소하기 위해 데이터 버저닝 기법을 이용한다
- 장애 감지
- 장애 처리
- 분산 시스템을 위한 유니크 id 생성기 설계
- URL 단축기 설계
- 웹 크롤러 설계
- 알림 시스템 설계
- 뉴스 피드 시스템 설계
- 채팅 시스템 설계
- 검색어 자동 완성 시스템
- 유튜브 설계
- 구글 드라이브 설계
- 비 관계형 데이터베이스가 적합한 경우
- GeoDns: 사용자의 위치에 따라 도메인 이름을 어떤 ip로 변환할지 결정하는 DNS 서비스