////
Search
6️⃣

6장. 키-값 저장소 설계

키 값 저장소는 키-값 데이터베이스라고도 불리는 비 관계형 데이터베이스다.
이 저장소는 고유 식별자를 키로 가지며, 키와 값 사이의 이런 연결 관계를 키-값 쌍이라고 지칭한다.

문제 이해 및 설계 범위 확정

읽기, 쓰기, 메모리 사용량 사이의 균형을 찾고 데이터 일관성과 가용성 사이에서 타협적 결정을 내린 설계다.
문제 이해
키-값 쌍의 크기는 10KB 이하
큰 데이터를 저장할 수 있어야 함
높은 가용성을 제공, 설사 장애가 있더라도 빨리 응답
높은 규모 확장성을 제공, 트래픽 양에 따라 자동적으로 서버 증설/삭제
데이터 일관성 수준은 조정이 가능해야 함
응답 지연시간이 짧아야 함

단일 서버 키-값 저장소

가장 먼저, 키-값 쌍 전부를 메모리에 해시 테이블 형태로 저장하는 단일 서버를 생각해볼 수 있다.
빠른 속도를 보장하나 많은 데이터를 메모리 안에 두는 것이 불가능할 수 있다.
데이터 압축, 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 두는 방법으로 해결 가능하나, 한계가 존재한다.

분산 키-값 저장소

분산 해시 테이블이라고도 불리기도 하는데, 키-값 쌍을 여러 서버에 분산시키며 저장하기 때문이다.
분산 시스템을 설계할 때는 CAP 정리를 이해하고 있어야 한다.

CAP 정리

CAP 정리는 데이터 일관성(Consistency), 가용성(Availability), 파티션 관용(Partition Tolerance)라는 세 가지 요구사항을 동시에 모두 만족하는 분산 시스템은 설계할 수 없다는 정리다.
데이터 일관성 : 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속하든 언제나 같은 데이터를 보아야 한다.
가용성 : 분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생하더라도 항상 응답을 받을 수 있어야 한다.
파티션 관용 : 파티션은 두 노드 사이에 통신 장애가 발생하였음을 의미함, 네트워크에 파티션이 생기더라도 시스템은 계속 작동해야 한다.
분산 시스템은 앞서 제시한 세 가지 요구사항 가운데 어느 두 가지를 만족하느냐에 따라 3개로 분류되며, 각각의 분산 키-값 저장소는 다음의 특성을 가진다.
CP 시스템 : 일관성과 파티션 감내를 지원하는 키-값 저장소
AP 시스템 : 가용성과 파티션 감내를 지원하는 키-값 저장소
CA 시스템 : 일관성과 가용성을 지원하는 키-값 저장소, 네트워크 장애는 피할 수 없는 일로, 반드시 파티션 문제를 감내할 수 있게 설계되어야 하므로 실세계에 존재하지 않는 시스템이다.
n1 - n2 - n3 세 개의 노드 중 하나의 노드에 장애가 생겼을 때
장애가 발생한 노드의 데이터들은 다른 노드로 공유되지 않아 각 노드들은 이전 버전의 데이터를 가지게 되어 일관성이 깨질 것이다.
CP 시스템 : 데이터 일관성을 유지하기 위해 나머지 2개의 노드에 대하여 쓰기 연산을 중단, 상황이 해결될 때까지 오류를 반환한다.
AP 시스템 : 낡은 데이터를 반환할 위험이 있더라도 계속 읽기 연산을 허용, 나머지 노드들도 쓰기 연산을 허용하며 파티션 문제가 해결된 뒤에 새 데이터를 장애 노드에 전송한다.
요구사항을 파악한 후, 적절한 질의를 통해, 제공해야하는 서비스가 가용성을 지켜야하는지, 일관성을 지켜야하는지, 파악한 후, 그에 적합한 설계를 하도록 하자.

시스템 컴포넌트

해당 절에서는 키-값 저장소 구현에 사용되는 핵심 컴포넌트들 및 기술들을 살펴본다.
데이터 파티션
데이터들을 각 분선 서버에 어떤 파티션 단위로 나누어 저장할 것인가에 대한 내용이다. 이때, 다음 두 문제를 중요하게 따져봐야 한다.
데이터를 여러 서버에 고르게 분산할 수 있는가
노드가 추가되거나 삭제될 때 데이터의 이동을 최소화할 수 있는가
안정 해시를 사용하면 문제를 해결할 수 있으며, 안정 해시를 이용해 데이터를 파티션하면 다음의 이점이 있다.
규모 확장 자동화 : 시스템 부하에 따라 서버가 자동으로 추가되거나 삭제되도록 만들 수 있다.
다양성 : 각 서버의 용량에 맞게 가상 노드의 수를 조정할 수 있다.
데이터 다중화
높은 가용성과 안정성을 확보하기 위해서 데이터를 N개 서버에 비동기적으로 다중화해야 한다.
같은 데이터 센터에 속해있는 노드는 정전, 네트워크 이슈, 자연재해 등의 문제를 동시에 겪을 가능성이 있으므로 데이터의 사본을 다른 센터의 서버에 보관하고 센터들은 고속 네트워크로 연결해야 한다.
이 역시, 안정 해시 기법을 사용해 키 값을 기준으로 가장 먼저 만나게 되는 N 개의 서버 모두에 데이터를 저장한다.
N이 너무 작은 경우, 오류가 생겼을 때, 데이터를 못 가져올 수도 있지 않을까?
데이터 일관성
여러 노드에 다중화된 데이터는 일관성을 지키기 위해 동기화되어야 한다.
정족수 합의 프로토콜을 사용하여 읽기/쓰기 연산에 일관성을 보장할 수 있다.
N(사본 개수), W(쓰기 연산에 대한 정족수), R(읽기 연산에 대한 정족수)
중재자는 각 서버에 쓰기, 읽기 요청을 보내고, 각 요청별로 요청을 보내 성공한 수가 W, R의 카운트를 만족하는 경우, 성공으로 판단한다.
일관성 모델
데이터 일관성의 수준을 결정하는 요소 중 하나로 다양한 종류를 가진다.
강한 일관성 : 모든 읽기 연산은 가장 최근에 갱신된 결과를 반환해야 한다.
달성 방법 : 모든 사본에 현재 쓰기 연산의 결과가 반영될 때까지 해당 데이터에 대한 읽기/쓰기 연산을 금지한다.
약한 일관성 : 읽기 연산은 가장 최근에 갱신된 결과를 반환하지 못할 수 있다.
최종 일관성 : 약한 일관성의 한 형태로 갱신 결과가 결국에는 모든 사본에 반영한다.
비 일관성 해소 기법 : 데이터 버저닝 ⇒ HTTP Cache 방법인 ETag와 비슷하다.
장애 처리
장애 감지
두 대 이상의 서버가 똑같이 특정 서버의 장애를 보고했을 때, 해당 서버에 장애가 발생했다고 간주
멀티 캐스팅의 보고 체계를 구축하면 O(n^2)[n은 서버의 개수]의 비효율적인 장애 감지 솔루션이 됨
각 서버가 서로를 감시한다. ㄷㄷ
가십 프로토콜과 같은 분산형 장애 감지 솔루션을 채택하는 것이 효율적이다.
가십 프로토콜
각 노드는 멤버십 목록을 유지, 멤버십 목록은 각 멤버의 ID와 박동 카운터 쌍의 List 형태
각 노드는 주기적으로 박동 카운터를 증가
각 노드는 무작위로 선정된 노드들에게 주기적으로 자신의 박동 카운터를 보냄
박동 카운터 목록을 받은 노드는 멤버십 목록을 최신 값으로 갱신
어떤 멤버의 박동 카운터 값이 지정된 시간동안 갱신되지 않으면 해당 멤버는 장애 상태인것으로 간주
일시적 장애 처리
느슨한 정족수 접근법을 사용한다. 엄격한 정족수 접근법을 사용하는 경우, 읽기, 쓰기 연산을 금지해야 하기 때문이다.
정족수 요구사항을 강제하는 대신, 쓰기 연산을 수행할 W개의 건강한 서버와 읽기 연산을 수행할 R개의 건강한 서버를 해시 링에서 고른다.
장애 상태인 서버로 가는 요청은 다른 서버가 잠시 맡아 처리한다.
그동안 발생한 변경사항은 해당 장애 서버가 복귀되었을 때 일괄 반영하여 데이터 일관성을 보존한다.
영구적 장애 처리
반-엔트로피 프로토콜을 구현하여 사본들을 동기화한다.
반-엔트로피 프로토콜
사본들을 비교하여 최신 버전으로 갱신하는 과정을 포함한다.
사본 간의 일관성이 망가진 상태를 탐지하고 전송 데이터의 양을 줄이기 위해서는 머클 트리를 사용한다.
해시 트리라고도 불리는 머클 트리는 각 노드에 그 자식 노드들에 보관된 값의 해시값을 함께 저장한다.

시스템 아키텍처 다이어그램

클라이언트는 키-값 저장소가 제공하는 두 가지 단순한 API, get, put만을 이용해 통신한다.
중재자는 클라이언트에게 키-값 저장소에 대한 프록시 역할을 하는 노드다.
노드는 안정 해시의 해시 링 위에 분포한다.
노드를 자동으로 추가 또는 삭제할 수 있도록, 시스템은 완전히 분산된다.
데이터는 여러 노드에 다중화된다.
모든 노드가 같은 책임을 지므로, 단일 실패 지점은 존재하지 않는다.

쓰기 경로

쓰기 요청이 특정 노드에 전달될 때, 발생하는 일이다.
쓰기 요청이 커밋 로그 파일에 기록된다.
데이터가 메모리 캐시에 기록된다.
메모리 캐시가 가득차거나 사전에 정의된 임계치에 도달하면 데이터는 디스크에 기록된다.

읽기 경로

읽기 요청이 특정 노드에 전달될 때, 발생하는 일이다.
읽기 요청을 받은 노드는 메모리 캐시에 있는지부터 살핀다.
존재하는 경우, 데이터를 바로 반환하고 없는 경우, 디스크에서 가져온다.

요약

이번 장에서는 많은 개념과 기술을 다룬다.
아래는 분산 키-값 저장소가 가지는 기능과 그 기능 구현에 이용되는 기술이다.
목표/문제
기술
대규모 데이터 저장
안정 해시를 사용해 서버들에 부하 분산
읽기 연산에 대한 높은 가용성 보장
데이터를 여러 데이터센터에 다중화
쓰기 연산에 대한 높은 가용성 보장
버저닝 및 벡터 시계를 사용한 충돌 해소
데이터 파티션
안정 해시
점진적 규모 확장성
안정 해시
다양성
안정 해시
조절 가능한 데이터 일관성
정족수 합의
일시적 장애 처리
느슨한 정족수 프로토콜과 단서 후 임시 위탁
영구적 장애 처리
머클 트리
데이터 센터 장애 대응
여러 데이터 센터에 걸친 데이터 다중화