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 : 강한 일관성의 보장이 없다.
일관성 모델
비 일관성 해소 기법 : 데이터 버저닝
장애 감지
장애 처리