이 글은 책 「가상 면접 사례로 배우는 대규모 시스템 설계 기초」를 공부하고 정리한 글입니다.
키-값 저장소(key-value store)
는 키-값 데이터베이스라고도 불리는 비 관계형 데이터베이스이다. 이 저장소에 저장되는 값은 고유 식별자를 키로 가져야 한다. 키와 값 사이의 이런 연결 관계를 "키-값" 쌍(pair)이라고 지칭한다.
키-값 쌍에서의 키는 유일해야 하며 해당 키에 매달린 값은 키를 통해서만 접근할 수 있다. 키는 일반 텍스트일 수도 있고 해시 값일 수도 있다. 성능상의 이유로, 키는 짧을수록 좋다.
키-값 쌍에서의 값은 문자열일 수도 있고, 리스트일 수도 있고, 객체(object)일 수도 있다. 키-값 저장소는 보통 값으로 무엇이 오든 상관하지 않는다.
다음은 키 값 저장소에 보관된 데이터의 사례다.
키 | 값 |
---|---|
145 | john |
147 | bob |
160 | julia |
이번 장에서는 다음 연산을 지원하는 키-값 저장소를 설계해보도록 하겠다.
put(key, value)
: 키-값 쌍을 저장소에 저장한다.get(key)
: 인자로 주어진 키에 매달린 값을 꺼낸다.이번 장에서는 다음 특성을 갖는 키-값 저장소를 설계해 볼 것이다.
한 대 서버만 사용하는 키-값 저장소를 설계하는 것은 쉽다. 가장 직관적인 방법은 키-값 쌍 전부를 메모리에 해시 테이블로 저장하는 것이다. 그러나 이 접근법은 빠른 속도를 보장하지만 모든 데이터를 메모리 안에 두는 것이 불가능할 수도 있다는 한계가 있다. 이 문제를 해결하기 위한 개선책으로는 다음과 같은 것들이 있다.
그러나 이렇게 개선한다고 해도, 한 대 서버로 부족한 때가 곧 찾아온다. 그래서 많은 데이터를 저장하려면 분산 키-값 저장소(distributed key-value store)
를 만들 필요가 있다.
분산 키-값 저장소는 분산 해시 테이블이라고도 한다. 키-값 쌍을 여러 서버에 분산시키기 때문이다. 분산 시스템을 설계할 때는 CAP 정리(Consistency, Availability, Partition Tolerance theorem)
를 이해하고 있어야 한다.
데이터 일관성, 가용성, 파티션 감내라는 세 가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능하다는 정리
우선 각 요구사항의 의미부터 명확히 정리하고 넘어가자!
CAP 정리는 이들 가운데 어떤 두 가지를 충족하려면 나머지 하나는 반드시 희생되어야 한다는 것을 의미한다.
키-값 저장소는 앞서 제시한 세 가지 요구사항 가운데 어느 두 가지를 만족하느냐에 따라 다음과 같이 분류할 수 있다.
분산 시스템에서 데이터는 보통 여러 노드에 복제되어 보관된다. 세 대의 복제(replica) 노드 n1, n2, n3에 데이터를 복제하여 보관하는 상황을 가정해보자.