키-값 저장소(key-value store)는 키-값 데이터베이스라고도 불리는 비 관계형(non-relational) 데이터베이스이다.
이 저장소에 저장되는 값은 고유 식별자(identifier) 를 키로 가져야 하며, 키와 값 사이의 이러한 연결 관계를 ‘키-값’ 쌍이라고 지칭한다. 키는 유일해야 하며, 해당 키에 매달린 값은 키를 통해서만 접근할 수 있다.

  • 키는 일반 텍스트일 수도 있고 해시 값일수도 있다. 성능상의 이유로 키는 짧을수록 좋다.
  • 값은 문자열일 수도 있고, 리스트, 객체 일수도 있다. 보통 값으로 무엇이 오든 상관하지 않는다.

아마존 DynamoDB, memcached, Redis 등이 키-값 저장소의 예다.

단일 서버 키-값 저장소

한 대의 서버만 사용하는 키-값 저장소를 설계하는 가장 직관적인 방법은, 키-값 쌍 전부를 메모리에 해시 테이블로 저장하는 것이다. 이 방법은 빠른 속도를 보장하고 있긴 하지만 모든 데이터를 메모리 안에 두는 것이 불가능할 수도 있다는 약점을 가지고 있다. 이에 대한 개선책으로는 아래와 같은 것이 있다.

  • 데이터 압축 (compression)
  • 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장

이러한 개선책으로도 단일 서버로는 부족해지는 상황이 온다. 많은 데이터를 저장하려면 분산 키-값 저장소(distributed key-value store) 를 만들 필요가 있다.

분산 키-값 저장소

키-값 쌍을 여러 서버에 분산시키기 때문에 분산 해시 테이블이라고도 불린다.

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

CAP 정리

CAP 정리는 데이터 일관성, 가용성, 파티션 감내 라는 세 가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능하다는 정리다. 세 요구사항 중 두 가지를 충족하려면 나머지 하나를 희생해야 하는 트레이드오프를 고려해야 한다.

CAP내용
C (Consistency, 데이터 일관성)분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했느냐에 관계 없이 언제나 같은 데이터를 보게 되어야 한다.
A (Availability, 가용성)분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생해도 항상 응답을 받을 수 있어야 한다.
P (Partition tolerance, 파티션 감내)파티션은 네트워크 상 노드 사이에 통신 장애가 발생하였음을 의미한다. 파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속 동작하여야 한다는 것을 뜻한다.

파티션 감내에서 등장하는 네트워크 파티션네트워크 장애로 인해 분산 시스템의 일부 노드들이 통신할 수 없는 상태가 되는 상황이다. 분산 시스템의 네트쿼크가 분리된 상태로 볼 수 있는데, 이 때문에 네트워크 통신 장애가 발생해 데이터 동기화나 요청 문제가 발생할 수 있다.

[예시 상황]
- 여러 서버(A, B, C, D)가 서로 통신하며 데이터를 동기화하고 있다고 가정
- 갑자기 네트워크 장애가 발생하여 서버 A와 B는 서로 통신할 수 있지만, 서버 C와 D는 다른 네트워크 섹션에 갇혀 A와 B와 통신하지 못하는 상황

A -- B
X   X (네트워크 장애)
C -- D

이 경우, A와 B는 서로 통신할 수 있지만, C와 D는 A, B와 분리된 네트워크 파티션에 속해 서로 통신할 수 없다.
즉, 네트워크가 둘로 분리된 상태이다.

세 요구사항 중 두 가지를 충족할 경우의 시스템 별 차이

  • CA 시스템
    • 일관성과 가용성을 만족하는 키-값 저장소. 파티션 감내는 지원하지 않지만 통상 네트워크 장애는 피할 수 없는 일로 여겨지기 때문에 분산 시스템은 반드시 파티션 문제를 감내할 수 있도록 설계되어야 한다. 사실상 실세계에서는 존재하지 않는 시스템으로 볼 수 있다.
  • CP 시스템
    • 일관성과 파티션 감내를 만족하는 키-값 저장소. 가용성을 희생한다.
      CP 시스템에서는 네트워크 장애가 발생할 경우 각 노드의 데이터 일관성을 보장하기 위해 장애 상황에서 몇 클라이언트의 통신이 제한될 수 있다. 금융 시스템이나 거래 시스템 등 데이터 무결성이 중요한 경우에 적합하다.
  • AP 시스템
    • 가용성과 파티션 감내를 만족하는 키-값 저장소. 일관성을 희생한다.
      네트워크 파티션 동안에도 모든 클라이언트 요청에 가능한 한 응답을 제공한다. 동기화 되지 않는 데이터를 반환하더라도 장애가 발생한 노드 외의 정상 상태의 노드는 계속 읽기 연산을 수행한다. 소셜 미디어나 검색 엔진처럼 서비스 연속성이 중요한 경우에 적합하다.
profile
끄적이는 개발자

0개의 댓글