정기간행물/daily

키-값 저장소 설계 (대시설기)

:)jun 2023. 9. 23. 22:33

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

  • put(key, value)
  • get(key)

문제 이해 및 설계 범위 확정

완벽한 설계란 없다. 읽기, 쓰기 그리고 메모리 사용량 사이에 어떤 균형ㅇㄹ 찾고, 데이터의 일광성과 가용성 사이에서 타협적 결정을 내린 설계를 만들어야 한다.

단일 서버 키-값 저장소

한대는 쉽다.

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

→ 빠른 속도를 보장하긴 하지만 모든 데이터를 메모리 안에 두는 것이 불가능할 수도 있다는 약점이 있음

개선책 2가지

  1. 데이터 압축
  2. 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장

그래도 부족한 때가 곧 찾아온다.

분산 키-값 저장소

분산 키-값 저장소는 분산 해시 테이블이라고도 불린다.

키-값 쌍을 여러 서버에 분산시키기 때문.

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

CAP 정리

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

3가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능하다는 정리 → 어떤 두 가지를 충족하려면 나머지 하나는 반드시 희생되어야 한다는 것을 의미

  • CP 시스템
  • AP 시스템
  • CA 시스템 : 그러나 통상 네크워크 장애는 피할 수 없는 일로 여겨지므로, 분산 시스템은 반드시 파티션 문제를 감내할 수 있도록 설계되어야 한다. 실세계에 CA 시스템은 존재하지 않음.

시스템 컴포넌트

  • 데이터 파티션 : 규모 확장 자동화, 다양성이 좋다.
  • 데이터 다중화
  • 일관성 : 여러 노드에 다중화된 데이터는 적절히 동기화가 되어야 한다. 정족수 합의(Quorum Consensus) 프로토콜을 사용하면 읽기/쓰기 연산 모두에 일관성을 보장할 수 있다.
  • 일관성 불일치 해소
    • 데이터 버저닝 (벡터 시계) : 서버, 버전의 순서쌍을 데이터에 매단 것.
  • 장애 처리
  • 시스템 아키텍처 다이어그램
  • 쓰기 경로
  • 읽기 경로