728x90
가상 면접 사례로 배우는 대규모 시스템 설계 기초 "키-값 저장소 설계"을 요약한 내용입니다.
- 키-값 저장소는 키-값 데이터베이스라고 불리는 비 관계형 데이터베이스 이다.
- 저장되는 값은 고유 식별자를 키로 가져야한다.
- 키와 값 사이의 이런 연결 관계를 “키-값” 쌍이라고 지칭한다.
- 키-값 쌍에서의 키는 이율해야하며 해당 키에 매달린 값은 키를 통해서만 접근 가능
- 키는 일반 텍스트 or 해시 값일 수 있다.
- 성능상 키는 짧을 수록 좋다
- ex) 일반 텍스트 키 : last_logged_in_at
- ex) 해시 키 : 253DDEC4
- 키-값 쌍에서 값은 문자열 or 리스트 or 객체일 수 있다.
- 키-값 저장소로 널리 알려진 것
- 아마존 다이나모
- memcached
- 레디스
문제 이해 및 설계 범위 확정
- 완벽한 설계란 없다
- 읽기, 쓰기, 메모리 사용량 사이에서 균형을 찾아야함
- 데이터의 일관성과 가용성 사이에서 타협적 결정을 내린 설계를 만들었다면 쓸만한 답안일 것이다.
- 키-값 쌍의 크기는 10KB 이하이다.
- 큰 데이터를 저장할 수 있어야 한다.
- 높은 가용성을 제고해야 한다.
- 시스템은 설사 장애가 있더라도 빨리 응답해야함
- 높은 규모 확장성을 제공해야 한다.
- 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야한다.
- 데이터 일관성 수준은 조정이 가능해야한다.
- 응답 지연시간이 짧아야한다.
단일 서버 키-값 저장소
- 한 대 서버만 사용하는 키-값 저장소를 설계하는 것은 쉽다.
- 키-값 쌍 전부를 메모리에 해시 테이블로 저장
- 빠른 속도를 보장하지만 모든 데이터를 메모리에 두는 것은 불가능한 약점이 있음
- 데이터 압축
- 자주 쓰이는 데이터만 메모리에 저장
- 한 대 서버로 부족할 때가 있기 때문에 분산 키-값 저장소를 만들 필요가 있음
분산 키-값 저장소
- 분산 시스템을 설계할 때는 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개의 서버로부터 응답을 받아야 한다.
쓰기 경로
- 쓰기 요청이 특정 노드에 전달되면 무슨 일이 벌어지는지를 보여준다.
- 쓰기 요청이 커밋 로그 파일에 기록된다.
- 데이터가 메모리 캐시에 기록된다.
- 메모리 캐시가 가득차거나 사전에 정의된 어떤 임계치에 도달하면 데이터는 디스크에 있는 SSTable에 기록된다.
읽기 경로
- 읽기 요청을 받는 노드는 데이터가 메모리 캐시에 있는지부터 살핀다.
728x90
'가상 면접 사례로 배우는 대규모 시스템 설계 기초' 카테고리의 다른 글
URL 단축기 설계 (0) | 2023.11.09 |
---|---|
분산 시스템을 위한 유일 ID 생성기 설계 (0) | 2023.11.09 |
안정 해시 설계 (1) | 2023.11.09 |
처리율 제한 장치의 설계 (1) | 2023.11.09 |
사용자 수에 따른 규모 확장성 (0) | 2023.11.09 |