•
키 값 저장소는 키-값 데이터베이스라고도 불리는 비 관계형 데이터베이스다.
•
이 저장소는 고유 식별자를 키로 가지며, 키와 값 사이의 이런 연결 관계를 키-값 쌍이라고 지칭한다.
문제 이해 및 설계 범위 확정
•
읽기, 쓰기, 메모리 사용량 사이의 균형을 찾고 데이터 일관성과 가용성 사이에서 타협적 결정을 내린 설계다.
•
문제 이해
◦
키-값 쌍의 크기는 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만을 이용해 통신한다.
•
중재자는 클라이언트에게 키-값 저장소에 대한 프록시 역할을 하는 노드다.
•
노드는 안정 해시의 해시 링 위에 분포한다.
•
노드를 자동으로 추가 또는 삭제할 수 있도록, 시스템은 완전히 분산된다.
•
데이터는 여러 노드에 다중화된다.
•
모든 노드가 같은 책임을 지므로, 단일 실패 지점은 존재하지 않는다.
쓰기 경로
•
쓰기 요청이 특정 노드에 전달될 때, 발생하는 일이다.
◦
쓰기 요청이 커밋 로그 파일에 기록된다.
◦
데이터가 메모리 캐시에 기록된다.
◦
메모리 캐시가 가득차거나 사전에 정의된 임계치에 도달하면 데이터는 디스크에 기록된다.
읽기 경로
•
읽기 요청이 특정 노드에 전달될 때, 발생하는 일이다.
◦
읽기 요청을 받은 노드는 메모리 캐시에 있는지부터 살핀다.
◦
존재하는 경우, 데이터를 바로 반환하고 없는 경우, 디스크에서 가져온다.
요약
•
이번 장에서는 많은 개념과 기술을 다룬다.
•
아래는 분산 키-값 저장소가 가지는 기능과 그 기능 구현에 이용되는 기술이다.
목표/문제 | 기술 |
대규모 데이터 저장 | 안정 해시를 사용해 서버들에 부하 분산 |
읽기 연산에 대한 높은 가용성 보장 | 데이터를 여러 데이터센터에 다중화 |
쓰기 연산에 대한 높은 가용성 보장 | 버저닝 및 벡터 시계를 사용한 충돌 해소 |
데이터 파티션 | 안정 해시 |
점진적 규모 확장성 | 안정 해시 |
다양성 | 안정 해시 |
조절 가능한 데이터 일관성 | 정족수 합의 |
일시적 장애 처리 | 느슨한 정족수 프로토콜과 단서 후 임시 위탁 |
영구적 장애 처리 | 머클 트리 |
데이터 센터 장애 대응 | 여러 데이터 센터에 걸친 데이터 다중화 |