목차
비녀장머리말
우리가 여기 있었다는 걸 기억해 데이터베이스 기초 입문 - 시스템 설계 08 이번 글에서는 관계형 데이터베이스에 대한 설명을 마친 후 Key-Value Store의 원리에 대해 좀 더 자세히 설명하겠습니다. 물론 아래에서는 NoSQL과 Key-value 데이터베이스에 대해서도 소개하겠습니다.
NoSQL이란 무엇입니까?
NoSQL은 Not Only SQL을 의미하며 비관계형 데이터베이스입니다. 즉, 데이터를 저장하기 위해 전통적인 관계형 데이터베이스 모델을 사용하지 않는다는 의미입니다. NoSQL 데이터베이스는 일반적으로 키-값 쌍, 파일, 그래프 또는 넓은 테이블과 같은 보다 유연하고 확장 가능한 데이터 모델을 사용합니다. 이 문서에서는 키-값 데이터베이스에 대해 설명합니다.
키-값 데이터베이스란 무엇입니까?
키-값 데이터베이스는 해시 테이블과 같은 키-값 방법을 사용하여 키-값 쌍의 형태로 데이터를 저장합니다. 키는 기본 키 역할을 하며 값은 간단한 스칼라 값부터 복잡한 객체까지 다양할 수 있습니다. 일반적인 키-값 데이터베이스에는 Amazon DynamoDB, Redis가 포함됩니다.
키-값 저장소
Key-Value Store는 분산 해시 테이블(Distributed Hash Table)로, DHT는 해시 테이블과 같은 검색 및 저장 기능을 제공하는 분산형 저장 방식입니다. 해시 테이블은 ADT(추상 데이터 유형)이기도 하며 일반적으로 비교적 빠른 시간에 검색 작업을 완료할 수 있다는 장점이 있습니다. 먼저 해시의 원리에 대해 이야기해 보겠습니다. 키 집합은 해시 함수에 의해 생성되며 고유한 키입니다. Key-Value Store는 키를 특정 값에 바인딩하며 값은 Map 또는 Image와 같은 저장 유형일 수 있습니다.
일반적으로 값은 상대적으로 작은 파일 크기(대략 MB~KB의 콘텐츠 크기)로 제한됩니다. 키-값 데이터 저장소는 메신저 생성, 사용자 대화 저장 등 다양한 시나리오에서 사용할 수 있습니다. 이러한 시나리오는 이 NoSQL 접근 방식을 사용하는 데 매우 적합합니다.
키-값 데이터 저장소를 설계하는 방법은 무엇입니까?
시스템 구성 요소를 설계하려면 먼저 원래 질문으로 돌아가야 합니다. 이 시스템 구성 요소에 대한 요구 사항은 무엇입니까? 자신의 필요를 잊어버린 독자라면 꼭 시청해 보는 것을 추천한다 소프트웨어 설계의 비기능적 특징 – 시스템 설계 03 .
기능적 요구 사항
일반적으로 키-값 저장소는 일반 데이터베이스와 동일하며 get 및 put 기능과 같은 몇 가지 공통 기능을 가지고 있습니다. 그러나 키-값 저장 시스템과 일반 저장 시스템 간의 기능적 요구 사항에는 여전히 일부 차이가 있습니다.
- 구성 가능한 서비스: 일부 시스템은 더 높은 가용성(가용성)을 위해 강력한 일관성(Consistency)을 희생할 수 있습니다. 키-값 저장소는 일관성 모델이 다른 시스템에서 사용될 수 있도록 구성 가능한 서비스를 제공해야 합니다.
- 항상 쓰기 기능: 시스템에는 키-값 저장소에 쓸 수 있는 기능이 있어야 합니다. 사용자가 Strong Consistency(Consistency)를 원하면 CAP 정리의 영향으로 가용성(Availability)을 포기하게 됩니다. 즉, CAP에서는 C가 선호됩니다.
비기능적 요구사항
확장성: 키-값 저장소는 전 세계 수만 대의 서버에서 실행될 수 있어야 합니다. 필요에 따라 서버를 추가하거나 삭제하는 동시에 서비스 가용성에 대한 영향을 줄이거나 영향을 주지 않습니다. 또한 시스템은 키-값 저장소의 많은 수의 사용자를 처리할 수 있어야 합니다.
내결함성: 시스템 서버 또는 시스템 구성 요소에 오류가 발생하는 경우 키-값 저장소는 중단 없이 계속 작동해야 합니다.
키-값 데이터 저장소 설계
시스템 설계를 시작하기 전에 먼저 단순 설계(Design Simple) 원칙에 따라 다음을 가정해야 합니다.
- 데이터 센터는 신뢰할 수 있습니다.
- 데이터스토어 인증이 완료되었습니다.
- 사용자 요청 및 응답은 HTTPS를 통해 이루어집니다.
API 디자인
첫 번째는 API의 설계입니다. 기능적 관점에서 어떤 API가 필요한지 생각해야 합니다. 해시 테이블과 같은 키-값 저장소는 get과 put이라는 두 가지 주요 기능을 제공합니다.
함수 가져오기
get(키)
매개변수의 키에 따라 해당 값을 반환합니다. 여기서 또 다른 것을 언급하겠습니다. 데이터 복제는 데이터베이스를 어떻게 최적화합니까? - 시스템설계 09 언급된 데이터 복사 문제가 있습니다. 키-값 데이터베이스가 데이터를 복사할 때 키와 연결된 개체의 복사본을 찾습니다. 이는 스토리지가 더 약한 데이터 일관성 모델로 구성된 경우 시스템에 의해 수행됩니다.
기능을 넣어
put(키, 값)
이 함수는 키와 관련된 값을 저장하는 데 사용됩니다. 키-값 데이터 저장소는 데이터를 배치할 위치를 자동으로 결정합니다. 또한 시스템은 일반적으로 저장된 개체에 대한 메타데이터를 유지합니다. 앞으로는 메타데이터가 무엇인지에 대해서도 잘 소개하겠습니다.
확장성 향상
시스템 설계에서는 확장성(Scalability)이 매우 중요하므로 키-값 저장소(Key-Value Store)를 설계할 때 키-값 데이터를 스토리지 노드에 저장하게 됩니다. 요구 사항이 변경되면 스토리지 노드를 추가하거나 삭제해야 할 수도 있습니다. 이는 로드를 모든 노드에 분산시키기 위해 시스템 노드의 데이터를 분할해야 함을 의미합니다. 아직 파티셔닝에 익숙하지 않은 독자는 다음을 참고하세요. 데이터 분할 데이터 분할이란 무엇입니까? – 시스템 설계 10.
키-값 데이터 저장소의 분할로 돌아가서 예는 다음과 같습니다. 4개의 노드가 있고 로드 균형을 맞추기 위해 40% 요청을 각 노드로 전송하려고 한다고 가정합니다. 이 문제를 해결하는 전통적인 방법은 모듈로를 사용하는 것입니다. 연산자(모듈러스 연산자)를 사용하여 계산을 수행합니다. 도착하는 모든 요청에는 이와 관련된 키가 있습니다. 요청이 들어오면 키의 해시 값을 계산합니다. 그런 다음 해시 값과 노드 수 m을 결합하여 나머지를 찾습니다.
일관된 해싱
우리는 한때 DNS란 무엇입니까? 도메인 이름 시스템 소개 - 시스템 설계 06 트래픽 문제를 해결하기 위해 다양한 종류의 알고리즘이 소개되었기 때문에 해싱을 논하려면 컨시스턴트 해싱 알고리즘을 논해야 합니다. 이 알고리즘은 노드 로드 균형을 맞추는 데 매우 적합한 방법입니다.
일관된 해시 알고리즘에서는 먼저 0부터 n-1까지의 해시 링(Hash Ring)이 있다고 가정해야 합니다. 여기서 n은 사용 가능한 해시 값의 개수입니다. 각 노드의 ID를 사용하여 해시 값을 계산하고 해시 값을 해시 링에 매핑합니다. 각 요청은 링에서 시계 방향으로 이동하여 찾은 다음 노드에 의해 이행됩니다.
새 노드가 링에 합류할 때마다 바로 다음 노드가 영향을 받습니다. 새로 추가된 노드와 프로필을 공유해야 하며 다른 노드는 영향을 받지 않습니다. 이러한 알고리즘은 쉽게 확장 가능하며 노드 변경을 최소한으로 유지할 수 있습니다. 해시 값은 무작위로 분산되므로 요청 로드가 무작위로 링 주위에 균등하게 분산될 것으로 예상됩니다.
일관된 해싱의 주요 이점은 노드가 가입하거나 탈퇴할 때 최소한의 키가 이동되도록 해야 한다는 것입니다. 그러나 실제로는 요청 로드가 균등하게 분산되지 않습니다. 대량의 데이터를 처리하는 서버는 분산 시스템에서 병목 현상이 발생할 수 있습니다. 노드가 불균형적으로 많은 수의 데이터 저장 및 검색 요청을 수신하여 전체 시스템 성능이 저하됩니다. 여기에서는 독자들이 참고 자료로 사용할 수 있도록 매우 자세하고 일관되고 혼합된 삽화가 포함된 기사를 제공합니다.
가상 노드 사용
일관된 해싱 알고리즘을 사용하는 것 외에도 가상 노드를 사용하여 노드 간에 보다 균일한 로드 분산을 보장할 수도 있습니다. 이 방법은 단일 해시 함수를 적용하는 대신 동일한 키에 여러 해시 함수를 사용합니다.
여기에 간단한 예가 있습니다. 4개의 해시 함수가 있다고 가정해 보겠습니다. 각 노드에 대해 4개의 해시 값을 계산하여 링에 넣습니다. 이 요청에는 해시 함수만 사용합니다. 요청이 링의 어느 위치에 도착하든 시계 방향으로 이동하면서 발견된 다음 노드에 의해 처리됩니다. 서버당 4개의 위치가 있으므로 요청 로드가 더 균등해집니다. 또한, 한 노드가 다른 노드보다 하드웨어 용량이 더 많은 경우 추가 해시 함수를 사용하여 더 많은 가상 노드를 추가할 수 있습니다. 이렇게 하면 링에서 더 많은 위치를 차지하고 더 많은 요청을 처리할 수 있습니다.
데이터 복제
이 기사 데이터 복제는 데이터베이스를 어떻게 최적화합니까? - 시스템설계 09 저는 데이터베이스 복제에 관해 글을 썼습니다. 키-값 데이터베이스에 관해서는 데이터 복제를 처리하는 다양한 방법도 있을 것입니다. 공통 데이터 복제에는 마스터-슬레이브 관계 및 지점 간 관계가 포함됩니다.
1차-2차 복제
마스터-슬레이브 방식에서는 저장영역 중 하나가 1차 저장영역이고, 나머지 저장영역은 보조 저장영역이다. 보조 복제본은 주 복제본의 데이터를 복사합니다. 기본 스토리지 영역은 쓰기 요청을 처리하는 데 사용되고 보조 서비스는 읽기 요청을 처리합니다. 또한 기본 저장소에 오류가 발생하면 저장소에 쓸 수 없으며 단일 오류 지점이 됩니다.
피어 투 피어 복제
P2P 접근 방식에서는 모든 저장 영역이 기본 저장 영역이며 데이터가 복제되어 업데이트됩니다. 모든 노드에서 읽기 및 쓰기도 허용됩니다. 일반적으로 모든 n개 노드에 걸쳐 복제하는 것은 비효율적이고 비용이 많이 듭니다. 대신, 복제할 스토리지 노드 수는 일반적으로 3개 또는 5개를 선택합니다.
결론
거의 2주 동안 해외 여행을 하게 되지만, 시스템 설계에 관한 기술 기사를 계속해서 업데이트하고, 앞으로도 시스템 설계 콘텐츠를 계속해서 작성할 예정입니다. 이런 글이 마음에 드셨다면 격려의 메시지를 남겨주시면 좋을 것 같아요!
관련 기사
데이터 분할 데이터 분할이란 무엇입니까? – 시스템 설계 10
데이터 복제는 데이터베이스를 어떻게 최적화합니까? - 시스템설계 09
DNS란 무엇입니까? 도메인 이름 시스템 소개 - 시스템 설계 06
시스템 설계 구성 요소 빌딩 블록 소개 - 시스템 설계 05