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

키-값 저장소 설계

막이86 2023. 11. 9. 17:24
728x90

가상 면접 사례로 배우는 대규모 시스템 설계 기초 "키-값 저장소 설계"을 요약한 내용입니다.

  • 키-값 저장소는 키-값 데이터베이스라고 불리는 비 관계형 데이터베이스 이다.
    • 저장되는 값은 고유 식별자를 키로 가져야한다.
    • 키와 값 사이의 이런 연결 관계를 “키-값” 쌍이라고 지칭한다.
  • 키-값 쌍에서의 키는 이율해야하며 해당 키에 매달린 값은 키를 통해서만 접근 가능
    • 키는 일반 텍스트 or 해시 값일 수 있다.
    • 성능상 키는 짧을 수록 좋다
    • ex) 일반 텍스트 키 : last_logged_in_at
    • ex) 해시 키 : 253DDEC4
  • 키-값 쌍에서 값은 문자열 or 리스트 or 객체일 수 있다.
  • 키-값 저장소로 널리 알려진 것
    • 아마존 다이나모
    • memcached
    • 레디스

문제 이해 및 설계 범위 확정

  • 완벽한 설계란 없다
  • 읽기, 쓰기, 메모리 사용량 사이에서 균형을 찾아야함
  • 데이터의 일관성과 가용성 사이에서 타협적 결정을 내린 설계를 만들었다면 쓸만한 답안일 것이다.
  1. 키-값 쌍의 크기는 10KB 이하이다.
  2. 큰 데이터를 저장할 수 있어야 한다.
  3. 높은 가용성을 제고해야 한다.
    1. 시스템은 설사 장애가 있더라도 빨리 응답해야함
  4. 높은 규모 확장성을 제공해야 한다.
    1. 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야한다.
  5. 데이터 일관성 수준은 조정이 가능해야한다.
  6. 응답 지연시간이 짧아야한다.

단일 서버 키-값 저장소

  • 한 대 서버만 사용하는 키-값 저장소를 설계하는 것은 쉽다.
    • 키-값 쌍 전부를 메모리에 해시 테이블로 저장
  • 빠른 속도를 보장하지만 모든 데이터를 메모리에 두는 것은 불가능한 약점이 있음
    • 데이터 압축
    • 자주 쓰이는 데이터만 메모리에 저장
  • 한 대 서버로 부족할 때가 있기 때문에 분산 키-값 저장소를 만들 필요가 있음

분산 키-값 저장소

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

CAP 정리

CAP 정리는 데이터 일관성, 가용성, 파티션 감내 라는 세 가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능하다는 정리

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

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

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

이상적 상태

  • 이상적 환경이라면 네트워크가 파티션되는 상황은 절대로 일어나지 않을 것이다.
    • n1에 기록된 데이터는 자동적으로 n2와 n3에 복제된다.
    • 데이터 일관성과 가용성도 만족

실세계의 분산 시스템

  • 분산 시스템은 파티션 문제를 피할 수 없다
  • 파티션 문제가 발생하면 일관성과 가용성 사이에서 하나를 선택해야 한다.
  • n3에 장애가 발생하여 n1 및 n2와 통신할 수 없는 상황에서 n1 또는 n2에 기록한 데이터는 n3에 전달 되지 않는다.
  • n3에 기록되었으나 n1 및 n2로 전달되지 않은 데이터가 있다면 n1과 n2는 오래된 사본을 갖고 있을 것이다.

가용성 대신 일관성을 선택 시스템

  • 데이터 불일치 문제를 피하기 위해 n1과 n2에 대해 쓰기 연산을 중단 시켜야 함
    • 이런 경우 가용성이 깨지게 됨
    • 은행 같은 시스템에서 사용할 수 있는 방법임

일관성 대신 가용성을 선택한 시스템

  • 낡은 데이터를 반환할 위험이 있더라도 계속 읽기 연산을 허용해야함
  • 파티션 문제가 해결된 뒤에 새 데이터를 n3에 전송을 해야함

시스템 컴포넌트

  • 데이터 파티션
  • 데이터 다중화
  • 일관성
  • 일관성 불일치 해소
  • 장애 처리
  • 시스템 아키텍처 다이어그램
  • 쓰기 경로
  • 읽기 경로

데이터 파티션

  • 대규모 애플리케이션의 경우 데이터를 작은 파티션들로 분활한 다음 여러 대 서버에 저장하는 것
  • 데이터 파티션 단위로 나눌 때는 아래 문제를 중요하게 따져봐야 함
    • 데이터를 여러 서버에 고르게 분산할 수 있는가?
    • 노드가 추가되거나 삭제될 때 데이터의 이동은 최소화 할 수 있는가?
  • 안정 해시(5장 내용)의 경우 파티션 단위를 나누는 문제를 푸는데 적합한 기술이다.
    • 규모 확장 자동화: 시스템 부하에 따라 서버가 자동으로 추가되거나 삭제되도록 만들 수 있음
    • 다양성: 각 서버의 용량에 맞게 가상 노드의 수를 조정할 수 있다.

데이터 다중화

  • 높은 가용성과 안정성을 확보하기 위해서는 데이터를 N개 서버에 비동기적으로 다중화 할 필요가 있다.
    • N은 튜닝 가능한 값
  • 어떤 키를 해시 링 위에 배치한 후 그지점으로부터 시계 방향으로 링을 순회하면서 만나는 첫 N개 서버에 데이터 사본을 보관 하는 것
  • 가상 노드를 사용한다면 선택한 N개의 노드가 대응될 실제 물리 서버의 개수가 N보다 작아질 수 있다.
  • 같은 데이터 센터에 속한 노드는 정전, 네트워크 이슈, 자연재해 등의 문제를 동시에 겪을 가능성이 높다
    • 데이터 사본은 다른 데이터 센터에 보관하고, 센터들은 고속 네트워크로 연결한다.

데이터 일관성

  • 여러 노드에 다중화된 데이터는 적절히 동기화가 되어야 한다.
  • 정족수 합의 프로토콜을 사용하면 읽기/쓰기 연산 모두에 일관성을 보장할 수 있다.
  • 관계된 정의
    • N=사본 개수
    • W=쓰기 연사에 대한 정족수. 쓰기 연산이 성공한 것으로 간주되려면 적어도 W개의 서버로부터 쓰기 연산이 성공했다는 응답을 받아야 한다.
    • R=읽기 연산에 대한 정족수. 읽기 연산이 성공한 것으로 간주되려면 적어도 R개의 서버로부터 응답을 받아야 한다.

쓰기 경로

  • 쓰기 요청이 특정 노드에 전달되면 무슨 일이 벌어지는지를 보여준다.
  1. 쓰기 요청이 커밋 로그 파일에 기록된다.
  2. 데이터가 메모리 캐시에 기록된다.
  3. 메모리 캐시가 가득차거나 사전에 정의된 어떤 임계치에 도달하면 데이터는 디스크에 있는 SSTable에 기록된다.

읽기 경로

  • 읽기 요청을 받는 노드는 데이터가 메모리 캐시에 있는지부터 살핀다.
728x90