https://product.kyobobook.co.kr/detail/S000001033116

 

가상 면접 사례로 배우는 대규모 시스템 설계 기초 | 알렉스 쉬 - 교보문고

가상 면접 사례로 배우는 대규모 시스템 설계 기초 | “페이스북의 뉴스 피드나 메신저,유튜브, 구글 드라이브 같은 대규모 시스템은 어떻게 설계할까?” IT 경력자라도 느닷없이 대규모 시스템

product.kyobobook.co.kr

1장 사용자 수에 따른 규모 확장성 : https://inhyeok-blog.tistory.com/40
2장 개략적인규모추정 : https://inhyeok-blog.tistory.com/41
3장 시스템 설계 면접 공략법 : https://inhyeok-blog.tistory.com/42
4장 처리율제한장치의설계 : https://inhyeok-blog.tistory.com/43
5장 안정해시설계 : https://inhyeok-blog.tistory.com/44
6장 키-값저장소설계 : https://inhyeok-blog.tistory.com/45
7장 분산시스템을위한유일 ID 생성기설계 : https://inhyeok-blog.tistory.com/46
8장 URL 단축기설계 : https://inhyeok-blog.tistory.com/47
9장 웹크롤러설계 : https://inhyeok-blog.tistory.com/48
10장알림시스템설계 : https://inhyeok-blog.tistory.com/49
11장뉴스피드시스템설계 : https://inhyeok-blog.tistory.com/50
12장채팅시스템설계 : https://inhyeok-blog.tistory.com/51
13장검색어자동완성시스템 : https://inhyeok-blog.tistory.com/52
14장유튜브설계 : https://inhyeok-blog.tistory.com/53
15장구글드라이브설계 : https://inhyeok-blog.tistory.com/54

 

이번장도 필자가 재밌게 읽었던 부분 중에 한 파트이다. 특히 5장과 연계되어서 설명되는 다양한 해결책들을 보고있으면 이마를 탁 치게 된다.

 

키-값 저장소에서는 키를 통해서만 값에 접근할 수 있다. 이때 키는 일반 텍스트일 수도 있고 해시 값일 수도 있다. 성능상의 이류로, 키는 짧을수록 좋다.

 

요구사항

- 키-값 쌍의 크기는 10KB 이하이다.

- 큰 데이터를 저장할 수 있어야 한다.

- 높은 가용성을 제공해야 한다. 따라서 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야 한다.

- 데이터 일관성 수준은 조정이 가능해야 한다.

- 응답 지연시간(latency)이 짧아야 한다.

 

단일 서버 키-값 저장소

이 방식은 아주 쉽다. 가장 직관적인 방식은 메모리에 해시 테이블로 키-값 쌍을 저장하는 것이다. 물론 이 방식은 빠르지만, 저장 공간이 부족할 수 있다. 이를 해결하기 위해서 데이터 압축과 자주 사용되지 않는 데이터는 디스크에 저장하는 방법이 있다. 하지만, 이렇게 개선한다고 해도 앞선 장에서 계속 그랬듯, 단일 서버로는 부족하다. 이제 분산 키-값 저장소를 설계하기 위한 기본 지식으로 CAP 정리를 확인해보자.

 

분산 키-값 저장소

분산시스템을 설계할 때는 CAP 정리를 이해해야한다.

CAP 정리는 일관성(Consistency), 가용성(Availability), 파티션 감내(Partition Tolerance)라는 세가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능 하다는 것이다. 따라서 목적에 따라 CA시스템, CP시스템, AP시스템 중에 하나를 선택해서 분산 시스템을 설계해야 한다.

 

일관성, 가용성, 파티션 감내의 의미가 어려워서 자세히 적어둔다.

- 일관성: 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했느냐에 관계없이 항상 같은 데이터를 보게 된다.

- 가용성: 분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생하더라도 항상 응답을 받을 수 있어야 한다.

- 파티션 감내: 파티션은 두 노드 사이에 통신 장애가 발생하였음을 의미한다. 파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속 동작해야 한다는 것을 뜻한다.

 

CA시스템은 파티션 감내가 절대 발생하지 않을 것이라는 아주아주 이상적인 상태를 의미한다.(실세계에선 네트워크 장애를 피할 수 없기 때문에 불가능 하다) 따라서 우린 파티션 문제가 발생하면 우린 일관성과 가용성 사이에서 옵션을 선택해야 한다. 일관성을 지키기 위해서는 CP 시스템을 선택하면 파티션 문제가 발생했을 때 모든 노드에서 쓰기 연산을 중지해야 할 것이다. 따라서 이 방식은 가용성이 깨지게 된다. 반면 AP 시스템은 파티션 문제로 낡은 데이터를 반환하는 한이 있더 계속해서 읽기 연산과 쓰기 연산을 허용한다. 그리고 파티션 문제가 해결 됐을 때 변경된 데이터의 정합성을 맞추는 것이다.

 

이제 설계하려는 시스템의 목적에 따라서 CP 또는 AP 시스템을 설계하면 된다. 

 

시스템 컴포넌트

이제 분산 키-값 저장소를 설계하기 위해 필요한 핵심 컴포넌트들 및 기술들에 대해서 살펴 볼 것이다.

 

1. 데이터 파티션

데이터를 여러 서버에 고르게 분산하기 위해서 5장에서 살펴본 안정 해시를 사용하다. 안정 해시를 사용하므로서 규모의 확장 자동화(시스템 부하에 따라 서버가 자동으로 추가되거나 삭제되는 것)와 다양성(가상 노드를 통해 고성능 서버는 더 많은 가상 노드를 가지게 해서 각 서버에 맞게 데이터의 양을 조절할 수 있다)

 

2. 데이터 다중화

높은 가용성과 안정성을 확보하기 위해서 데이터를 여러 서버에 비동기적으로 다중화 할 필요가 있다. 이는 안정 해시에서 현재 노드 다음 순서에 있는 노드에 데이터를 복제하는 방식으로 달성할 수 있다.

 

3. 데이터 일관성

여러 노드에 다중화된 데이터는 적절히 동기화 되어야 한다. 이를 위해 정족수 합의(Quorum Consensus) 프로토콜을 사용할 수 있다. 정족수 합의 프로토콜의 각 설정값을 조정하는 것으로 응답 지연과 데이터 일관성 사이의 타협점을 찾을 수 있다.

 

4. 일관성 모델

일관성 모델은 키-값 저장소를 설계할 때 고려해야할 또 하나의 중요한 요소다. 일관성 모델은 3가지의 종류가 있는데, 이 개념은 자주 사용되는 개념으로, 이 글에서 간단히 언급하고 넘어가겠다.

- 강한 일관성 : 모든 읽기 연산은 가장 최근에 갱신된 결과를 반환한다.

- 약한 일관성 : 읽기 연산은 가장 최근에 갱신된 결과를 반환하지 못할 수 있다.

- 최종 일관성 : 약한 일관성의 한 형태로, 갱신 결과가 결국에는 모든 사본에 반영되는 모델이다.

강한 일관성을 달성하기 위해서는 모든 사본에 현재 쓰기 연산이 동기화 될 때 까지 해당 데이터에 대한 읽기/쓰기를 금지하는 것이다. 이는 고가용성 시스템에는 적합하지 않다. 따라서 최종 일관성을 자주 사용한다.

 

최종 일관성 모델을 사용하는 경우 비 일관성 해소 방법으로 버저닝과 벡터 시계라는 기술이 있다. 

 

5. 장애 처리

장애 감지

어떤 서버가 죽었다는 사실을 알기 위해서는 모든 노드 사이에 멀티 캐스팅 채널을 구축해서 감지할 수 있다. 하지만 이 방법은 서버가 많으면 분명 비효율적이다. 따라서 가십 프로토콜(hossip protocol), 분산형 장애 감지(decentralized failure detection) 솔루션을 사용하는 것이 효과적이다.

 

일시적 장애 처리

네트워크나 서버 문제로 장애 상태인 서버로 가는 요청은 다른 서버가 잠시 맡아서 처리하고, 해당 서버가 복구 되었을 때 일관 반영하여 데이터 일관성을 보존한다. 이러한 방식을 임시 위탁 기법이라고 부른다.\

 

영구 장애 처리

영구적인 노드의 장애 상태를 처리하기 위해서는 반-엔트로피(anti-entropy)프로토콜을 구현하여 사본들을 동기화 할 것이다. 사본 간의 일관성이 망가진 상태를 탐지하고 전송 데이터의 양을 줄이기 위해서는 머클(Merkle)트리를 활용할 것이다.

 

데이터 센터 장애 처리

데이터 센터 장애에 대응할 수 있는 시스템을 만들기 위해 데이터 센터를 다중화해야한다

+ Recent posts