📗 개발자 책 읽기/가상 면접 사례로 배우는 대규모 시스템 설계 기초

[System Design Interview] 06. ⚙️ 키-값 저장소 (비 관계형 데이터베이스) 설계하기(1) - CAP 이론 정리

민돌v 2023. 1. 16. 09:53
가상 면접 사례로 배우는 대규모 시스템 설계 기초 (System Design Interview) - 저 : 알렉스 쉬, 역 : 이병준 을 읽고 정리한 글입니다.

 

6 장에서는 비 관계형 데이터베이스라 불리우는, 키-값 저장소에 대해서 이야기하면서 아래 조건에 해당되는 키-값 저장소를 분산 시스템에서의 조건으로 설계해봅니다.

1. 키-값 쌍의 크기는 10KB 이하이다.
2. 큰 데이터를 저장할 수 있어야 한다.
3. 높은 가용성을 제공해야 한다. 따라서 시스템은 설사 장애가 있더라도 빨리 응답해야한다.
4. 높은 규모 확장성을 제공해야한다. 따라서 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야 한다.
5. 데이터 일관성 수준은 조정이 가능해야 한다.
6. 응답 지연시간(latency)은 짧아야한다.

 

➡️ 6장은 내용이 길고 좋은 내용이 많아서 2개로 나누고자 합니다.

 

 

 

[목차]

  1. 키-값 저장소란
  2. 단일 서비스에서의 키-값 저장소 설계 및 한계점
  3. 분산 키-값 저장소 설계
  4. CAP 이란

 

 


📌 01. 키-값 저장소란

key-value store 는 키 값 데이터베스라고도 불리는 비관걔형 데이터베이스를 말합니다.

 

키-값 저장소에 저장도되는 값은 고유 식별자(identifier)를 키로 가져야합니다.

키와 값 사이의 이런 연결 관계를 "키-값" 쌍 (pair) 이라 표현합니다.

 

키-값 쌍에서의 키는 유일해야하며, 해당 키에 매달린 값은 키를 통해서만 접근할 수 있습니다.

키는 일반 텍스트일 수도 있으며, 해시 값일 수도 있습니다.

성능상의 이유로 키는 짧을 수록 좋습니다.

 

이러한 개념을가지고, 위에서 언급한 조건에 해당하는 비 관계형 데이터베이스 (키 - 값 저장소) 를 설계해 보겠습니다.


 

💡단일 서버에서의 키-값 저장소 설계

한 대의 서버만 사용하는 키-값 저장소를 설계하는 것은 굉장히 쉽다고 합니다.

 

가장 직관적인 방법은 키-값 쌍 전부를 메모리에 해시 테이블로 저장하는 것입니다.

이 접근법은 빠른 속도를 보장하긴 하지만 한계점이 존재합니다.

 

한계점

  • 모든 데이터를 메모리 안에 두는 것이 불가능할 수 도 있다.

개선책

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

 

→ 하지만 결국, 한 대 서버로 부족 한 때가 곧 찾아옵니다.

→ 많은 데이터를 저장하려면 "분산 키-값 저장소 (distributed key-value store)" 를 만들 필요가 있습니다.


 

💡분산 키-값 저장소

분산 키-값 저장소는, 키 -값 쌍을 여러 서버에 분산 시키기 때문에 "분산 해시 테이블" 이라고도 불립니다.

 

👏🏻 CAP

  • 분산 시스템을 설계할 때는 CAP 을 이해하고 있어야합니다.
  • 일관성 (consistency), 가용성 (availability), 파티션 감내 (Partition Tolerance theorem)

 

1. 데이터 일관성 (consistency) 

  • 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했는냐에 관계없이 언제나 같은 데이터를 보게 되어야 한다.

 

2. 가용성 (availability)

  • 분산 시스ㅔㅁ에 접속하는 클라리언트는 일부 노드에 장애가 발생하더라도 항상 응답을 받을 수 있어야 한다.

 

3. 파티션 감내 (Partition Tolerance theorem)

  • 파티션은 두 노드 사이에 통신 장애가 발생하였음을 의미한다.
  • 파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속 동작하여한다는 것을 의미한다. 

 

🙆🏼‍♂️ CAP 정리(CAP Theorem)는 아래 그림과 같이 이 3가지 가운데 2가지를 충족하려면 나머지 하나는 반드시 희생되어야 한다는 것을 의미합니다.

 

CAP 이란

키 값 저장소는 앞서 제시한 세 가지 요구사항 가운데 어느 두 가지를 만족하느냐에 따라 다음과 같이 분류할 수 있습니다.

  • CP 시스템 : 일관성과 파티션 감내를 지원하는 키 값 저장소. 가용성을 희생 한다.
  • AP 시스템 : 가용성과 파티션 감내를 지원하는 키 값 저장소. 데이터 일관성을 희생한다.
  • CA 시스템 : 일관성과 가용성을 지원하는 키 값 저장소. 파티션 감내는 지원하지 않는다. 
    • 그러나 통상 네트워크 장애는 피할 수 없는 일로 여겨지므로, 분산 시스템은 반드시 파티션 문제를 감내할 수 있도록 설계되어야 한다. 
    • 그러므로 실세계에 CA 시스템은 존재하지 않는다.

 

💡 CAP 예시

→ 예시 분산 서버 n1, n2, n3 가 있다고 할 때 하나의 서버(n3) 가 마비되었다고 가정한다면, n3의 최신데이터는 n1 과 n2 에 전달되지 못했고, n1 과 n2 의 쌓이는 데이터도 n3에 적재되지 못합니다.

  1. 이럴 떄 일관성을 지킬려면 - CP 시스템 : 데이터 불일치를 피하기 위해 n1 과 n2 서버에 대한 쓰기 연산을 중지시켜야합니다.
    • 이러면 일관성은 지킬 수 있지만, 서버에 대한 가용성을 포기하는 것 입니다.
    • 보통 은행서비스가 이러한 특징을 가진다고 합니다.
  2. 가용성을 지킬려면 - AP 시스템 : 낡은 데이터를 반환하더라도, 읽기연산을 계속 지원해야합니다. n1 과 n2 에대한 쓰기연산도 계속 지원하고 파티션 문제 (P)가 해결된 후에 새로운데이터들을 n3 에 전송할 것입니다.

 

 

🔥 CAP Theorem, 오해와 진실

CAP Theorem 은 NoSQL 이 인기를 끌면서 널리 퍼졌지만, 정리가 제대로 확립되지않아 많은 논의가 이루어졌다고 합니다.

위 링크의 필자는, CAP Theorem 의 다이어그램 자체가 틀렸을 뿐만아니라 Partition Tolerance 의 정의가 모호하다고 이야기합니다.

내요을 정의하자면
- Partion Tolerance 의 정의는 많은 정리 중 "The network will be allowed to lose arbitrarily many messages sent from one node to another" 즉, 분할 용인이라고 해석하는 게 올바르며
-  한국 위키피디아에서 번역한 정의는 분할 내성에 대한 내용으로 전혀 다르다고 합니다.


CAP 정리는 많은 문제와 모순이 있고, 이를 해결하려면 CAP가 서술하는 상황을 장애상황으로 국한지어야 합니다.
애초에 P는 네트워크 장애가 있을 수 있다는 것을 인정하느냐의 문제이고 이는 인정 할 수밖에 없는 문제이므로 처음부터 선택되어 있다는 것입니다.

👏🏻 결국, CAP Theorem이 내포하고 있는 의미는  (장애상황만 의미)
분산시스템에서 네트워크 장애상황일 때 일관성과 가용성 중 많아도 하나만 선택할 수 있다 는 것이고
하지만 이런 식의 해석은 정상 상황일 때의 분산시스템 동작을 서술해주지 못합니다.

이에 대해  Daniel Abadi 가  PACELC라는 아주 우아한 표기법을 제시하였습니다.
PACELE 이란 정상상황일 때와 장애상황을 때를 나누어 설명하자는 것 입니다.

 

 

 

 

 

 

 

끝!!

 

 

가상 면접 사례로 배우는 대규모 시스템 설계 기초