////
Search

6장 - 키/값 저장소 설계

생성일
2024/07/08 15:38
태그
Interview

1. 개요

키-값 저장소는 비 관계형 데이터베이스다.
키-값 쌍에서의 키는 유일해야 하며 키에 매달린 값은 키를 통해서만 접근할 수 있다.
키는 일반 텍스트 혹은 해시 값일 수도 있다.
성능상의 이유로 키는 짧은수록 좋다.
값의 경우 텍스트, 리스트, 오브젝트일 수 있다.

2. 문제 이해 및 설계 범위 확정

키-값 쌍의 크기는 10KB 이하다.
큰 데이터를 저장할 수 있어야 한다.
높은 가용성을 제공해야 한다.
장애가 있더라도 빠르게 응답해야한다.
높은 규모 확장성을 제공해야 한다.
동적으로 서버의 증설/삭제가 이뤄져야 한다.
데이터 일관성 수준은 조정이 가능해야 한다.
응답 지연시간이 짧아야 한다.

3. 단일 서버 키-값 저장소

한 대 서버만 사용하는 키-값 저장소를 설계하는 것은 쉽다.
직관적인 방법은 키-값 쌍 전부를 메모리에 해시 테이블로 저장하는 것이다.
접근 속도는 빠르지만, 메모리안에 두는게 불안하다.
이 문제의 개선책
데이터 압축
자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크 저장

4. 분산 키-값 저장소

분산 시스템을 설계할 때는 CAP 정리를 이애하고 있어야 한다.

4.1. CAP정리

CAP 정리란?
Consistency(일관성)
분산 시스템에 접속하는 모든 클라이어트는 어떤 노드에 접속했느냐에 관계 없이 언제나 같은 정보를 보게 되어야 한다.
Availability(가용성)
분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생하더라도 응답을 받을 수 있어야한다.
Partition tolerance(파티션 감내)
파트션은 두 노드 사이에 통신 장애가 발생하였음을 의미한다.
파티션 감내는 네트워크에 파티션이 생기도라도 시스템은 계속 동작하여 한다.
이들 가운데 어떤 두 가지를 만족하면 하나는 희생되어야 한다.
그리고 어느 두 가지를 만족한 시스템을 다음과 같이 분류한다.
CP 시스템
AP 시스템
CA 시스템
분산시스템은 반드시 파티션 문제를 감내할 수 있도록 설계해야하기 때문에 실세계에서 CA시스템은 존재하지 않는다.

4.1.1. 이상적 상태

이상적 환경에서는 네트워크가 파티션 되는 상황은 절대로 일어나지 않는다.

4.1.2. 실세계의 분산 시스템

분산 시스템은 파티션 문제를 피할 수 없으며 우리는 일관성과 가용성 사이에 하나를 선택해야 한다.
n3에서 장애 발생시 n3에서 기록된 데이터가 n1, n2로 전달되지 않았다면 일관성이 깨지게된다.
일관성을 선택하면 n1, n2의 쓰기 연산을 중단시켜야 한다.
이 경우 당연히 가용성이 떨어진다.
가용성을 선택하면 낡은데이터를 반환할 위험이 있어도 쓰기 연산을 허용해야 한다.

4.2. 시스템 컴포넌트

키-값 저장소 구현에 사용될 핵심 컴포넌트들 및 기술들을 살표본다.
데이터 파티션
데이터 다중화
일관성
일관성 불일치 해소
장애 처리
시스템 아케텍처 다이어그램
쓰기 경로
읽기 경로

4.2.1. 데이터 파티션

대규모 어플리케이션에서 전체 데이터를 한 대 서버에 욱여넣는 것은 불가능하다.
가장 단순한 해결책은 데이터를 작은 파티션들로 분할한 다음 여러 대의 서버에 저장하는 것이다.
데이터를 파티션 단위로 나눌 때는 다음 두 가지 문제를 중요하게 살펴보아야 한다.
데이터를 여러 서버에 고르게 분산할 수 있는가
노드가 추가되거나 삭제될 때 데이터의 이동을 최소화 할 수 있는가
이전에 배운 안정 해시는 이런 문제를 푸는 데 적합한 기술이다.
안정 해시를 사용하여 데이터 파티션하면 얻을 수 있는 이점
규모 확장 자동화
시스템 부하에 따라 서버가 자동으로 추가되거나 삭제될 수 있다.
다양성
각 서버의 용량에 맞게 가상 노드의 수를 조정할 수 있다.
다시 말해, 고성능 서버는 더 많은 가상 노드를 갖도록 설정할 수 있다.

4.2.2. 데이터 다중화

높은 가용성과 안정성을 확보하기 위해서는 데이터를 N개 서버에 비동기적으로 다중화할 필요가 있다.
N개의 서버를 선정하는 방법
N개 서버를 선정하는 방법은 어떤 키를 해시 링 위에 배치
그 지점으로부터 시계 방향으로 링을 순회
만나는 첫 N개 서버에 데이터 사본을 보관하는 것이다.
가상 노드를 사용하면 선택한 N개의 노드가 대응될 실제 물리서버 개수가 N보다 작아질 수 있다.
이 문제를 피하기 위해서는 노드를 선택할 때 같은 물리서버를 중복으로 선택하지 않도록 해야 한다.

4.2.3. 데이터 일관성

여러 노드에 다중화된 데이터는 적절히 동기화 되어야 한다.
정족수 합의 프로토콜을 사용하면 읽기/쓰기 연산 모두에 일관성을 보장할 수 있다.
N=사본 개수
W=쓰기 연산에 대한 정족수. 쓰기 연산이 성공한 것으로 간주되려면 적어도 W개의 서버로부터 쓰기 연산이 성공했다는 응답을 받아야 한다.
R=읽기 연산에 대한 정족수. 읽기 연산이 성공한 것으로 간주되려면 적어도 R개의 서버로부터 응답을 받아야 한다.
W, R, N의 값을 정하는 것은 응답 지연과 데이터 일관성 사이의 타협점을찾는 전형적인 과정이다.
R=1, W=N : 빠른 읽기 연산에 최적화된 시스템
W=1, R=N : 빠른 쓰기 연산에 최적화된 시스템
W+R>N : 강한 일관성 보장
W+R<=N : 강한 일관성의 보장이 없다.
일관성 모델
비 일관성 해소 기법 : 데이터 버저닝
장애 감지
장애 처리