Search
Duplicate
📒

[가상 면접 대규모 시스템] 05. 키-값 저장소 설계

상태
수정중
수업
가상 면접 사례로 배우는 대규모 시스템 설계
주제
기본개념
연관 노트
3 more properties
참고

키-값 저장소 설계

NOTE
키-값 저장소를 직접 설계해본다!
최종 아키텍쳐
요구사항에 따른 기술사용
키-값 쌍의 크기는 10kb 이하이다.
큰 데이터를 저장할 수 있어야 한다.
높은 가용성을 제공해야 한다. 따라서 시스템은 설사 장애가 있떠라도 빨리 응답해야 한다.
높은 규모 확장성을 제공해야 한다. 따라서 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야 한다.
데이터 일관성 수준은 조정이 가능해야 한다.
응답 지연시간(latency)이 짧아야 한다.

단일 키-값 저장소

NOTE
가장 직관적인 방법으로 key-value 쌍을 메모리에 해시테이블로 저장하는 것이다!
빠른 속도를 보장하긴 하지만, 모든 데이터를 한 메모리 안에 두는 것이 불가능할 수 있다.
이에 대한 개선책
데이터 압축(compression)
자주 쓰이는 데이터만 메모리에 두고, 나머지는 디스크에 저장하기.
하지만 단일 서버는 결국 한계가 있으므로, 분산 키-값 저장소를 설계해보자!

분산 키-값 저장소

CAP 정리

NOTE
3가지를 모두 만족시킬 수 없다. (2가지를 충족시키는것이 최선)
Consistency (일관성)
분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했느냐에 관계없이, 언제나 같은 데이터를 봐야한다.
Availability (가용성)
분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생해도, 항상 응답을 받을 수 있어야 한다.
Partition tolerance (분할 내구성)
파티션은 두 노드 사이에 통신 장애가 발생하였음을 의미한다.
파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속 동작하여야 한다는 의미이다.
분할된 네트워크 환경에서 동작하는 시스템에서 두 네트워크가 단절되거나 네트워크 데이터의 유실이 있어도 정상적으로 동작해야 함이라는 의미
3개의 서버중 하나의 서버에서 문제를 일으킨다.
CP 시스템
일관성과 파티션 감내를 지원하는 구조
서버간 데이터 불일치 위험이 있더라도 계속해서 읽기 연산을 허용한다.
가용성을 희생한다.
AP 시스템
가용성과 파티션 감내를 지원하는 구조
서버간 데이터 불일치 문제를 피하기 위해 나머지 서버에서도 쓰기 연산을 중단시킨다.
데이터 일관성을 희생한다.
CA 시스템
일관성과 가용성을 지원하는 구조
그러나 통상 네트워크 장애는 피할 수 없는 일로 여겨지므로, 분산 시스템은 반드시 파티션 문제를 감내할 수 있도록 설계해야 한다. ( 실제 설계상에서 거의 존재하지 않음 )

데이터 파티션

NOTE
대규모 애플리케이션의 데이터를 1대의 서버가 아닌, 파티션으로 분리해 여러 대의 서버로 저장하는 방식!
데이터를 파티션으로 나눌때 고려되는 문제를 안정 해시를 사용해서 해결할 수 있다.
데이터를 여러 서버에 고르게 분산할 수 있는가?
가상노드의 수를 조정해서 가능
노드가 추가되거나 삭제될 때 데이터의 이동을 최소화할 수 있는가?
안정 해시는 추가/삭제 단계에서 이동을 최소화할 수 있다.

데이터 다중화

NOTE
높은 가용성과 안정성을 위해 데이터를 N개의 서버에 비동기적으로 다중화해야 한다!
키의 시계 방향으로 링을 순회하면서 만나는 첫 N개의 서버에 데이터 사본을 저장!
가상 노드를 사용한다면 선택한 N개의 노드가 실제 물리 서버보다 작을 수 있다.
이 문제를 피하려면 노드를 선택할 때 같은 물리 서버를 중복 선택하지 않도록 해야 한다.

데이터 일관성 - 정족수 합의

NOTE
여러 노드에 다중화된 데이터는 적절한 동기화가 되어야 한다!
서버 3대가 동기화를 하는 과정
N
사본 개수
W
쓰기 연산에 대한 정족수
쓰기 연산이 성공한 것으로 간주되려면 적어도 W개의 서버로부터응답을 받아야 한다.
R
읽기 연산에 대한 정족수
읽기 연산이 성공한것으로 간주되려면 적어도 R개의 서버로부터 응답을 받아야 한다.
R = 1, W = N (빠른 읽기 연산에 최적화된 시스템)
W = 1, R = N (빠른 쓰기 연산에 최적화된 시스템)
W + R > N (강한 일관성이 보장된다)
W + R ≤ N (강한 일관성이 보장되지 않는다)

일관성 모델

NOTE
데이터의 일관성의 수준을 결정하는데 종류가 다양하다!
강한 일관성
모든 읽기 연산은 가장 최근에 갱신된 결과를 반환한다.
클라이언트는 절대 낡은 데이터를 보지 못한다.
약한 일관성
읽기 연산은 가장 최근에 갱신된 결과를 반환하지 못할 수 있다.
최종 일관성
약한 일관성에 속하며, 갱신 결과가 모든 사본에 반영이 되는 모델.

비 일관성 해소 기법 - 데이터 버저닝

NOTE
최종 일관성 모델을 따르는 경우 일관성이 깨질 수 있는데 이때 versioning, vector clock을 사용한다!
D3와 D4에 대해서 충돌을 해소해줘야 한다.
버저닝
데이터 변경마다 데이터의 새로운 버전을 만든다.
각 버전의 데이터는 불변하다.
벡터 시계
서버 1,2가 같은 키값에 대해 서로 다른 값을 가지고 있다면 어떻게 충돌을 피하는가?
벡터시계를 통해 어떤 버전이 선행,후행인지 판단해서 해결한다.
충돌에 대해서 감지할 수 만 있으며, 충돌 해소를 위해서는 다른 옵션이 추가되어야 한다.
버전 벡터 노드수가 늘어남에 따라 연산에 드는 비용이 늘어난다.