KR102665979B1 - 압축한 키-값 저장소 트리 데이터 블록 유출 - Google Patents

압축한 키-값 저장소 트리 데이터 블록 유출 Download PDF

Info

Publication number
KR102665979B1
KR102665979B1 KR1020217014028A KR20217014028A KR102665979B1 KR 102665979 B1 KR102665979 B1 KR 102665979B1 KR 1020217014028 A KR1020217014028 A KR 1020217014028A KR 20217014028 A KR20217014028 A KR 20217014028A KR 102665979 B1 KR102665979 B1 KR 102665979B1
Authority
KR
South Korea
Prior art keywords
key
value
node
block
sequence
Prior art date
Application number
KR1020217014028A
Other languages
English (en)
Other versions
KR20210057835A (ko
Inventor
알렉산더 톰린슨
그레그 에이. 베커
가우라브 산제이 람다시
Original Assignee
마이크론 테크놀로지, 인크.
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US16/156,440 external-priority patent/US11100071B2/en
Application filed by 마이크론 테크놀로지, 인크. filed Critical 마이크론 테크놀로지, 인크.
Publication of KR20210057835A publication Critical patent/KR20210057835A/ko
Application granted granted Critical
Publication of KR102665979B1 publication Critical patent/KR102665979B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24553Query execution of query operations
    • G06F16/24554Unary operations; Data partitioning operations
    • G06F16/24556Aggregation; Duplicate elimination
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/28Databases characterised by their database models, e.g. relational or object models
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/064Management of blocks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0644Management of space entities, e.g. partitions, extents, pools

Abstract

본 개시의 양태는 다음과 같은 키-값 트리 데이터 구조의 동작을 제공한다 : 주어진 노드의 하나 이상의 자식 노드가 리프 노드를 포함하는지 여부에 기초하여 병합된 키-값 세트의 값 블록에 재기록하거나 또는 재기록을 지연시키면서 키-값 세트의 키 블록을 병합 및 재기록함으로써 주어진 노드 내의 키-값 세트를 병합하고; 병합된 키-값 세트의 하나 이상의 부분을 주어진 노드의 하나 이상의 자식 노드로 이동시킨다.

Description

압축한 키-값 저장소 트리 데이터 블록 유출
우선권 출원
본 출원은 2018 년 10 월 10 일에 출원된 미국 출원 일련 번호 16/156,440에 대한 우선권의 이익을 주장하며, 이는 그 전체가 본 출원에 참조로 통합된다.
기술 분야
본 개시의 실시예는 전반적으로 메모리 서브 시스템에 관한 것이고, 보다 구체적으로는 키-값 저장소 (KVS : key-value store) 트리 데이터 구조의 동작에 관한 것이다.
메모리 서브 시스템은 SSD (Solid-State Drive)와 같은 저장 시스템일 수 있으며 데이터를 저장하는 하나 이상의 메모리 컴포넌트를 포함할 수 있다. 메모리 컴포넌트는 예를 들어, 비 휘발성 메모리 컴포넌트 및 휘발성 메모리 컴포넌트일 수 있다. 일반적으로, 호스트 시스템은 메모리 서브 시스템을 사용하여 메모리 컴포넌트에 데이터를 저장하고 메모리 컴포넌트에서 데이터를 검색할 수 있다.
본 개시는 이하에 주어진 상세한 설명 및 본 개시의 다양한 실시예의 첨부 도면으로부터 보다 완전하게 이해될 것이다.
도 1은 본 개시의 일부 실시예들에 따른, 메모리 서브 시스템을 포함하는 예시적인 컴퓨팅 환경을 예시하는 블록도이다.
도 2는 본 개시의 일부 구현에 따른 키-값 저장소 (KVS) 트리에 대한 예시적인 키 병합 이동(key merge move)의 블록도이다.
도 3 내지 5는 본 개시의 일부 구현에 따른 키 병합 이동을 위한 예시적인 방법의 흐름도이다.
도 6은 본 개시의 일부 구현에 따른, 키 병합 이동에 의해 동작될 수 있는 예시적인 KVS 트리를 예시하는 블록도이다.
도 7a 및 7b는 본 개시의 일부 구현에 따른, 자식 노드의 세트가 리프 노드(leaf node)를 포함하지 않을 때 하나 이상의 키-값 세트에서 수행되는 예시적인 키 병합 이동을 예시하는 블록도이다.
도 8a 및 8b는 본 개시의 일부 구현에 따른, 자식 노드 세트가 하나 이상의 리프 노드 만을 포함할 때 하나 이상의 키-값 세트에 수행되는 예시적인 키 병합 이동을 예시하는 블록도이다.
도 9a 내지 9c는 키 병합 이동을 위한 방법이 수행되는 예시적인 실시예의 맥락에서 컴퓨팅 환경의 컴포넌트들 간의 상호 작용을 예시하는 상호 작용 다이어그램을 제공한다.
도 10은 본 개시의 일부 실시예들에 따른, 기계로 하여금 본 출원에서 논의된 방법들 중 임의의 하나 이상을 수행하게 하기 위한 지침 세트가 실행될 수 있는 컴퓨터 시스템 형태의 기계의 도식적 표현을 예시하는 블록도이다.
본 개시의 양태는 메모리 서브 시스템에 의해 또는 이와 함께 사용될 수 있는 키-값 트리 데이터 구조에서 키-값 세트를 병합 및 이동시키는 것에 관한 것이다. 메모리 서브 시스템은 이하 "메모리 디바이스"라고도 한다. 메모리 서브 시스템의 예로 SSD와 같은 스토리지 시스템이 있다. 일부 실시예에서, 메모리 서브 시스템은 하이브리드 메모리/스토리지 서브 시스템이다. 일반적으로 호스트 시스템은 하나 이상의 메모리 컴포넌트를 포함하는 메모리 서브 시스템을 사용할 수 있다. 호스트 시스템은 메모리 서브 시스템에 저장될 데이터 (예를 들어, 기록 요청을 통해)를 제공하고, 메모리 서브 시스템에서 데이터를 검색 (예를 들어, 판독 요청을 통해)하도록 요청할 수 있다.
메모리 서브 시스템은 호스트 시스템으로부터 데이터를 저장할 수 있는 다수의 메모리 컴포넌트를 포함할 수 있다. 메모리 서브 시스템은 호스트 시스템으로부터 수신된 요청에 응답하여 메모리 컴포넌트에서 데이터 판독, 데이터 기록 또는 데이터 소거와 같은 동작을 수행하기 위해 각각의 메모리 컴포넌트와 통신할 수 있는 메모리 서브 시스템 컨트롤러를 더 포함할 수 있다. 메모리 서브 시스템의 메모리 컴포넌트 중 임의의 하나 이상은 메모리 컴포넌트의 메모리 셀을 관리하고, 메모리 서브 시스템 컨트롤러와 통신하고, 메모리 서브 시스템 컨트롤러로부터 수신된 메모리 요청 (예를 들어, 판독 또는 기록)을 실행하기 위한 매체 컨트롤러(media controller)를 포함할 수 있다.
데이터 베이스 스토리지 및 볼륨 데이터 스토리지 (예를 들어, 클라우드 스토리지)와 같은 일부 애플리케이션에서, 키-값 데이터 구조(key-value data structure)는 하나 이상의 매체 데이터 블록 (매체 블록)을 포함하는 단일 논리 데이터 스토리지 볼륨으로 제공되고 하나 이상의 메모리 디바이스에 의해 구현되는 데이터 스토리지 매체 풀 (매체 풀)과 같은 데이터 스토리지 매체에 데이터를 저장하는데 사용된다. 키-값 저장소 (KVS)는 키-값 쌍을 저장하고 검색하기 위한 하나 이상의 키-값 데이터 구조를 포함할 수 있다. 키-값 데이터 구조는 키-값 쌍의 저장된 데이터를 효율적으로 검색하거나, 희소 데이터(sparse data)의 효율적인 저장을 허용하거나, 검색 가능한 데이터의 효율적인 저장을 허용할 수 있다. 일반적으로 키-값 데이터 구조는 저장을 위해 키-값 쌍을 수락하고 키를 기반으로 하는 값에 대한 쿼리에 응답하도록 구성된다. 키-값 데이터 구조는 트리 데이터 구조와 같은 구조를 포함할 수 있으며, 그 예로는 로그 구조 병합 트리 (LSM 트리) 및 키-값 저장소 (KVS) 트리 (본 출원에서 키-값 저장소 트리 데이터 구조 또는 KVS 트리 데이터 구조로 또한 불리움)를 포함한다.
본 개시는 키-값 쌍 데이터의 값 데이터의 재기록을 지연시키면서 키-값 쌍 데이터의 키 데이터를 병합함으로써 키-값 트리 데이터 구조 (KVS 트리) 노드의 키-값 쌍 데이터를 병합 (예를 들어, 압축)하고 그런 다음 병합된(merged) (예를 들어, 압축(compact)된) 키 데이터를 노드의 자식 노드 중 적어도 하나로 이동 (예를 들어, 유출(spill)) 시키기 위한 다양한 실시예를 제공한다. 그렇게 함으로써, 이러한 실시예는 KVS 트리의 하나 이상의 내부 노드 간에 값 데이터가 공유되도록 허용할 수 있으며, 키-값 쌍 데이터가 KVS 트리 아래로 흐를 때 값 데이터가 KVS 트리 데이터에 재기록되는 횟수를 줄일 수 있다 (루트 노드(root node)에서 리프 노드(leaf node)로). 예를 들어, 일부 실시예는 특정 값 데이터가 KVS 트리에 두 번만 기록되도록 제한한다 (예를 들어, 특정 값 데이터가 KVS 트리의 루트 노드에 처음 기록될 때 그리고 특정 값 데이터가 리프 노드에 도달하여 재기록될 때). 실시예에 따른, 본 출원에서 설명된 동작은 호스트 시스템, 메모리 서브 시스템, 또는 둘 모두의 일부 조합에서 수행될 수 있다. 본 출원에서 설명된 실시예들을 사용하지 않고, 값 데이터는 H 번 기록될 수 있으며, 여기서, H는 KVS 트리의 높이이다. 값 재기록 횟수를 줄이면 KVS 트리 및 KVS 트리를 사용하는 메모리 서브 시스템의 성능에 특히, 값 데이터가 키 데이터보다 데이터 크기가 훨씬 더 큰 경우에 도움이 될 수 있다. KVS 트리에서 값 재기록 횟수를 줄이면 KVS 트리에 대한 판독 및 기록 증폭을 줄일 수 있을 뿐만 아니라 KVS 트리 저장에 사용되는 데이터 스토리지 디바이스에 대한 디바이스 입력/출력 (I/O)을 줄일 수 있다.
본 출원에서 사용되는, 키 병합 이동 동작(key merge move operation)은 키-값 쌍 데이터의 값 데이터 (예를 들어, 값 블록)의 재기록을 지연시키면서 노드의 키-값 쌍 데이터의 키 데이터 (예를 들어, 키 블록)를 병합 (예를 들어, 압축)시키고 그런 다음 병합된 (예를 들어, 압축된) 키 데이터를 노드의 자식 노드 중 적어도 하나로 이동 (예를 들어, 유출)하는 다양한 실시예의 동작을 총칭한다. 키 병합 이동 동작은 k-압축 후 키-값 세트를 유출할 수 있는 k-유출(k-spill) 압축 동작이라고도 한다. 다양한 실시예에 따르면, KVS 트리의 노드 내의 데이터는 키 블록 세트 (키 저장용) 및 키-값 쌍의 값 블록 세트 (값 저장용)를 포함한다. 이러한 방식으로 KVS 트리의 노드는 해당 값과 별도로 키를 저장할 수 있으며, 이는 LSM 트리에 비해 KVS 트리 성능 장점을 제공한다. 이러한 실시예에 대해, 본 출원에서 설명된 동작은 노드 내의 키 블록을 병합 (예를 들어, 압축)하고 병합된 (예를 들어, 압축된) 키 블록을 노드에서 하나 이상의 자식 노드로 이동 (예를 들어, 유출)시키고, 노드 내의 값 블록을 그대로(as-is) 보유하고 해당 값 블록이 KVS 트리의 다른 노드에 의해 공유되도록 허용하는 것을 가능하게 할 수 있다. 키 블록을 병합함으로써 (예를 들어, KVS 트리에서 수행되는 가비지 컬렉션 프로세스(garbage collection process)의 일부로서), 일부 실시예는 더 오래된(older) 또는 삭제된 키 블록에 의해 데이터 스토리지 매체 (예를 들어, 매체 풀)에 점유된 메모리 공간 (예를 들어, 매체 블록)을 회수(reclaim) (예를 들어, 확보(free up))하고 KVS 트리의 전체 데이터 크기를 더욱 줄이고, 이는 KVS 트리에서 검색 가능성을 향상시킬 수 있다. 키 블록을 노드의 자식 노드 중 하나로 이동 (예를 들어, 유출)함으로써, 일부 실시예는 더 새로운 데이터 (예를 들어, 키 블록)를 수신하기 위해 노드의 메모리 공간을 확보하면서 더 오래된 데이터 (예를 들어, 이들이 참조하는 더 오래된 키 블록 및 값 블록)를 KVS 트리로 더 깊숙이 푸시한다(push).
본 출원에서 사용되는, KVS 트리는 (예를 들어, 트리의 콘텐츠 보다는) 키의 미리 결정된 파생(derivation)에 기초하여 부모 및 자식 노드 사이의 연결을 갖는 노드를 포함하는 트리 데이터 구조를 포함한다. 각각의 노드는 순서화된 (예를 들어, 일시적으로 순서화된) 키-값 세트(본 출원에서 kv세트(kvset) 라고도 함) 시퀀스를 포함할 수 있다. 일시적으로 순서화된 경우 시퀀스의 나중 키-값 세트는 더 오래된 키-값 세트를 나타낼 수 있다. Kvset는 값을 참조하는 해당 키와 함께 KVS 트리에 값을 저장할 수 있는 하나 이상의 키-값 쌍을 포함한다. 따라서, KVS 트리 내에서, kvset는 KVS 트리의 노드에 구조화된 개별 키 및 값 저장소로 기능한다. 주어진 kvset 내의 키-값 쌍은 키 정렬(key-sorted)될 수 있다. 주어진 kvset 내의 모든 키는 kvset의 다른 키와 고유할 수 있지만; KVS 트리 내의 키는 고유하지 않을 수 있다 (예를 들어, 단일 노드 내 또는 KVS 트리의 상이한 노드에 있는 두 개의 다른 kvset는 동일한 키를 포함할 수 있다). 각각의 kvset는 노드에 기록되면 변경 불가능할 수 있다 (예를 들어, 노드에 배치/저장되면 kvset는 변경되지 않는다). 노드 내의 kvset는 변경할 수 없지만, Kvset가 삭제되거나 kvset의 데이터 콘텐츠 중 일부 또는 전체가 새로운 kvset에 추가될 수 있다.
kvset는 kvset의 키-값 쌍의 키 엔트리를 저장하는 키 트리를 포함할 수 있으며, 여기서, 주어진 키 엔트리는 키와 값에 대한 참조(reference) 둘 모두 포함할 수 있다. 다양한 데이터 구조가 이진 검색 트리, B-트리 등과 같은 키 트리의 고유 키 (예를 들어, 데이터 트리가 아닐 수도 있음)를 효율적으로 저장하고 검색하는데 사용될 수 있다. 예를 들어, 키는 키 트리의 리프 노드에 저장되고, 여기서, 키 트리의 임의의 서브 트리에 최대 키는 가장 우측 자식의 가장 우측 엔트리에 있을 수 있으며, 키 트리의 제 1 노드의 가장 우측 에지는 키 트리의 서브 노드에 링크되며, 키 트리의 서브 트리에서 루트(rooted)된 서브 트리의 모드는 키는 키 트리의 제 1 노드에 있는 모든 키보다 더 클 수 있다. 대안으로, 본 출원에 설명된 다른 예에서, 키 엔트리는 기수 기반 키 배포(radix-based key distribution) (예를 들어, 키의 해시를 사용하는 것)에 기초하여 저장될 수 있다.
일부 실시예에서, kvset의 키 엔트리는 1 차(primary) 키 블록 및 0 개 이상의 확장 키 블록을 포함할 수 있는 키 데이터 블록 세트 (키 블록 또는 케이블록(kblock)이라고도 함)에 저장된다. 키 블록의 세트의 멤버는 SSD, 하드 디스크 드라이브 등과 같은 메모리 디바이스에 의해 구현된 데이터 스토리지 매체에 대한 매체 데이터 블록 (매체 블록)에 해당할 수 있다. 각각의 키 블록은 키 블록으로 식별하기 위한 헤더(header)를 포함할 수 있고, kvset의 1차 키 블록은 kvset의 하나 이상의 확장 키 블록에 대한 매체 블록 식별 리스트를 포함할 수 있다.
1 차 키 블록은 kvset의 키 트리에 대한 헤더를 포함할 수 있다. 헤더는 키 또는 kvset과의 상호 작용을 지원하거나 가능하게 하기 위해 다수의 값을 포함할 수 있다. 예를 들어, 1차 키 블록 또는 그 안에 저장된 헤더는 kvset의 키 트리에서 최저 키의 복사본(copy) 또는 kvset의 키 트리에서 최고 키의 복사본을 포함할 수 있다. 1차 키 블록은 kvset의 키 트리에 대한 매체 블록 식별 리스트를 포함할 수 있다. 추가적으로, 1차 키 블록은 kvset의 블룸(bloom) 필터에 대한 블룸 필터 헤더를 포함할 수 있으며, 1차 키 블록은 kvset의 블룸 필터에 대한 매체 블록 식별 리스트를 포함할 수 있다.
일부 실시예에서, kvset의 값은 값 데이터 블록의 세트 (본 출원에서 값 블록 또는 브이블록(vblocks)라고도 함)에 저장된다. KVS 트리의 각각의 특정 값 블록은 특정 값 블록이 KVS 트리에 대해 처음 생성된 시퀀스 순서를 나타내는 연관된 데이터 생성 번호를 가질 수 있다. 이러한 방식으로, 특정 값 블록의 데이터 생성 번호는 특정 값 블록이 처음 생성될 때 타임 스탬프(time stamp) 역할을 할 수 있다. 예를 들어, 데이터 생성 번호는 KVS 트리의 루트 노드에서 생성 및 추가된 (예를 들어, kvset의) 제 1 값 블록에 대해 "1"의 값에서 시작하고, KVS 트리의 루트 노드에 생성 및 추가된 제 2 값 블록 (예를 들어, kvset)은 데이터 생성 번호는 "2"이다. 데이터 생성 번호는 루트 노드를 통해 생성되고 KVS 트리에 추가되는 각각의 새로운 값 블록에 따라 증가한다.
값 블록 세트의 멤버는 메모리 디바이스에 의해 구현된 데이터 스토리지 매체에 대한 매체 데이터 블록 (매체 블록)에 대응할 수 있으며, 이는 본 출원에서 언급된 SSD, 하드 디스크 드라이브 등을 포함할 수 있다. 각각의 값 블록은 값 블록으로 식별하기 위한 헤더를 포함할 수 있다. 값 블록은 분리없이 하나 이상의 값에 대한 스토리지 섹션을 포함할 수 있으며, 여기서 제 1 값의 비트는 가드(guard), 컨테이너(container) 또는 다른 구분 기호(delimiter)없이 데이터 스토리지 매체에서 제 2 값의 비트로 이어질 수 있다. 다양한 실시예에서, kvset의 1 차 키 블록은 kvset에 대한 값 블록 세트의 값 블록에 대한 매체 블록 식별 리스트를 포함한다. 이러한 방식으로, 1차 키 블록은 kvset 내의 값 블록에 대한 스토리지 참조(storage reference)를 관리할 수 있다.
일부 실시예에서, 키와 관련된 데이터 마커(data marker) (이하, 삭제 표시(tombstone)이라고 함)는 키에 대응하는 값이 삭제되었음을 표시하는데 사용된다. 삭제 표시는 키와 관련하여 키 엔트리에 상주할 수 있으며 키-값 쌍에 값 블록 공간이 소모될 수 없다. 일부 실시예에 따르면, 삭제 표시는 KVS 트리로부터 값을 퍼지(purge)하는 비용이 많이 드는 동작을 피하면서 키와 관련된 값의 삭제를 마킹한다. 일부 실시예에서, 주어진 키에 대한 KVS 트리의 일시적으로 순서화된 검색 동안에 삭제 표시가 발견될 때, 검색 프로세스는 주어진 키와 관련된 키-값 쌍의 만료된 버전이 KVS 트리 내의 더 낮은 (예를 들어, 더 오래된) 위치에 상주하더라도 주어진 키에 해당하는 값이 삭제되었음을 알고 있다.
일부 실시예에서, 1 차 키 블록은 kvset에 대한 메트릭(metrics) 세트를 포함한다. 예를 들어, 메트릭 세트는 다음 중 하나 이상을 포함할 수 있다 : kvset에 저장된 총 키의 수; 또는 kvset에 저장된 삭제 표시 값을 갖는 다수의 키, kvset에 저장된 키에 대한 모든 키 길이의 합계; kvset에 저장된 키에 대한 모든 값 길이의 합계. 마지막 두 메트릭은 kvset에 의해 소모되는 적어도 대략적인 (정확하지 않은 경우) 스토리지 양을 제공할 수 있다. 메트릭 세트는 또한 예를 들어, kvset의 값 블록 (예를 들어, 참조되지 않은(unreferenced) 값)에서 참조되지 않은 데이터의 양을 포함할 수 있다. 이 마지막 메트릭은 유지 관리(maintenance) 동작 (예를 들어, KVS 트리에서 수행되는 가비지 컬렉션 동작)에서 회수될 수 있는 공간의 추정치를 제공할 수 있다.
다양한 실시예의 키 병합 이동 동작은 지정된 또는 계산된 기준(criteria)을 충족하는 주어진 노드에서 하나 이상의 kvset에 관한 조건과 같은 다양한 트리거링 조건에 응답하여 수행될 수 있다. 이러한 kvset 관련 기준의 예는 주어진 노드 내의 kvset의 수, 주어진 노드에 의한 새로운 kvset 추가 (예를 들어, 수집(ingestion)) (예를 들어, 주어진 노드의 부모 노드에서 주어진 노드로 kvset를 이동 (예를 들어, 유출) 한 결과), 주어진 노드에 대한 자원 (예를 들어, 매체 블록) 해제(free), 주어진 노드 내에서 하나 이상의 kvset의 총 크기, 또는 가비지 켈렉션에 사용할 수있는 하나 이상의 kvset에 있는 데이터의 양을 포함하지만, 이에 한정되지 않는다. kvset에서 가비지 컬렉션에 사용할 수 있는 데이터의 일 예는 예를 들어, 최신 kvset의 키-값 쌍 또는 삭제 표시 또는 제약 조건 (예를 들어, TTL(time to live) 제약)을 위반 한 키-값 쌍에 의해 쓸모 없는 kvset의 하나 이상의 키-값 쌍 또는 삭제 표시를 포함한다. 또 다른 예는 KVS 트리에서 유지 보수 (예를 들어, 가비지 컬렉션)를 수행하기 위한 조건을 포함한다. 또 다른 예시적인 조건은 KVS 트리의 하나 이상의 노드에 대해 키 병합 이동 동작을 개시하기 위한 요청 (예를 들어, 호스트 시스템의 운영 체제 또는 소프트웨어 애플리케이션으로부터)을 수신하는 것을 포함하며, 여기서 요청은 kvset의 전체 시퀀스 또는 kvset의 서브 시퀀스가 동작할 지 여부를 지정할 수도 있다.
일부 실시예에 대해, 본 출원에 설명된 키 병합 이동 동작은 다음의 조합을 포함한다 : kvset의 값 블록의 재기록을 지연시키면서 kvset의 키 블록 (예를 들어, 키 압축)을 병합함으로써 주어진 노드 내에서 kvset (예를 들어, kvset의 시퀀스)을 병합하는 단계; 및 결과적으로 병합된 kvset의 일부를 하나 이상의 자식 노드에 배치하기 위해 KVS 트리 (주어진 노드의 하나 이상의 자식 노드로)를 횡단하는 단계(traversing)를 포함한다. 키 병합 이동 동작 (작동될)에 의해 수신된 Kvset는 주어진 노드의 kvset의 일부 또는 전부를 포함할 수 있으며, 추가적으로 주어진 노드의 두 개 이상의 kvset의 일시적 연속 시퀀스를 포함할 수 있다. 예를 들어, 키 병합 이동 동작이 동작하기 위해 수신하는 kvset는 주어진 노드의 전체 kvset 시퀀스 또는 더 큰 kvset 시퀀스의 테일(tail)에 있는 kvset의 서브 시퀀스를 포함할 수 있다. 따라서, 본 출원에서 사용되는, kvset의 시퀀스는 주어진 노드의 kvset의 전체 시퀀스 또는 주어진 노드의 kvset의 서브 시퀀스를 나타낼 수 있다.
일부 실시예에 따르면, KVS 트리는 메모리 서브 시스템에 의해 구현되는 데이터 스토리지 매체에 생성되고 저장되며, 여기서, KVS 트리는 데이터 스토리지 매체에 데이터를 하나 이상의 키-값 쌍으로 저장하는데 사용될 수 있다. 일부 실시예에서, KVS 트리의 주어진 노드에 대해 수행하도록 트리거되면 (예를 들어, 트리거 조건에 기초하여), 키 병합 이동은 주어진 노드의 자식 노드 세트 (예를 들어, 모든 자식 노드)가 리프 노드를 포함하는지 여부를 결정하고, 하나 이상의 자식 노드가 리프 노드를 포함하는지 여부에 기초하여 주어진 노드의 kvset(예를 들어, kvset의 시퀀스)를 병합한 다음 결과 병합된 kvset를 하나 이상의 자식 노드로 이동시킨다.
자식 노드 세트가 리프 노드를 포함하지 않는다는 결정에 응답하여 (예를 들어, 세트 내의 자식 노드 중 어느 것도 리프 노드가 아님), 키 병합 이동 동작은 병합된 kvset를 생성하기 위해 노드의 kvset의 시퀀스 (예를 들어, 시간 시퀀스)를 병합할 수 있고, 여기서 병합된 kvset는 kvset 시퀀스의 기존 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함한다. 새로운 키 블록 세트는 kvset 시퀀스의 기존 키 블록 세트를 기반으로 생성될 수 있다 (예를 들어, 복사). 예를 들어, 새로운 키 블록 세트는 기존 키 블록 세트의 값을 새로운 키 블록 세트에 복사함으로써 (예를 들어, 키 값 및 기존 값 블록에 대한 참조) kvset 시퀀스의 기존 키 블록 세트를 기반으로 생성될 수 있다. 새로운 키-값 블록 세트에 의해 참조되지 않는 kvset 시퀀스의 기존 값 블록은 보유되지만 (예를 들어, 삭제되지 않음) 참조되지 않은 것으로 간주되고 상이한 kvset의 두 키 블록 (예를 들어, KVS 트리의 내부 노드의 두 개의 kvset)에 의해 공유될 수 있다. 새로운 키 블록 세트가 생성된 후, 키 병합 이동 동작은 노드에서 키-값 세트 시퀀스에 있는 각각의 특정 키-값 세트를 삭제하고 각각의 특정 키-값 세트의 모든 키 블록을 삭제할 수 있고, 각각의 특정 키-값 세트의 모든 값 블록을 그대로 남겨 둔다 (예를 들어, 있는 그대로 보존). 보존된 값 블록은 새로운 키 블록 세트에 의해 참조되는 값 블록, 새로운 키 블록 세트에 의해 참조되지 않는 값 블록 또는 둘 모두를 포함할 수 있다. kvset 시퀀스의 모든 값 블록 (있는 그대로 보존됨)은 병합된 kvset로 이동될 수 있다. 전술한 동작은 본 출원에서 총칭하여 키 압축 (k-compaction)으로 지칭될 수 있으며, 이는 사용하지 않는 키 블록 및 그 사용하지 않는 키 블록에 의해 점유된 사용 가능한 자원 (예를 들어, 데이터 스토리지 매체의 매체 블록)를 제거하기 위한 가비지 컬렉션의 한 형태로 간주될 수 있다.
대안적으로, 자식 노드의 세트가 하나 이상의 리프 노드만을 포함한다고 결정한 것에 응답하여, 키 병합 이동 동작은 병합된 kvset를 생성하기 위해 노드의 kvset의 시퀀스 (예를 들어, 시간 시퀀스)를 병합할 수 있으며, 여기서 결과적으로 병합된 kvset는 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하고, 여기서 새로운 키 블록 세트는 kvset 시퀀스의 기존 키 블록 세트를 기반으로 생성되며, 새로운 값 블록 세트는 kvset 시퀀스의 기존 값 블록 세트를 기반으로 생성된다. 예를 들어, 새로운 키 블록 세트는 기존 키 블록 세트의 값 (예를 들어, 키 값)을 새로운 키 블록 세트에 복사함으로써 kvset 시퀀스의 기존 키 블록 세트에 기초하여 생성될 수 있으며, 새로운 키 블록 (새 키 블록 세트에서)은 기존 키 블록 세트에 의해 참조되는 기존 블록에 대응하는 새로운 값 블록 (새 값 블록 세트에서)을 개별적으로 참조하게 한다. 새로운 값 블록 세트는 기존 값 블록 세트의 값을 새로운 값 블록 세트에 복사함으로써 kvset 시퀀스의 기존 값 블록 세트를 기반으로 생성된다. 새로운 값 블록 세트는 기존 값 블록 세트의 임의의 값 블록에 할당된 가장 큰 (예를 들어, 최대) 데이터 생성 번호를 할당 (예를 들어, 상속) 할 수 있다.
추가적으로, 일부 실시예들에 대해, 자식 노드들의 세트가 적어도 하나의 리프 노드 및 적어도 하나의 비-리프 노드를 포함한다는 결정에 응답하여 (예를 들어, KVS 트리는 불균형이므로, 자식 노드들의 세트는 리프 노드와 비 리프 노드의 혼합을 포함한다), 키 병합 이동 동작은 노드의 kvset 시퀀스를 병합하여 제 1 병합된 kvset 및 제 2 병합된 kvset를 생성할 수 있다. 일부 그러한 실시예에 대해, 제 1 병합된 kvset는 kvset 시퀀스의 기존 값 블록 세트를 참조하는 새로운 키 블록의 제 1 세트를 포함하고, 여기서 새로운 키 블록의 제 1 세트 내의 키(들)는 하나 이상의 비-리프 노드에 매핑하고(예를 들어, 결정론적 매핑에 기반), 제 2 병합된 kvset는 새로운 값 블록 세트를 참조하는 제 2 새로운 키 블록 세트를 포함하고, 여기서 제 2 새로운 키 블록 세트 내의 훼어(where) 키(들)는 하나 이상의 리프 노드에 매핑된다(예를 들어, 결정론적 매칭 기반). 본 출원에 언급된 바와 같이, 제 2 병합된 kvset에 대한 새로운 값 블록 세트는 기존 값 블록 세트 내의 임의의 값 블록에 할당된 가장 큰 (예를 들어, 최대) 데이터 생성 번호를 할당 (예를 들어, 상속)할 수 있다. 결국, 제 1 병합된 kvset는 제 1 분할(split) kvset 세트로 분할되어 하나 이상의 비-리프 노드에 배포될 수 있으며, 제 2 병합된 kvset는 제 2 분할 kvset 세트로 분할되어 하나 이상의 리프 노드에 배포될 수 있다.
새로운 키 블록 세트와 새로운 값 블록 세트가 생성된 후, 키 병합 이동 동작은 노드에서 kvset 시퀀스의 각각의 특정 kvset를 삭제하고 각각의 특정 키 kvset의 모든 키 블록을 삭제할 수 있다. 또한 새로운 키 블록 세트와 새로운 값 블록 세트가 생성된 후, kvset 시퀀스의 하나 이상의 기존 값 블록 (예를 들어, 모든 기존 값 블록)이 개별 데이터 생성 번호를 기반으로 삭제될 수 있다. 본 출원에 언급된 바와 같이, 값 블록의 개별 데이터 생성 번호는 초기 생성시 (예를 들어, KVS 트리의 루트 노드에 추가될 때) 블록에 할당될 수 있거나, 가능하면 KVS 트리의 다른 동작으로부터 상속될 수 있다. 일부 실시예에 따라, 데이터 생성 번호에 기초하여 기존의 값 블록 (예를 들어, 특정 kvset의 기존 키 블록의 엔트리에 의해 참조됨)을 삭제하는 단계는 : 키-값 저장소 트리 데이터 구조의 각각의 특정 리프 노드에 대해, 특정 리프 노드와 관련된 (예를 들어, kvset에 의해 포함된) 임의의 값 블록에 할당된 최대 데이터 생성 번호를 결정함으로써 최대 데이터 생성 번호 세트를 결정하는 단계; 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하는 단계; 및 가장 작은 데이터 생성 번호보다 작은 특정 데이터 생성 번호가 있는 경우 값 블록을 삭제하는 단계를 포함한다. 전술한 동작은 본 출원에서 총칭하여 키-값 압축 (kv-compaction)으로 지칭될 수 있으며, 이는 쓸모 없는 키 블록 및 값 블록 및 쓸모 없는 키 블록 및 값 블록에 의해 점유된 사용 가능한 자원 (예를 들어, 데이터의 매체 블록)을 제거하기 위한 가비지 컬렉션의 한 형태로 간주될 수 있다.
kvset 시퀀스의 병합에 이어, 키 병합 이동 동작은 병합된 kvset를 분할 kvset의 세트로 파티션(partition)할 수 있으며, 여기서 각각의 분할 kvset는 자식 노드 세트의 다른 자식 노드를 의미한다. 예를 들어, 병합된 kvset는 병합된 kvset의 키 블록을 노드의 하나 이상의 자식 노드로의 결정론적인 매핑에 기반하여 파티션될 수 있다. 따라서, 병합된 kvset는 병합된 kvset로부터 하나 이상의 키 블록을 포함하는 kvset를 수신 (예를 들어, 추가)할 각각의 자식 노드에 대해 분할된 kvset가 생성되고 주어진 자식 노드에 할당된 분할 kvset는 (예를 들어, 추가될) 결정론적 매핑 (예를 들어, 본 출원에서 설명된 매핑 값)에 기초하여 주어진 자식 노드에 매핑되는 키 블록만을 포함할 것이다. 따라서, 병합된 kvset에 포함된 키 블록에 따라, 병합된 kvset를 파티션하는 것은 키 블록의 결정론적인 매핑에 기초하여 노드의 모든 자식 노드 보다 (예를 들어, 하나의 자식 노드에 대해 하나의 분할 kvset 만) 적은 수의 분할 kvset를 포함하는 분할 kvset 세트로 귀결될 수 있다. 결국, 키 병합 이동 동작은 분할된 kvset를 노드의 하나 이상의 자식 노드로 이동할 수 있다 (예를 들어, 결정론적 매핑에 따라). 특정 자식 노드로 특정 분할 kvset를 이동하는 것은 특정 자식 노드의 새로운 kvset로서 특정 자식 노드에 분할 kvset를 추가하는 것을 포함할 수 있다. 병합된 kvset의 모든 키 블록이 단일 자식 노드에 매핑되는 일부 실시예에 따르면, 파티션 단계는 스킵(skip)될 수 있고 병합된 kvset는 파티션할 필요 없이 단일 자식 노드로 이동 (예를 들어, 추가)될 수 있다.
병합된 kvset에 대해 생성된 새로운 값 블록 세트에 대한 데이터 생성 번호의 할당은 동작 (예를 들어, 가비지 컬렉션 동작) 동안 실시예에서 사용되어 KVS 트리의 리프 노드와 관련된 하나 이상의 쓸모 없는 값 블록에 의해 점유된 메모리 공간 (예를 들어, 데이터 스토리지 매체 공간)을 회수할 수 있다. 예를 들어, 가비지 컬렉션 프로세스 동안, KVS 트리의 내부 노드와 연관된 임의의 값 블록은 연관된 데이터 생성 번호가 KVS 트리의 각각의 리프 노드에서 조사된 가장 큰 (예를 들어, 최대) 데이터 생성 번호 세트에서 발견된 가장 낮은 (예를 들어, 최소) 데이터 퇴화(degeneration) 번호보다 작으면 삭제될 수 있다. 따라서, 값 블록의 삭제는 키 병합 이동 동작이 병합되어 kvset를 리프 노드로 이동하는 경우에만 한정되지 않을 수 있다.
일부 실시예에 따르면, (키 병합 이동 동작에 의해) 하나 이상의 자식 노드로 이동된 분할 kvset는 분할된 kvset가 생성되었던 병합된 kvset를 원자 적으로 대체하고 그에 논리적으로 동등하다. 키 병합 이동 동작은 병합된 kvset를 함유하는 주어진 노드의 하나 이상의 자식 노드에 분할 kvset를 배포하는 결정론적 기술을 사용할 수 있다. 키 병합 이동 동작은 이러한 키 배포 방법을 사용하여 주어진 노드 및 지정된 키 K에 대해 키 병합 이동 동작이 항상 해당 노드의 동일한 자식 노드에 키 K와 함께 키-값 쌍 (또는 삭제 표시)를 기록하게 할 수 있다. 배포 방법의 예는 기수 기반 키 배포 방법을 포함할 수 있다.
일부 실시예에서, 키 병합 이동 동작은 키를 프로세싱하고 KVS 트리에 대한 결정론적 매핑에 대응하는 매핑 값 (예를 들어, 이동 또는 유출 값)을 생성한다. 일부 실시예에서, 키 병합 이동 동작은 키 및 현재 트리 레벨 둘 모두를 프로세싱하고 해당 현재 트리 레벨에서 키에 대한 부모 또는 자식 노드에 특정한 매핑 값을 생성한다. 결정론적 매핑은 키가 주어지면 동작 (예를 들어, 검색 또는 이동 압축 동작)이 KVS 트리의 콘텐츠에 관계없이 키-값 쌍이 매핑될 자식 노드를 알 수 있도록 보장할 수 있다.
본 출원에 설명된 키 병합 이동에 관한 동작을 수행하는 시스템의 일부 예가 본 출원에 개시된다.
도 1은 본 개시의 일부 예에 따른 메모리 서브 시스템 (110)을 포함하는 예시적인 컴퓨팅 환경 (100)을 도시한다. 메모리 서브 시스템 (110)은 메모리 컴포넌트 (112A 내지 112N)와 같은 매체를 포함할 수 있다. 메모리 컴포넌트 (112A 내지 112N)는 휘발성 메모리 디바이스, 비 휘발성 메모리 디바이스, 또는 이들의 조합일 수 있다. 일부 실시예에서, 메모리 서브 시스템 (110)은 저장 시스템이다. 스토리지 시스템의 예는 SSD이다. 일부 실시예에서, 메모리 서브 시스템 (110)은 하이브리드 메모리/스토리지 시스템이다. 일반적으로, 컴퓨팅 환경 (100)은 메모리 서브 시스템 (110)을 사용하는 호스트 시스템 (120)을 포함할 수 있다. 예를 들어, 호스트 시스템 (120)은 메모리 서브 시스템 (110)에 데이터를 기록하고 메모리 서브 시스템 (110)으로부터 데이터를 판독할 수 있다.
호스트 시스템 (120)은 데스크탑 컴퓨터, 랩톱 컴퓨터, 네트워크 서버, 모바일 디바이스, 또는 메모리 및 프로세싱 디바이스를 포함하는 그러한 컴퓨팅 디바이스와 같은 컴퓨팅 디바이스일 수 있다. 호스트 시스템 (120)은 호스트 시스템 (120)이 메모리 서브 시스템 (110)으로부터 데이터를 판독하거나 데이터를 기록할 수 있도록 메모리 서브 시스템 (110)을 포함하거나 이에 결합될 수 있다. 호스트 시스템 (120)은 물리적 호스트 인터페이스를 통해 메모리 서브 시스템(110)에 결합될 수 있다. 본 출원에서 사용되는 "결합된(coupled)"은 일반적으로 전기, 광학, 자기, 기타 등등과 같은 연결을 포함하여 유선이든 무선이든 간에 간접 통신 연결 또는 직접 통신 연결 (예를 들어, 중간 컴포넌트 없음)일 수 있는 컴포넌트 간의 연결을 의미한다. 물리적 호스트 인터페이스의 예는 SATA (Serial Advanced Technology Attachment) 인터페이스, PCIe (Peripheral Component Interconnect Express) 인터페이스, USB (Universal Serial Bus) 인터페이스, 파이버 채널(Fibre Channel) 인터페이스, SAS (Serial Attached SCSI) 인터페이스 등을 포함한다. 물리적 호스트 인터페이스는 호스트 시스템 (120)과 메모리 서브 시스템 (110) 사이에서 데이터를 송신하는데 사용될 수 있다. 호스트 시스템 (120)은 메모리 서브 시스템 (110)이 PCIe 인터페이스에 의해 호스트 시스템 (120)과 결합될 때 메모리 컴포넌트 (112A 내지 112N)에 액세스하기 위해 NVM Express (NVMe) 인터페이스를 추가로 활용할 수 있다. 물리적 호스트 인터페이스는 메모리 서브 시스템 (110)과 호스트 시스템 (120) 사이에 제어, 어드레스, 데이터 및 다른 신호를 전달하기 위한 인터페이스를 제공할 수 있다.
메모리 컴포넌트 (112A 내지 112N)는 상이한 유형의 비 휘발성 메모리 컴포넌트 및/또는 휘발성 메모리 컴포넌트의 임의의 조합을 포함할 수 있다. 비 휘발성 메모리 컴포넌트의 예는 NAND(negative-and) 유형 플래시 메모리를 포함한다. 메모리 컴포넌트 (112A 내지 112N) 각각은 단일 레벨 셀 (SLC) 또는 다수의 레벨 셀 (MLC) (예를 들어, TLC 또는 QLC)과 같은 메모리 셀의 하나 이상의 어레이를 포함할 수 있다. 일부 실시예에서, 특정 메모리 컴포넌트는 메모리 셀의 SLC 부분 및 MLC 부분 둘 모두를 포함할 수 있다. 메모리 셀들 각각은 호스트 시스템 (120)에 의해 사용되는 하나 이상의 데이터 비트 (예를 들어, 데이터 블록)를 저장할 수 있다. NAND 형 플래시 메모리와 같은 비 휘발성 메모리 컴포넌트가 설명되지만, 메모리 컴포넌트 (112A 내지 112N)는 휘발성 메모리와 같은 다른 유형의 메모리를 기반으로 할 수 있다. 일부 실시예에서, 메모리 컴포넌트 (112A 내지 112N)는 랜덤 액세스 메모리 (RAM), 판독 전용 메모리 (ROM), 동적 랜덤 액세스 메모리 (DRAM), 동기식 동적 랜덤 액세스 메모리 (SDRAM), 위상 변화 메모리 (PCM), 자기 저항 랜덤 액세스 메모리 (MRAM), NOR(negative-or) 플래시 메모리, 전기적으로 소거할 수 있는 프로그래밍 가능 판독 전용 메모리 (EEPROM) 및 비 휘발성 메모리 셀의 교차점(cross-point) 어레이일 수 있지만 이에 제한되지는 않는다. 비 휘발성 메모리 셀의 교차점 어레이는 스택형 교차 그리드 데이터 액세스 어레이와 함께 벌크 저항의 변화를 기반으로 비트 스토리지를 수행할 수 있다. 추가적으로, 많은 플래시 기반 메모리와 달리, 교차점 비 휘발성 메모리는 비 휘발성 메모리 셀을 미리 삭제하지 않고도 비 휘발성 메모리 셀을 프로그래밍할 수 있는 제자리 기록(write-in-place) 동작을 수행할 수 있다. 또한, 메모리 컴포넌트 (112A 내지 112N)의 메모리 셀은 데이터를 저장하는데 사용되는 메모리 컴포넌트의 유닛을 참조할 수 있는 메모리 페이지 또는 데이터 블록으로 그룹화될 수 있다.
메모리 서브 시스템 컨트롤러 (115)는 메모리 컴포넌트 (112A 내지 112N)에서의 데이터 판독, 데이터 기록 또는 데이터 소거와 같은 동작 및 다른 이러한 동작을 수행하기 위해 메모리 컴포넌트 (112A 내지 112N)와 통신할 수 있다. 메모리 서브 시스템 컨트롤러 (115)는 하나 이상의 집적 회로 및/또는 이산 컴포넌트, 버퍼 메모리, 또는 이들의 조합과 같은 하드웨어를 포함할 수 있다. 메모리 서브 시스템 컨트롤러 (115)는 마이크로 컨트롤러, 특수 목적 논리 회로 (예를 들어, FPGA (field programmable gate array), ASIC (application specific integrated circuit) 등), 또는 다른 적절한 프로세서일 수 있다. 메모리 서브 시스템 컨트롤러 (115)는 로컬 메모리 (119)에 저장된 지침을 실행하도록 구성된 프로세서 (프로세싱 디바이스) (117)를 포함할 수 있다. 예시된 예에서, 메모리 서브 시스템 컨트롤러 (115)의 로컬 메모리 (119)는 메모리 서브 시스템 (110)과 호스트 시스템 (120) 사이의 통신 처리를 포함하여, 메모리 서브 시스템 (110)의 동작을 제어하는 다양한 프로세스, 동작, 논리 흐름 및 루틴을 수행하기 위한 지침을 저장하도록 구성된 임베디드 메모리를 포함한다. 일부 실시예에서, 로컬 메모리 (119)는 메모리 포인터, 페치된 데이터 등을 저장하는 메모리 레지스터를 포함할 수 있다. 로컬 메모리 (119)는 또한 마이크로 코드를 저장하기 위한 판독 전용 메모리 (ROM)를 포함할 수 있다. 도 1의 예시적인 메모리 서브 시스템 (110)은 메모리 서브 시스템 컨트롤러 (115)를 포함하는 것으로 예시되었지만, 본 개시의 다른 실시예에서, 메모리 서브 시스템 (110)은 메모리 서브 시스템 컨트롤러 (115)를 포함하지 않을 수 있고, 대신 외부 제어에 의존할 수 있다 (예를 들어, 제공된 외부 호스트에 의해, 또는 메모리 서브 시스템 (110)과 분리된 프로세서 또는 컨트롤러에 의해).
일반적으로, 메모리 서브 시스템 컨트롤러 (115)는 호스트 시스템 (120)으로부터 명령 또는 동작을 수신할 수 있고, 명령 또는 동작을 명령 또는 적절한 지침으로 변환하여 메모리 컴포넌트 (112A 내지 112N)에 대한 원하는 액세스를 달성할 수 있다. 메모리 서브 시스템 컨트롤러 (115)는 웨어 레벨링 동작(wear leveling operation), 가비지 컬렉션 동작, 에러 검출 및 에러 정정 코드 (ECC) 동작, 암호화 동작, 캐싱 동작 및 메모리 컴포넌트 (112A 내지 112N)와 연관된 물리적 블록 어드레스와 논리적 블록 어드레스 간의 어드레스 변환과 같은 다른 동작을 담당할 수 있다. 메모리 서브 시스템 컨트롤러 (115)는 물리적 호스트 인터페이스를 통해 호스트 시스템 (120)과 통신하기 위한 호스트 인터페이스 회로부를 더 포함할 수 있다. 호스트 인터페이스 회로부는 메모리 컴포넌트 (112A 내지 112N)에 액세스하기 위해 호스트 시스템 (120)으로부터 수신된 명령을 명령 지침으로 변환할 수 있고 뿐만 아니라 메모리 컴포넌트 (112A 내지 112N)와 관련된 응답을 호스트 시스템 (120)에 대한 정보로 변환할 수 있다.
메모리 서브 시스템 (110)은 또한 도시되지 않은 추가 회로부 또는 컴포넌트를 포함할 수 있다. 일부 실시예에서, 메모리 서브 시스템 (110)은 메모리 서브 시스템 컨트롤러 (115)로부터 어드레스를 수신하고 메모리 컴포넌트 (112A 내지 112N)에 액세스하기 위한 어드레스로 디코딩할 수 있는 캐시 또는 버퍼 (예를 들어, DRAM) 및 어드레스 회로부 (예를 들어, 행 디코더 및 열 디코더)를 포함할 수 있다.
메모리 컴포넌트 (112A 내지 112N) 중 임의의 하나는 메모리 컴포넌트의 메모리 셀을 관리하고, 메모리 서브 시스템 컨트롤러 (115)와 통신하고 메모리 서브 시스템 컨트롤러 (115)로부터 수신된 메모리 요청 (예를 들어, 판독 또는 기록)을 실행하기 위한 매체 컨트롤러 (예를 들어, 매체 컨트롤러 (113A 및 매체 컨트롤러 113N))를 포함할 수 있다.
호스트 시스템 (120)은 메모리 컴포넌트 (112A 내지 112N) 중 하나 이상에 의해 구현된 데이터 스토리지 매체(예를 들어, 매체 풀)에 저장된 KVS 트리에 대해 본 출원에 설명된 키 병합 이동 동작을 수행하는데 사용될 수 있는 키-값 저장소 (KVS) 트리를 위한 키 병합 이동 컴포넌트 (122)를 포함한다. 데이터 스토리지 매체에 저장된 KVS 트리는 호스트 시스템(120)에 의해, 메모리 서브 시스템 (110)에 의해 (예를 들어, 호스트 시스템 (120)의 요청에 따라 메모리 서브 시스템 컨트롤러 (115)에 의해) 또는 이들의 일부 조합에 의해 생성된 거일 수 있다. 실시예에 따른, 키 병합 이동 컴포넌트 (122)는 호스트 시스템 (120)상의 애플리케이션 또는 운영 체제 (예를 들어, 메모리 서브 시스템 (110)에 대한 운영 체제 소프트웨어 드라이버)의 일부일 수 있다. 일부 실시예에서, 메모리 서브- 시스템 (110)은 키 병합 이동 컴포넌트 (122)의 적어도 일부를 포함한다. 예를 들어, 메모리 서브 시스템 컨트롤러 (115)는 본 출원에서 설명된 동작을 수행하기 위해 로컬 메모리 (119)에 저장된 지침을 실행하도록 구성된 프로세서 (117) (예를 들어, 프로세싱 디바이스)를 포함할 수 있다. 본 출원에 언급된 바와 같이, 키 병합 이동 동작은 kvset의 값 블록의 재기록을 지연시키면서 kvset의 키 블록을 병합함으로써 KVS 트리의 주어진 노드 내에서 kvset를 병합할 수 있으며, 결과적으로 병합된 kvset의 일부를 KVS 트리의 하나 이상의 자식 노드로 배치하기 위해 KVS 트리를 횡단할 수 있다.
키 병합 이동 컴포넌트 (122)는 지정된 또는 계산된 기준을 충족하는 주어진 노드 내의 하나 이상의 kvset에 관한 조건을 포함할 수 있는 조건 (예를 들어, 트리거링 조건)을 검출한 것에 응답하여 키 병합 이동 동작을 수행할 수 있다. 이러한 kvset 관련 기준의 예는 주어진 노드 내의 kvset의 수, 주어진 노드에 의한 새로운 kvset 추가 (예를 들어, 수집) (예를 들어, 주어진 노드의 부모 노드에서 주어진 노드로 kvset를 이동한 결과), 주어진 노드에 대한 자원 (예를 들어, 매체 블록) 해제, 주어진 노드 내에서 하나 이상의 kvset의 총 크기, 또는 가비지 켈렉션에 사용할 수 있는 하나 이상의 kvset에 있는 데이터의 양을 포함하지만 이에 제한되지 않는다. 조건의 다른 예는 KVS 트리의 하나 이상의 노드에 대해 키 병합 이동 동작을 개시하기 위한 요청 (예를 들어, 호스트 시스템의 운영 체제 또는 소프트웨어 애플리케이션으로부터)을 수신하는 것을 제한없이 포함하고, 요청은 kvset의 전체 시퀀스 또는 kvset의 서브 시퀀스가 동작할지 여부를 지정할 수도 있다.
실시예에 따른, 키 병합 이동 컴포넌트 (122)는 메모리 서브 시스템 (110) (예를 들어, 메모리 서브 시스템 컨트롤러 (115))가 키 병합 이동 컴포넌트 (122)와 관련하여 본 출원에서 설명된 동작을 수행하게 하는 로직 (예를 들어, 펌웨어와 같은 기계 지침 세트) 또는 하나 이상의 컴포넌트를 포함할 수 있다. 키 병합 이동 컴포넌트 (122)는 본 출원에서 설명된 동작을 수행할 수 있는 유형 유닛을 포함할 수 있다. 키 병합 이동 컴포넌트(122)의 동작에 관한 추가 세부 사항이 이하에서 설명된다.
도 2는 본 개시의 일부 구현들에 따른 KVS 트리 (200)에 대한 예시적인 키 병합 이동 컴포넌트 (이하, 키 병합 이동 컴포넌트 (200))의 블록도이다. 도시된, 키 병합 이동 컴포넌트 (200)는 키 기반 키-값 세트 병합기(merger) (210), 키-값 세트 분할기(splitter) (220) 및 키-값 세트 이동기(mover) (230)를 포함한다. 일부 실시예에서, 키 병합 이동 컴포넌트 (200)는 도 2에 예시된 것 보다 컴포넌트 또는 배열 (예를 들어, 더 적거나 더 많은 컴포넌트)이 다를 수 있다.
본 출원에 언급된 바와 같이, 키 병합 이동 컴포넌트 (200)에 의해 동작되는 KVS 트리는 키-값 쌍으로서 데이터 (예를 들어, 사용자 데이터)의 저장을 가능하게 하기 위해 메모리 서브 시스템 (예를 들어, 110)에 저장될 수 있다. KVS 트리는 키-값 저장소 (KVS) 데이터 베이스를 형성하는 복수의 KVS 트리의 일부일 수 있고, 이는 이종(heterogeneous) kvset를 포함하는 베이스 레벨과 각각 동종 kvset를 포함하는 두 개 이상의 KVS 서브 트리의 루트 노드(따라서, 시작)를 포함하는 제 2 레벨을 가진 멀티 레벨 트리를 포함할 수 있다. KVS 트리는 호스트 시스템 (예를 들어, 110), 메모리 서브 시스템 (예를 들어, 110) 또는 이들의 일부 조합에 의해 생성될 수 있다. KVS 트리는 메모리 컴포넌트의 세트 상에 생성되어 KVS 트리는 노드의 세트를 포함할 수 있고, 노드 세트의 노드가 kvset의 시퀀스를 포함하고, kvset의 시퀀스의 kvset는 하나 이상의 키를 저장하기 위한 키 블록의 세트 및 하나 이상의 값을 저장하기 위한 값 블록 세트를 포함한다. kvset의 시퀀스는 시퀀스에서 이전에 추가된 kvset가 최근에 추가된 kvset에 비해 더 오래된 데이터 (예를 들어, 키-값 쌍)를 나타내도록 일시적으로 순서가 정해질 수 있다.
키 기반 키-값 세트 병합기 (210)는 주어진 노드의 자식 노드 세트가 리프 노드를 포함하는지 여부에 따라 주어진 노드의 kvset의 시퀀스를 병합 (예를 들어, 압축)하여 병합된 kvset를 생성한다. 따라서, 주어진 노드에 대해 키 병합 이동 컴포넌트 (200)에 의해 키 병합 이동이 개시되면 (예를 들어, 주어진 노드에서 자식 노드 중 하나로 kvset의 시퀀스를 병합 (예를 들어, 압축) 및 이동 (예를 들어, 유출) 하기 위한 조건의 만족에 기초하여 키 병합 이동 컴포넌트 (200)에 의해 트리거 됨)), 키 기반 키-값 세트 병합기 (210) (또는 키 병합 이동 컴포넌트 (200)의 내부 또는 외부에 있는 일부 다른 컴포넌트)는 주어진 노드의 노드의 자식 세트가 리프 노드를 포함하는지 여부를 결정할 수있다.
자식 노드 세트가 리프 노드를 포함하지 않는다는 결정에 응답하여 (예를 들어, 세트 내의 자식 노드 중 어느 것도 리프 노드가 아님), 키 기반 키-값 세트 병합기 (210)는 병합된 kvset를 생성하기 위해 노드의 kvset 시퀀스를 병합할 수 있고, 결과 병합된 kvset는 kvset 시퀀스의 기존 값 블록 (예를 들어, 이전에 생성된 값 블록) 세트를 참조하는 새로운 키 블록 세트를 포함한다. 예를 들어, 본 출원에 언급된 바와 같이, 새로운 키 블록 세트는 기존 키 블록 세트의 값 (예를 들어, 키 값 및 기존 값 블록에 대한 참조)을 새로운 키 블록 세트로 복사함으로써 생성될 수 있다. 새로운 키-값 블록 세트에 의해 참조되지 않는 kvset 시퀀스의 기존 값 블록은 보유되지만 (예를 들어, 삭제되지 않음) 참조되지 않은 것으로 간주되고 상이한 kvset의 두 키 블록 (예를 들어, KVS 트리의 내부 노드의 두 개의 kvset)에 의해 공유될 수 있다. 새로운 키 블록 세트가 생성된 후, 키 병합 이동 동작은 노드에서 키-값 세트 시퀀스에서 각각의 특정 키-값 세트를 삭제하고, 각각의 특정 키-값 세트의 모든 키 블록을 삭제하고, 각각의 특정 키-값 세트의 모든 값 블록을 그대로 남겨 둔다 (예를 들어, 있는 그대로 유지). 보존된 값 블록은 새로운 키 블록 세트에 의해 참조되는 값 블록, 새로운 키 블록 세트 중 임의의 것에 의해 참조되지 않는 값 블록 또는 둘 모두를 포함할 수 있다. kvset 시퀀스의 모든 값 블록 (있는 그대로 유지됨)은 병합된 kvset로 이동될 수 있다.
대안적으로, 자식 노드 세트가 하나 이상의 리프 노드만을 포함한다고 결정한 것에 응답하여, 키 기반 키-값 세트 병합기 (210)는 병합된 kvset를 생성하기 위해 주어진 노드의 kvset의 시퀀스를 병합할 수 있어서, 결과적으로 병합된 kvset가 새로운 값 블록들의 세트를 참조하는 새로운 키 블록들의 세트를 포함하고, 여기서 새 키 블록은 kvset 시퀀스의 기존 키 블록 세트를 기반으로 생성되고 새 값 블록 세트는 kvset 시퀀스의 기존 값 블록 세트를 기반으로 생성된다. 예를 들어, 본 출원에서 언급된, 기존 키 블록 세트의 값 (예를 들어, 키 값)을 새로운 세트에 복사하고, 및 (새로운 키 블록 세트에서) 새로운 키 블록이 기존 키 블록 세트에 의해 참조되는 기존 블록에 대응하는 (새로운 값 블록 세트에서) 각각 새로운 값 블록을 참조하게 함으로써 새로운 키 블록 세트가 kvset 시퀀스의 기존 키 블록 세트에 기초하여 생성될 수 있다. 새로운 값 블록 세트는 기존 값 블록 세트의 임의의 값 블록에 할당된 가장 큰 (예를 들어, 최대) 데이터 생성 번호가 할당 (예를 들어, 상속)될 수 있다.
추가적으로, 자식 노드 세트가 적어도 하나의 리프 노드 및 적어도 하나의 비-리프 노드를 포함한다는 결정에 응답하여 (예를 들어, KVS 트리는 불균형이므로, 자식 노드 세트는 리프 노드와 비 리프 노드의 혼합을 포함할 수 있다), 키 기반 키-값 세트 병합기 (210)는 노드의 kvset 시퀀스를 병합하여 제 1 병합된 kvset 및 제 2 병합된 kvset를 생성할 수 있다. 이러한 일부 실시예에 대해, 제 1 병합된 kvset는 kvset 시퀀스의 기존 값 블록 세트를 참조하는 새로운 키 블록의 제 1 세트를 포함하며, 여기서, 새로운 키 블록의 제 1 세트 내의 키(들)는 (예를 들어, 결정론적 매핑에 기초하여) 하나 이상의 비-리프 노드에 매핑되고, 제 2 병합된 kvset는 새로운 값 블록 세트를 참조하는 새로운 키 블록의 제 2 세트를 포함하고, 여기서 제 2 새로운 키 블록 세트 내의 키는 하나 이상의 리프 노드에 매핑된다 (예를 들어, 결정론적 매핑에 기반하여). 본 출원에 언급된 바와 같이, 제 2 병합된 kvset에 대한 새로운 값 블록 세트는 기존 값 블록 세트에서 임의의 값 블록에 할당된 가장 큰 (예를 들어, 최대) 데이터 생성 번호가 할당 (예를 들어, 상속)될 수 있다.
새로운 키 블록 세트 및 새로운 값 블록 세트가 생성된 후, 일부 실시예에서, 키 기반 키-값 세트 병합기 (210)는 주어진 노드로부터 kvset의 시퀀스에서 각각의 특정 kvset를 삭제하고, 이는 특정 kvset의 모든 키 블록 (예를 들어, 기존의 모든 값 블록)을 삭제하는 것을 포함하고, 이는 개별 데이터 생성 번호에 기초하여 값 블록 (예를 들어, 특정 kvset의 기존 키 블록의 엔트리에 의해 참조되는 하나 이상의 기존 값 블록)을 삭제하는 단계를 더 포함한다. 값 블록 삭제와 관련하여, 키 기반 키-값 세트 병합기 (210)는 : 키-값 저장소 트리 데이터 구조의 각각의 특정 리프 노드에 대해, 특정 리프와 관련된 (예를 들어, kvset에 의해 포함된) 임의의 값 블록에 할당된 가장 큰 데이터 생성 번호를 결정함으로써 가장 큰 데이터 생성 번호 세트를 결정하고; 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하고; 및 가장 작은 데이터 생성 번호보다 작은 특정 데이터 생성 번호를 갖는 경우 값 블록을 삭제함으로써 개별 데이터 생성 번호에 기초하여 값 블록을 삭제할 수 있다. 실시예에 따른, 키 기반 키-값 세트 병합기 (210)는 주어진 시퀀스의 kvset를 삭제할 때 한 번만 가장 큰 데이터 생성 번호 세트를 결정할 수 있다.
키-값 세트 분할기 (220)는 병합된 kvset (키 기반 키-값 세트 병합기 (210)에 의해 생성됨)을 분할된 kvset의 세트로 파티션하고, 여기서 각각의 분할된 kvset는 자식 노드 세트의 다른 자식 노드를 의미한다. 본 출원에 언급된 바와 같이, 병합된 kvset는 노드의 하나 이상의 자식 노드에 대한 병합된 kvset의 키 블록 (예를 들어, 키 블록의 기수 기반 키 배포)의 결정론적 매핑에 기초하여 파티션될 수 있다. 따라서, 키-값 세트 분할기 (220)는 병합된 kvset로부터 하나 이상의 키 블록을 포함하는 kvset를 수신 (예를 들어, 추가하기 위해)하는 각각의 자식 노드에 대해 분할된 kvset가 생성되도록 병합된 kvset를 파티션할 수 있어서 주어진 자식 노드에 할당된 (예를 들어, 추가될) 분할 kvset는 결정론적 매핑에 기반하여 주어진 자식 노드에 매핑되는 키 블록 만을 포함할 것이다. 예를 들어, 키-값 세트 분할기 (220)는 병합된 kvset 및 주어진 노드의 현재 트리 레벨로부터 특정 키 블록의 키를 프로세싱하고 현재 트리 레벨에서 키에 대한 (주어진 노드의) 자식 노드 중 하나에 특정한 매핑 값 (예를 들어, 이동 또는 유출 값)을 생성할 수 있다. 따라서, 매핑 값을 사용하여, 키-값 세트 분할기 (220)는 어떤 분할 kvset (각각 다른 자식 노드에 해당)가 병합된 kvset로부터 어떤 키 블록을 수신하는지를 결정할 수 있다. 일부 실시예에서, 병합기 (210)는 비-리프 노드를 위한 제 1 병합된 kvset를 생성하고, 리프 노드를 위한 제 2 병합된 kvset를 생성하고, 키-값 세트 분할기 (220)는 제 1 병합된 kvset를 분할 kvset의 제 1 세트로 파티션하고 제 2 병합된 kvset를 제 2 세트로 파티션하고, 여기서, 각각의 분할 kvset는 자식 노드 세트의 상이한 자식 노드를 의미한다.
키-값 세트 이동기 (230)는 (키-값 세트 분할기 (220)에 의해 생성된) 분할 kvset의 세트 내의 각각의 분할 kvset를 키 블록의 결정론적 매핑에 따라 주어진 노드의 대응하는 자식 노드로 이동 (예를 들어, 유출)시킨다. 이것은 키-값 세트 분할기 (220)가 전술한 바와 같이 분할 kvset의 제 1 세트 및 분할 kvset의 제 2 세트를 생성하는 경우와 유사할 수 있다. 일부 실시예에서, 주어진 분할 kvset를 분할 kvset 세트로부터 그 대응하는 자식 노드로 이동시키는 것은 주어진 분할 kvset를 대응하는 자식 노드 (예를 들어, 자식 노드의 kvset 시퀀스에)에 새로운 kvset로서 추가하는 것을 포함한다.
본 출원에 언급된 바와 같이, 병합된 kvset의 모든 키 블록이 노드의 하나의 자식 노드에 매핑되는 일부 실시예의 경우, 키-값 세트 분할기 (220)에 의해 병합된 kvset의 파티션이 스킵되고 키-값 세트가 이동기 (230)는 KVS 트리의 결정론적 매핑에 기초하여 병합된 kvset를 하나의 자식 노드로 이동시킨다.
도 3 내지 도 5는 본 개시의 일부 구현에 따른 키 병합 이동을 위한 예시적인 방법의 흐름도이다. 도 3 내지 5의 방법 (300, 400, 500) 중 임의의 방법은 하드웨어 (예를 들어, 프로세싱 디바이스, 회로부, 전용 로직, 프로그램 가능 로직, 마이크로 코드, 디바이스의 하드웨어, 집적 회로 등), 소프트웨어 (예를 들어, 프로세싱 디바이스에서 실행 또는 수행되는 지침) 또는 이들의 조합을 포함할 수 있는 프로세싱 로직에 의해 수행될 수 있다. 일부 실시예에서, 도 3 내지 5의 하나 이상의 방법 (300, 400, 500)은 도 1의 호스트 시스템 (120)에 의해 수행된다. 이들 실시예에서, 방법 (300, 400, 500)은 키 병합 이동 컴포넌트 (122)에 의해 적어도 부분적으로 수행될 수 있다. 대안으로, 도 3 내지 5의 하나 이상의 방법은 도 1의 메모리 서브 시스템 (110)에 의해 수행된다 (예를 들어, 메모리 서브 시스템 컨트롤러 (115)의 프로세서). 프로세스가 특정 시퀀스 또는 순서로 표시되지만 달리 지정하지 않는 한 프로세스의 순서가 수정될 수 있다. 따라서, 예시된 실시예는 단지 예시로서 이해되어야 하며, 예시된 프로세스는 상이한 순서로 수행될 수 있고, 일부 프로세스는 병렬로 수행될 수 있다. 추가로, 하나 이상의 프로세스는 다양한 실시예에서 생략될 수 있다. 따라서, 모든 실시예에서 모든 프로세스가 필요한 것은 아니다. 다른 프로세스 흐름이 가능하다. 도 3 내지 도 5의 방법 (300, 400, 500)의 동작은 KVS 트리의 2 개 이상의 노드에 대해 동시에 수행될 수 있다.
이제 도 3의 방법 (300)을 참조하여, 동작 (305)에서 호스트 시스템 (예를 들어, 120)의 프로세싱 디바이스는 메모리 서브 시스템 (예를 들어, 110) 상에서 노드 세트를 포함하는 키-값 저장소 트리 데이터 구조 (KVS 트리)를 생성하고, 여기서 각각의 노드는 일련의 키-값 세트 (kvset)의 시퀀스를 포함하고, kvset 시퀀스의 kvset는 하나 이상의 키를 저장하기 위한 키 블록 세트와 하나 이상의 값을 저장하기 위한 값 블록 세트를 포함한다. 대안적으로, KVS 트리는 (예를 들어, 다른 프로세스에 의해) 이미 생성될 수 있고, 일부 실시예의 경우, KVS 트리는 동작 (305)에서 액세스되며, 여기서, KVS 트리에 액세스하는 것은 방법 (300) (예를 들어, 동작 (310))의 후속 동작을 도울 수 있다.
동작 (310)에서, 호스트 시스템의 프로세싱 디바이스는 kvset들의 시퀀스를 병합하고 주어진 노드로부터 주어진 노드의 자식 노드들의 세트로 이동시키기 위한 조건 (예를 들어, 트리거 조건)을 검출한다. 본 출원에 언급된 바와 같이, 예시적인 조건은 주어진 노드 내의 kvset의 수, 주어진 노드에 의한 새로운 kvset의 추가 (예를 들어, 수집), 주어진 노드에 대한 자원 (예를 들어, 매체 블록)의 해제, 주어진 노드 내에서 하나 이상의 kvset의 총 크기 또는 가비지 컬렉션에 사용할 수 있는 하나 이상의 kvset에 있는 데이터의 양과 같은 특정되거나 계산된 kvset 관련 기준을 충족하는 주어진 노드와 관련된 조건을 제한없이 포함할 수 있다. 동작 (315)에서, 호스트 시스템의 프로세싱 디바이스가 (동작 (310)에서) kvset들의 시퀀스를 병합하고 주어진 노드로부터 주어진 노드의 자식 노드들의 세트로 이동시키는 조건을 검출하면, 방법 (300)은 동작 (320)으로 진행한다; 그렇지 않으면 방법 (300)은 동작 (310)으로 리턴한다. 동작 (320)에서, 호스트 시스템의 프로세싱 디바이스는 주어진 노드의 자식 노드들의 세트가 리프 노드를 포함하는지 여부를 결정한다. 일부 실시예에서, KVS 트리는 주어진 노드의 하나의 자식 노드가 리프 노드를 포함한다면, 주어진 노드의 모든 자식 노드가 리프 노드를 포함하도록 구조화된다.
동작 (325)에서, 호스트 시스템의 프로세싱 디바이스는 자식 노드 세트가 리프 노드를 포함하는지 여부에 대한 동작 (320)의 결정에 기초하여 kvset 시퀀스를 자식 노드 세트로 이동시킨다. 일부 실시예에서, 자식 노드 세트가 리프 노드를 포함하는지 여부의 결정에 기초하여 kvset의 시퀀스를 자식 노드 세트로 이동시키는 것은 자식 노드의 세트가 리프 노드를 포함하지 않는다는 결정 (동작 (320)에서)에 응답하여 도 4의 방법 (400)을 수행하는 호스트 시스템의 프로세싱 디바이스 및 자식 노드 세트가 리프를 포함한다는 결정 (동작 (320)에서)에 응답하여 도 5의 방법 (500)을 수행하는 호스트 시스템의 프로세싱 디바이스를 포함한다.
이제 도 4의 방법 (400)을 참조하여, 동작 (405)에서 호스트 시스템의 프로세싱 디바이스는 kvset 시퀀스의 기존 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 kvset를 생성하기 위해 kvset 시퀀스를 병합하고. 여기서, 새로운 키 블록의 세트는 kvset 시퀀스의 기존 키 블록 세트를 기반으로 생성된다. 본 출원에 언급된 바와 같이, 이 새로운 키 블록 세트 내의 키는 주어진 노드의 하나 이상의 비-리프 노드에 매핑될 수 있다(예를 들어, 결정론적 매핑에 기초하여). 일부 실시예에서, 새로운 키 블록 세트는 기존 키 블록 세트의 값 (예를 들어, 키 값 및 기존 값 블록에 대한 참조)을 새로운 값 블록의 세트로 복사함으로써 kvset 시퀀스의 기존 키 블록 세트에 기초하여 생성되고, 따라서, 기존 키 블록 세트와 동일한 기존 값 블록 세트에 대한 참조를 포함하는 새로운 키 블록 세트가 생성된다. 추가로, 일부 실시예에서, (동작 (410)에서 그대로 보존되는) kvset의 시퀀스의 모든 기존 값 블록은 병합된 kvset로 이동된다.
단계 (410)에서, 호스트 시스템의 프로세싱 디바이스는 특정 kvset의 모든 키 블록을 삭제하고 그대로 특정 kvset의 모든 값 블록 (예를 들어, 기존 값 블록)을 남김으로써 주어진 노드로부터 kvset 시퀀스의 각각의 특정 kvset를 삭제한다. 본 출원에 언급된 바와 같이, 특정 kvset의 값 블록은 새로운 키 블록 세트에 의해 참조되는 것들, 새로운 키 블록 세트에 의해 참조되지 않는 것들, 또는 둘 모두의 조합을 포함할 수 있다.
동작 (415)에서, 호스트 시스템의 프로세싱 디바이스는 병합된 kvset (동작 (405)에서 생성됨)을 주어진 노드의 자식 노드 세트로 이동 (예를 들어, 유출)시킨다. 일부 실시예에서, 병합된 kvset를 자식 노드 세트로 이동시키는 것은 먼저 병합된 kvset를 분할된 kvset 세트로 파티션하는 것을 포함하며, 여기서 각각의 분할 kvset는 KVS 트리의 결정론적 매핑 (예를 들어, 본 출원에서 설명된 매핑 값)에 기반한 병합된 kvset의 일부를 수신할 다른 자식 노드 (자식 노드 세트 내)에 할당된다. 본 출원에 언급된 바와 같이, 병합된 kvset에 포함된 키 블록에 따라, 병합된 kvset를 파티션하는 것은 키 블록의 결정론적인 매핑을 기반으로 주어진 노드의 모든 자식 노드보다 적은 수의 분할 kvset를 포함하는 분할 kvset 세트로 귀결될 수 있다 (예를 들어, 하나의 자식 노드에 대해 하나의 분할 kvset 만). 결국, 호스트 시스템의 프로세싱 디바이스는 분할 kvset 세트에 있는 각각의 분할 kvset를 자식 노드 세트의 할당된 자식 노드로 이동시킨다. 일부 실시예에서, 특정 분할 kvset를 특정 자식 노드로 이동시키는 것은 분할 kvset를 특정 자식 노드의 새로운 kvset로서 특정 자식 노드에 추가하는 것을 포함할 수 있다. 일부 실시예에 따르면, 병합된 kvset의 모든 키 블록이 단일 자식 노드에 매핑되는 경우, 파티션 동작은 스킵될 수 있고 병합된 kvset는 파티션할 필요없이 단일 자식 노드로 이동 (예를 들어, 추가)될 수 있다.
이제 도 5의 방법 (500)을 참조하여, 동작 (505)에서, 호스트 시스템의 프로세싱 디바이스는 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 kvset를 생성하기 위해 kvset의 시퀀스를 병합하고, 여기서 새로운 키 블록 세트는 kvset 시퀀스의 기존 키 블록 세트를 기반으로 생성되고, 새로운 값 블록 세트는 kvset의 시퀀스의 기존 값 블록 세트를 기반으로 생성된다. 본 출원에 언급된 바와 같이, 이 새로운 키 블록 세트 내의 키는 주어진 노드의 하나 이상의 리프 노드에 (예를 들어, 결정론적 매핑에 기초하여) 매핑될 수 있다. 일부 실시예에서, 새로운 값 블록 세트는 기존 값 블록 세트의 값을 새로운 값 블록 세트에 복사함으로써 kvset 시퀀스의 기존 값 블록 세트에 기초하여 생성된다. 추가적으로, 일부 실시예에서, 새로운 값 블록 세트에는 기존 값 블록 세트 내의 임의의 값 블록에 할당된 가장 큰 데이터 생성 번호가 할당된다. 새로운 키 블록 세트와 관련하여, 일부 실시예에 따르면, 새로운 키 블록 세트는 기존 키 블록 세트의 값 (예를 들어, 키 값)을 새로운 키 블록 세트에 복사함으로써 그리고 새로운 키 블록 (새 키 블록 세트에 있는)이 기존 키 블록 세트에 의해 참조되는 기존 블록에 대응하는 새로운 값 블록(새로운 값 블록 세트에서)을 개별적으로 참조하게 함으로써 kvset 시퀀스의 기존 키 블록 세트에 기초하여 생성된다. 이러한 방식으로, 새로운 키 블록 세트는 기존 키 블록 세트에 대응하는 새로운 값 블록을 참조하면서 기존 키 블록 세트와 동일한 데이터 콘텐츠 (예를 들어, 키)를 포함할 수 있다.
동작 (510)에서, 호스트 시스템의 프로세싱 디바이스는 KVS 트리의 각각의 특정 리프 노드에 대해, 특정 리프 노드와 관련된 임의의 값 블록에 할당된 가장 큰 데이터 생성 번호를 결정함으로써 (KVS 트리의 리프 노드에 대한) 가장 큰 데이터 생성 번호의 세트를 결정한다. 동작 (515)에서 호스트 시스템의 프로세싱 디바이스는 동작 (510)에서 결정된 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정한다.
동작 (520)에서 호스트 시스템의 프로세싱 디바이스는 kvset 시퀀스의 기존 키 블록(들)을 삭제하고 동작 (515) 동작에서 결정된 가장 작은 데이터 생성 번호보다 작은 데이터 생성 번호를 가진 kvset의 시퀀스의 기존 값 블록(들)을 삭제함으로써 주어진 노드에서 kvset 시퀀스를 삭제한다. 이렇게 하면, 데이터 생성 번호가 가장 작은 데이터 생성 번호 (동작 (515)에서 결정됨) 보다 작지 않은 데이터 생성 번호를 갖는 kvset 시퀀스의 기존 값 블록은 그대로 남아 있을 수 있으며, KVS 트리 내에 여전히 존재하는 적어도 하나의 kvset에 의해 여전히 참조되는 (예를 들어, 공유되는) 기존 값 블록(들)을 나타낼 수 있다. 그대로 남아있는 기존 값 블록(들)은 KVS 트리의 향후 동작 (예를 들어, 키 병합 이동의 향후 실행)에서 결국 삭제될 수 있다. 일부 실시예에서, kvset 시퀀스의 기존 키 블록 및 기존 값 블록의 삭제는 kvset 시퀀스에 의해 포함된 각각의 kvset를 삭제하는 동작 (예를 들어, 동작 (515)에서 수행됨)의 일부로서 수행된다.
동작 (525)에서, 호스트 시스템의 프로세싱 디바이스는 병합된 kvset (동작 (505)에서 생성됨)을 주어진 노드의 자식 노드 세트로 이동 (예를 들어, 유출)시킨다. 다양한 실시예들에 대해, 동작 (525)는 도 4의 방법 (400)과 관련하여 상기에서 설명된 동작 (415)와 유사하다.
도 6은 본 개시의 일부 구현에 따른 키 병합 이동에 의해 동작될 수 있는 예시적인 KVS 트리 (600)를 예시하는 블록도이다. 본 출원에 언급된 바와 같이, KVS 트리 (600)는 트리로 구성된 키-값 데이터 구조를 포함한다. 키-값 데이터 구조로서, 값은 값을 참조하는 해당 키와 함께 KVS 트리 (600)에 저장된다. 특별히, 키 엔트리는 키와 값에 대한 참조와 같은 추가 정보를 모두 함유하는데 사용될 수 있다. 키 자체는 KVS 트리 (600) 내에서 전체 순서화를 가질 수 있고, 따라서, 키는 서로간에 정렬될 수 있다. 키는 서브 키로 분할될 수 있으며 서브 키는 키의 중첩되지 않는 부분이다. 일부 실시예에서, 키의 전체 순서화는 다수의 키 사이에서 유사한 서브 키를 비교하는 것에 기초한다 (예를 들어, 키의 제 1 서브 키가 다른 키의 제 1 서브 키와 비교됨). 추가로, 일부 실시예에서, 키 프리픽스(prefix)는 키의 시작 부분을 포함한다. 사용되는 경우 키 프리픽스는 하나 이상의 서브 키로 구성될 수 있다.
KVS 트리 (600)는 각각 하나 이상의 키-값 세트 (kvset)를 포함하는 노드 (610)와 같은 하나 이상의 노드를 포함한다. 일부 실시예에서, 하나 이상의 노드 (예를 들어, 노드 (610))는 각각 시간적으로 순서화된 kvset 시퀀스를 포함한다. 예시된, kvset (615)는 시퀀스의 최신임을 나타내는 'N' 배지(badge)를 포함하고, kvset (620)는 시퀀스의 가장 오래된 것을 나타내는 'O' 배지를 포함한다. Kvset (625)는 시퀀스에서 중간임을 나타내는 'I' 배지를 포함한다. 이 배지는 전체적으로 kvset에 라벨을 지정하는데 사용된다; 그러나 다른 배지 (예를 들어, 'X')는 물결표 '~'가 아닌 경우 시퀀스에서 해당 위치 (예를 들어, 새로운, 중간, 오래된 등)가 아닌 특정 kvset를 나타내고, 이 경우 단순히 익명의 kvset이다. 아래에서 더 자세히 설명하는, 더 오래된 kvset (더 오래된 키 블록을 갖는)는 KVS 트리 (600)에서 하단에 발생한다. 따라서, kvset를 L1에서 L2로 같은 트리 레벨 아래로 푸시 (예를 들어, 유출)하면 부모 노드의 수신자 자식 노드의 최신 위치에 추가될 부모 노드로부터의 적어도 하나의 새로운 kvset로 귀결된다.
KVS 트리 (600)는 주어진 노드 (예를 들어, 노드 (610))의 kvset 내의 키-값 쌍 (키 블록 및 값 블록에 의해 저장됨)에 대한 주어진 노드의 임의의 하나의 자식 노드로의 결정론적 매핑을 포함한다 (예를 들어, L1의 모든 노드에 의해 표현되는 노드 (610)의 자식 노드 중 어느 하나). KVS 트리 (600)의 결정론적 매핑은 키가 주어지면, 외부 엔티티가 KVS 트리 (600)의 콘텐츠를 알지 못해도 KVS 트리 (600)의 노드를 통해 키 블록 및 키에 대한 값 블록 (키-값 쌍의)으로의 경로를 추적할 수 있음을 의미할 수 있다. 예를 들어, 이것은 예를 들어, B-트리와는 다르고, 트리의 콘텐츠는 검색에 최적화된 트리의 구조를 유지하기 위해 주어진 키의 값이 어디에 속하는지 결정한다. 대조적으로, KVS 트리 (600)의 결정론적 매핑은 예를 들어, 키가 주어지면 최대 트리 레벨 (예를 들어, 트리 깊이)이 현재 L1에만 있는 경우에도 키가 매핑되는 L3에서 자식 노드를 계산할 수 있는 규칙을 제공할 수 있다. 일부 실시예에서, 결정론적 매핑은 키 부분의 해시(hash) 부분을 포함한다. 서브 키는 매핑 세트에 도달하기 위해 해시될 수 있으며, 매핑 세트의 일부는 임의의 주어진 트리 레벨에 사용될 수 있다. 실시예에 따른, 키의 일부는 전체 키를 포함할 수 있다.
일부 실시예에서, 해시는 해시의 일부를 포함하는 다수의 중첩되지 않는 부분을 포함한다. 예를 들어, 다수의 중첩되지 않는 부분들 각각은 트리의 레벨에 대응할 수 있다. 해시의 부분은 노드의 레벨에 의해 다수의 중첩되지 않는 부분으로부터 결정될 수 있다. 따라서, 노드에 대한 자식 노드의 최대 개수는 해시 부분의 크기에 의해 정의될 수 있으며, 여기서 해시 부분의 크기는 특정 비트 수일 수 있다. 예를 들어, 8 비트를 생성하는 키의 해시와 관련하여, 8 비트는 처음 2 비트, 3 ~ 6 비트, 7 비트와 8 비트를 포함하는 3 개의 세트로 분할될 수 있다. 자식 노드는 비트 세트를 기반으로 인덱싱될 수 있어서, 제 1 레벨 (예를 들어, L1)의 자식 노드는 두 개의 비트 이름 (비트 1 및 2에 기반)을 갖고, 제 2 레벨의 자식 노드 (예를 들어, L2)는 4 비트 이름 (비트 3 내지 6 기반)를 갖고, 제 3 레벨의 자식 노드 (예를 들어, L3)는 2 비트 이름 (비트 7 및 8 기반을 갖는다.
일부 실시예에서, 노드 (610)는 KVS 트리 (600)의 루트 노드를 나타낸다. KVS 트리 (600)는 메모리 서브 시스템 (예를 들어, 110)에 의해 구현된 데이터 스토리지 매체에 저장될 수 있으며, 여기서 KVS 트리 (600)는 데이터 스토리지 매체의 매체 블록에 저장된다. 데이터 스토리지 매체의 매체 블록은 블록 어드레스 지정이 가능할 수 있다.
도 7a 및 7b는 본 개시의 일부 구현들에 따른, 자식 노드들의 세트가 리프 노드를 포함하지 않을 때 하나 이상의 키-값 세트들에 대해 수행되는 예시적인 키 병합 이동을 예시하는 블록도들이다. 특히, 도 7a는 부모 노드 (700)와 관련하여, kvset 시퀀스의 하나 이상의 기존 키 블록을 판독하고 병합하고 (kvset 시퀀스의 기존 값 블록을 판독하지 않는 동안), 결과 병합된 키 블록을 하나 이상의 새로운 키 블록으로 새로운 kvset(병합된 kvset)에 기록하고, 기존 키 블록을 삭제하고, kvset 시퀀스에서 kvset를 삭제하면서 기존 값 블록은 그대로 남겨두는 것을 예시한다. 도 7b는 병합된 (예를 들어, 압축된) kvset의 하나 이상의 부분을 하나 이상의 자식 노드로 이동 (예를 들어, 유출)하기 위해 부모 노드 (700)의 하나 이상의 자식 노드로의 트리 순회를 계속한다. 일부 실시예에서, 도 7a 및 7b는 예시적인 유출 동작이 뒤따르는 예시적인 키 압축 동작을 예시한다.
이제 도 7a를 참조하여, 부모 노드 (700)는 KVSET 1, KVSET 2 및 KVSET 3을 포함하며, 이는 kvset의 시퀀스를 나타낼 수 있다 (예를 들어, 시간이 지남에 따라 KVSET 1이 먼저 추가되고 KVSET 2가 두 번째로 추가되고 KVSET 3이 부모 노드 (700)에 마지막으로 추가된다). 실시예에 따른, Kvset 1, 2, 3은 부모 노드 (700)의 모든 KVSET를 나타낼 수 있거나 부모 노드 (700) 내의 더 큰 시퀀스의 kvset의 테일 끝만을 나타낼 수 있다. 예시된 KVSET는 키 블록 (705, 710, 725, 730, 745, 755, 760, 765) 및 값 블록 (715, 720, 735, 740, 750)를 포함한다. 키 블록 (705)는 키 A를 포함하고 값 ID 10을 참조한다; 키 블록 (710)은 키 B 및 값 ID 11에 대한 값 참조를 포함하고; 키 블록 (725)은 키 B 및 값 ID 20에 대한 값 참조를 포함하고; 키 블록 (730)은 키 C 및 값 ID 21에 대한 값 참조를 포함하고; 키 블록 (745)은 키 A 및 값 ID 30에 대한 값 참조를 포함하고; 키 블록 (755)은 키 A 및 값 ID 10에 대한 값 참조를 포함하고; 키 블록 (760)은 키 B 및 값 ID 11에 대한 값 참조를 포함하고; 키 블록 (765)은 키 C 및 값 ID 21에 대한 값 참조를 포함한다. 키 블록 (예를 들어, 705, 710, 725, 730, 745, 755, 760, 765)이 단일 키 및 값 ID에 대한 관련 참조를 포함하는 것으로 도 7a 및 도 7b에 도시되었지만, 일부 실시예에서, 주어진 키 블록은 2 개 이상의 키 및 값 ID에 대한 관련 참조를 포함할 수 있다. 예를 들어, 새로운 키 블록 (755, 760, 765)의 데이터 콘텐츠는 KVSET 3의 단일 새로운 키 블록 내에 함유될 수 있다.
값 블록 (715)은 10의 값 ID (VID) 및 5의 데이터 생성 번호 (DGEN)를 포함하고; 값 블록 (720)은 VID 11 및 DGEN 6을 포함하고; 값 블록 (735)은 VID 20 및 DGEN 2를 포함하고; 값 블록 (740)은 VID 21 및 DGEN 3을 포함하고; 값 블록 (750)은 VID 30과 DGEN 1을 포함한다. 키 블록 (705, 710, 725, 730, 745)는 kvset 시퀀스의 기존 키 블록을 나타내고, 값 블록 (715, 720, 735, 740, 750)은 kvset 시퀀스의 기존 값 블록을 나타내고, 키 블록 (755, 760, 765)는 NEW KVSET 3에 대해 생성된 새로운 키 블록을 나타낸다.
일부 실시예에서, kvset의 시퀀스를 병합한 결과인 병합된 kvset는 kvset의 시퀀스 중 임의의 kvset와 연관된 가장 큰 서수(ordinal number)를 상속한다. 예를 들어, 일부 실시예에서, KVS 트리의 개별 kvset (값 블록과 같은)은 데이터 생성 번호와 연관될 수 있으며, 서수는 kvset와 연관된 연관된 데이터 생성 번호를 포함할 수 있다. 따라서, kvset의 시퀀스가 KVSET 10, KVSET 8, KVSET 7 및 KVSET 5를 포함하는 경우, KVSET 10이 시퀀스에서 가장 큰 서수를 가지므로 kvset 시퀀스를 병합한 결과 병합된 kvset는 KVSET 10으로 간주될 수 있다. 또한 이러한 방식으로 병합된 kvset는 kvset 시퀀스를 대체하는 것으로 간주될 수 있다.
도시된, KVSET 3 (최신), KVSET 2 및 KVSET 1 (가장 오래된)은 부모 노드 (700) 내에서 NEW KVSET 3으로 병합 (예를 들어, 압축)된다. 병합 동안에, NEW KVSET 3은 부모 노드 (700)에 추가된 새로운 kvset으로 생성되고 기존 키 블록 (705, 710, 725, 730, 745)의 병합을 기반으로 NEW KVSET 3에 대해 새로운 키 블록 (755, 760, 765)이 생성된다. 기존 키 블록 (705, 710, 725, 730, 745)의 병합은 키 A에서 (기존 키 블록 (705 및 745)에 대해) 충돌 및 키 B에서 (기존 키 블록 (710 및 725)에 대해) 충돌을 발생시킨다. 일부 실시예에 따르면, 주어진 kvset는 각각의 키에 대한 하나의 키 엔트리 (주어진 kvset의 키 블록에 걸쳐)를 포함하고, 병합되는 복수의 키 블록 사이의 키 충돌은 복수의 키 블록에서의 가장 최근 (예를 들어, 최신) 키 엔트리에 유리하게 해결될 수 있다 (예를 들어, 가장 최근의 키 엔트리는 유지되고 복수의 키 블록에서의 나머지 키 엔트리는 폐기된다). 따라서, 키 A와 B의 충돌은 키 A와 B에 대한 가장 최근의 키에 유리하게 해결되며, 이는 (도 7a에서) 키 A와 B에 대한 가장 좌측 키 블록에 저장된다 - 키 A에 대한 기존 키 블록 (705) 및 키 B에 대한 기존 키 블록 (710). 키 C에는 충돌이 없으므로, 키 C에 대한 기존 키 블록 (730)이 새로운 NEW KVSET 3에 대해 사용된다. 결과적으로 기존 키 블록 (705, 710, 725, 730, 745) 병합은 기존 키 블록 (705, 710, 730)에 저장된 키 A, B 및 C에 대한 키 엔트리가 합병을 위해 선택되고, 새로운 키 블록 (755, 760, 765)이 이러한 선택된 키 엔트리에 기초하여 NEW KVSET 3에 대해 생성된다. 기존의 키 블록 (705, 710, 725, 730, 745)은 kvset 시퀀스 (즉, Kvset 1, 2, 3)의 각각의 kvset과 마찬가지로 결국 삭제된다. KVSET 1, 2, 3을 삭제하면, NEW KVSET 3은 부모 노드 (700) 내에서 KVSET 1, 2, 3을 대체한다.
도시된, 새로운 키 블록 (755, 760, 765)은 기존 키 블록 (705)으로부터 값 (예를 들어, 키 값 및 기존 값 블록의 엔트리로부터의 참조)을 새로운 키 블록(755, 760, 765)에 복사함으로써 선택된 기존 키 블록 (705, 710 및 730)에 기초하여 생성된다. 따라서, 새로운 키 블록 (755, 760, 765)은 각각 기존 키 블록 (705, 710, 730)과 동일한 VID 10, 11 및 21 (각각 기존 값 블록 (715, 720, 740)에 대응)을 참조한다. 이러한 방식으로, 새로운 키 블록 (755, 760, 765)는 NEW KVSET 3에 대한 새로운 값 블록을 생성하기 위한 요구에 따라 kvset 시퀀스 (Kvset 1, 2, 3)의 기존 키 블록 (705, 710, 730)을 계속 참조한다. 또한 도시된 바와 같이, 기존 키 블록 (705, 710, 730)은 NEW KVSET 3으로 이동된다. 기존 키 블록 (705, 710, 725, 730, 745)이 삭제된 후, NEW KVSET 3의 새로운 값 블록에 의해 참조되지 않는 kvset 시퀀스의 기존 값 블록 (735, 750)은 계속 유지되지만 점선으로 도 7a 및 7b에 도시된 바와 같이, NEW KVSET 3으로 이동되지 않으며 참조되지 않은 것으로 간주된다. 본 출원에 언급된 바와 같이, NEW KVSET 3에 의해 참조되지 않지만, 기존 블록 (735, 750)은 계속 존재할 수 있고 KVS 트리 내에서 하나 이상의 다른 kvset에 의해 참조 (따라서, 공유)될 수 있다.
일부 실시예에서, NEW KVSET 3의 생성 및 추가는 KVSET 3에 대해 (예를 들어, 좌측에 있는) 부모 노드 (700)의 kvset의 시퀀스 내에서 새로운 위치에 NEW KVSET 3을 추가하는 것을 포함하고, 이에 따라 NEW KVSET 3의 생성 및 추가가 KVS 트리 내에서 차단되지 않는 동작인 것을 보장한다.
이제 도 7b를 참조하여, 기존 키 블록 (705, 710, 725, 730, 745)의 삭제를 포함하여 kvset (Kvset 1, 2, 3)의 시퀀스를 삭제한 후, NEW KVSET 3은 새로운 키 블록 (755, 760, 765)과 함께 부모 노드 (700) 내에 남아 있다. NEW KVSET 3은 KVSET X, Y, Z를 포함하는 새로운 kvset 세트 (본 출원에서는 분할 kvset라고도 함)로 파티션 (또는 분할)된다. 본 출원에서 언급된 바와 같이 일부 실시예에 대해 KVS 트리는 부모 노드 (예를 들어, (700))에서 병합된 kvset (예를 들어, NEW KVSET 3)의 키 블록의 키 엔트리 및 값 블록 (키 블록에 의해 참조됨)을 부모 노드의 하나 이상의 자식 노드로 배포하기 위해 결정론적 매핑 (예를 들어, 매핑 값)을 사용한다. 따라서, NEW KVSET 3은 새로운 키 블록 (755, 760, 765)의 키 엔트리가 각각의 매핑 값에 기초하여 매핑되는 자식 노드에 따라 파티션된다. 도 7b에서, 키 블록의 주어진 키 엔트리의 매핑 값은 주어진 키 엔트리의 키의 해시를 포함한다. 예시된, 이는 다음을 초래한다 : 키 A에 대한 키 엔트리 (해시 (키 A) = 00F)는 새로운 KVSET X의 새로운 키 블록 (770)에 의해 포함되며, 이는 매핑 값 00F와 관련된 (예를 들어, 매핑되는) 비-리프 자식 노드로 이동 (예를 들어, 추가)되도록 할당된다; 키 C (해시 (키 C) = 00F)에 대한 키 엔트리는 새로운 KVSET Y의 새로운 키 블록 (775)에 의해 포함되며, 이는 매핑 값 11C와 연관된 비-리프 자식 노드로 이동되도록 할당된다; 및 키 B에 대한 키 엔트리 (해시 (키 B) = 00F)는 새로운 KVSET Z의 새로운 키 블록 (780)에 의해 포함되며, 이는 매핑 값 0X2와 연관된 비-리프 자식 노드로 이동되도록 할당된다.
도 7b에 도시된 바와 같이, NEW KVSET 3의 파티션은 NEW KVSET 3의 어떤 키도 1X0의 맵핑 값을 갖지 않았기 때문에 맵핑 값 1X0과 연관된 비-리프 노드에 대한 새로운 kvset로 귀결되지 않았다. 일부 실시예에 따르면 KVSET X, Y, Z가 각각의 비-리프 자식 노드로 이동될 때, 이러한 노드에 최신 kvset으로 추가된다 (예를 들어, 노드에서 가장 좌측 위치에 배치되는 것으로 표시됨). 도 7b에 도시된 바와 같이, 기존 값 블록 (735, 750)은 참조되지 않은 값 블록 (점선으로 표시됨)으로 계속 유지된다.
도 8a 및 8b는 본 개시의 일부 구현에 따른, 자식 노드 세트가 하나 이상의 리프 노드만을 포함할 때 하나 이상의 키-값 세트에서 수행되는 예시적인 키 병합 이동을 예시하는 블록도이다. 특히, 도 8a는 부모 노드 (800)에 대해, kvset 시퀀스의 하나 이상의 기존 키 블록 및 하나 이상의 기존 값 블록을 판독하고 병합하고, 결과적으로 병합된 키 블록 및 값 블록을 하나 이상의 새로운 키 블록 및 하나 이상의 새로운 값 블록으로 새로운 kvset (병합된 kvset)에 기록하고, 기존 키 블록 삭제하고, kvset 시퀀스에서 kvset 삭제하고, 해당 데이터 생성 번호에 기초하여 기존 값 블록 삭제하는 것을 예시한다. 도 8b는 병합된 (예를 들어, 압축된) kvset의 하나 이상의 부분을 하나 이상의 자식 노드로 이동 (예를 들어, 유출)시키기 위해 부모 노드 (800)의 하나 이상의 자식 노드에 대한 트리 순회를 계속한다. 도 7a 및 7b와 달리, 부모 노드 (800)의 자식 노드는 리프 자식 노드이다. 본 출원에 언급된 바와 같이, (비-리프 노드 레벨이 아닌) KVS 트리의 리프 노드 레벨에서 새로운 값 블록을 생성함으로써, 일부 실시예는 KVS 트리의 내부 노드 사이에서 키 병합 이동을 수행할 때 값 블록 기록을 피하거나 지연할 수 있다. 일부 실시예에서, 도 8a 및 8b는 예시적인 유출 동작이 뒤 따르는 예시적인 키-값 압축 동작을 도시한다.
이제 도 8a를 참조하여, 부모 노드 (800)는 kvset의 시퀀스를 나타낼 수 있는 KVSET 1, KVSET 2 및 KVSET 3을 포함한다 (예를 들어, 시간이 지남에 따라 KVSET 1이 먼저 추가되고, KVSET 2가 두번째로 추가되고, KVSET 3이 부모 노드 (800)에 마지막으로 추가된다). 실시예에 따른, KVSET 1, 2, 3은 부모 노드 (800)의 모든 KVSET를 나타낼 수 있거나 부모 노드 (800) 내에서 더 큰 시퀀스의 kvset의 테일 끝만을 나타낼 수 있다. 예시된 KVSET는 키 블록 (805, 810, 825, 830, 845, 855, 860, 865) 및 값 블록 (815, 820, 835, 840, 850, 870,875, 880)을 포함한다. 키 블록 (805)는 키 A를 포함하고 값 ID 10을 참조한다; 키 블록 (810)은 키 B 및 값 ID 11에 대한 값 참조를 포함하고; 키 블록 (825)은 키 B 및 값 ID 20에 대한 값 참조를 포함하고; 키 블록 (830)은 키 C 및 값 ID 21에 대한 값 참조를 포함하고; 키 블록 (845)은 키 A 및 값 ID 30에 대한 값 참조를 포함하고; 키 블록 (855)은 키 A 및 값 ID 31에 대한 값 참조를 포함하고; 키 블록 (860)은 키 B 및 값 ID 32에 대한 값 참조를 포함하고; 키 블록 (865)은 키 C 및 값 ID 33에 대한 값 참조를 포함한다. 키 블록 (예를 들어, 805, 810, 825, 830, 845, 855, 860, 865)이 단일 키 및 값 ID에 대한 연관된 참조를 포함하는 것으로 도 8a 및 8b에 예시되어 있지만, 일부 실시예에 대해, 주어진 키 블록은 둘 이상의 키 및 값 ID에 대한 연관된 참조를 포함할 수 있다. 예를 들어, 새로운 키 블록 (855, 860, 865)의 데이터 콘텐츠는 KVSET 3의 단일 새로운 키 블록 내에 포함될 수 있다.
값 블록 (815)은 10의 값 ID (VID) 및 5의 데이터 생성 번호 (DGEN)를 포함하고; 값 블록 (820)은 VID 11 및 DGEN 6을 포함하고; 값 블록 (835)은 VID 20 및 DGEN 2를 포함하고; 값 블록 (840)은 VID 21 및 DGEN 3을 포함하고; 값 블록 (850)은 VID 30 및 DGEN 1을 포함하고; 값 블록 (870)은 VID 31 및 DGEN 6을 포함하고; 값 블록 (875)은 32의 VID 및 6의 DGEN을 포함하고; 값 블록 (880)은 VID 33 및 DGEN 6을 포함한다.
키 블록 (805, 810, 825, 830, 845)은 kvset 시퀀스의 기존 키 블록을 나타내고, 값 블록 (815, 820, 835, 840, 850)은 kvset 시퀀스의 기존 값 블록을 나타내고, 키 블록 (855, 860, 865)는 NEW KVSET 3에 대해 생성된 새로운 키 블록을 나타내고 값 블록 (870, 875, 880)은 NEW KVSET 3에 대해 생성된 새로운 값 블록을 나타낸다.
예시된, KVSET 3 (최신), KVSET 2 및 KVSET 1 (가장 오래된)은 부모 노드 (800) 내에서 NEW KVSET 3으로 병합 (예를 들어, 압축)된다. 병합 동안에, NEW KVSET 3은 부모 노드 (800)에 추가된 새로운 kvset으로 생성되고, 새로운 키 블록 (855, 860, 865)는 기존 키 블록 (805, 810, 825, 830, 845)의 병합을 기반으로 NEW KVSET 3에 대해 생성되고, 및 새로운 값 블록 (870, 875, 880)은 기존 값 블록 (815, 820, 835, 840, 850)의 병합을 기반으로 NEW KVSET 3에 대해 생성된다 (기존 키 블록 (805, 810, 825, 830, 845)의 병합을 고려하여). 기존 키 블록 (805, 810, 825, 830, 845)의 병합은 키 A (기존 키 블록 (805 및 845)에 대해) 및 키 B (기존 키 블록 (810 및 825)에 대해)에서의 충돌을 야기한다. 본 출원에 언급된 바와 같이, 일부 실시예에 따르면, 주어진 kvset는 각각의 키에 대해 하나의 키 엔트리 (주어진 kvset의 키 블록에 걸쳐)만을 포함하고, 병합되는 복수의 키 블록 사이의 키 충돌은 복수의 키 블록에서 가장 최근 (예를 들어, 가장 새로운) 키 입력에 유리하게 해결될 수 있다 (예를 들어, 가장 최근의 키 엔트리가 유지되고 복수의 키 블록에 있는 나머지 키 엔트리는 폐기된다). 따라서, 키 A와 B의 충돌은 키 A와 B에 대한 가장 최근의 키에 대해 유리하게 해결되며, 이는 (도 8a에서) 키 A와 B에 대한 가장 좌측 키 블록에 저장된다 - 키 A에 대한 기존 키 블록 (805) 및 키 B에 대한 기존 키 블록 (810). 키 C에는 충돌이 없으므로 키 C에 대한 기존 키 블록(830)은 새로운 NEW KVSET 3과 관련하여 사용된다. 결과적으로, 기존 키 블록 (805, 810, 825, 830, 845)을 병합하면 기존 키 블록 (805, 810, 830)에 저장된 키 A, B 및 C에 대한 키 엔트리가 병합을 위해 선택되고, 이들 선택된 키 엔트리에 기초하여 NEW KVSET 3에 대해 새로운 키 블록 (855, 860, 865)이 생성된다. 또한, 키 A, B 및 C에 대해 선택된 기존 키 블록 (805, 810, 830)에 기초하여, 기존 키 블록 (805, 810, 830)에 대응하는 기존 값 블록 (815, 820, 840)은 새로운 값 블록 (870, 875, 880)을 생성하는 데 사용된다. 기존 키 블록 (805, 810, 825, 830, 845)는 kvset 시퀀스 (즉, KVET 1, 2, 3)의 각각의 kvset와 마찬가지로 결국 삭제된다. KVSET 1, 2, 3을 삭제하면 NEW KVSET 3이 부모 노드 (800) 내의 KVSET 1, 2, 3을 대체한다.
도시된 바와 같이, 새로운 값 블록 (870, 875, 880)은 기존 값 블록 (815, 820, 840)의 값을 대응하는 새로운 값 블록 (870, 875, 880)에 복사함으로써 기존 값 블록 (815, 820, 840)에 기초하여 생성된다. 추가적으로, 새로운 값 블록 (870, 875, 880)의 각각은 임의의 기존 값 블록 (815, 820, 835, 840, 850) 중 가장 큰 데이터 생성 번호를 할당 (예를 들어, 상속)하고, 이는 도 8a에서 6이다. 새로운 키 블록 (855, 860, 865)은 선택된 기존 키 블록 (805, 810, 830)에 기초하여 생성되어 새로운 키 블록 (855, 860, 865)은 기존의 값 블록 (815, 820, 840)에 대응하는 새로운 값 블록 (870, 875, 880)을 참조하면서 각각 기존의 키 블록 (805, 810, 830)과 동일한 키를 포함한다. 따라서, 새로운 키 블록 (855, 860, 865)은 각각 VID (31, 32, 33)에 대한 값 참조를 포함한다.
각각의 기존 값 블록 (815, 820, 835, 840, 850)은 각각의 데이터 생성 번호에 기초하여 삭제될 수 있다. 일부 실시예에 따르면, 부모 노드 (800)의 각각의 리프 자식 노드에 대해, 리프 자식 노드에 의해 포함된 (예를 들어, kvset에 의해 참조되는) 임의의 값 블록의 가장 큰 데이터 생성 번호가 결정된다. 도 8b에서, 이것은 {39, 30, 14, 21}의 가장 큰 데이터 생성 번호 세트를 생성한다. 그 후, 일부 실시예에 따르면, 가장 큰 데이터 생성 번호 세트에 포함된 가장 작은 데이터 생성 번호가 결정된다. 도 8b의 경우 이것은 14가 될 것이다. 이어서, 일부 실시예에 따르면, 결정된 가장 작은 데이터 생성 번호보다 작은 데이터 생성 번호를 갖는 임의의 기존 키 블록이 삭제된다. 도 8b와 관련하여, 각각의 기존 값 블록 (815, 820, 835, 840, 850)은 14의 가장 작은 데이터 생성 번호보다 적은 데이터 생성 번호 (각각 5, 6, 2, 3, 1)를 갖는다.
일부 실시예에서, NEW KVSET 3의 생성 및 추가는 KVSET 3에 대해 (예를 들어, 좌측에 있는) 부모 노드 (800)의 kvset 시퀀스 내에서 새로운 위치에 NEW KVSET 3을 추가하는 것을 포함하고, 이에 따라 NEW KVSET 3의 생성 및 추가가 KVS 트리 내에서 차단되지 않는 동작인 것을 보장한다.
이제 도 8b를 참조하여, 기존 키 블록 (805, 810, 825, 830, 845)의 삭제를 포함하여 kvset 시퀀스 (Kvset 1, 2, 3)를 삭제 후, NEW KVSET 3은 각각 새로운 값 블록 (870, 875, 880)을 참조하는 새로운 키 블록 (855, 860, 865)와 함께 부모 노드 (800) 내에 남아 있다. NEW KVSET 3은 KVSET X, Y, Z를 포함하는 새로운 kvset 세트 (또한 본 출원에서 분할 kvsets로 언급됨)로 파티션 (또는 분할)된다. 본 출원에서 언급된 바와 같이, 일부 실시예들에 대해, KVS 트리는 부모 노드 (예를 들어, KVSET 3)로부터 병합된 kvset (예를 들어, NEW KVSET 3)의 키 블록 및 값 블록 (키 블록에 의해 참조됨)의 키 엔트리를 부모 노드(예를 들어, 800)의 하나 이상의 자식 노드에 배포하기 위해 결정론적 매핑 (예를 들어, 매핑 값)을 사용한다. 따라서, NEW KVSET 3은 각각의 매핑 값에 기초하여 새로운 키 블록 (855, 860, 865)의 키 엔트리가 매핑되는 자식 노드에 따라 파티션된다. 도 8b에서, 키 블록의 주어진 키 엔트리의 매핑 값은 주어진 키 엔트리의 키의 해시를 포함한다. 예시된 바와 같이, 이 결과는 다음과 같다: 새로운 KVSET X의 새로운 키 블록 (870)에 포함된 키 A에 대한 키 엔트리 (해시 (키 A) = 00F), 이는 매핑 값 00F와 연관된 (예를 들어, 매핑되는) 비-리프 자식 노드로 이동 (예를 들어, 추가)되도록 할당되고; 새로운 KVSET Y의 새 키 블록 (875)에 포함된 키 C (해시 (키 C) = 00F)에 대한 키 엔트리,이는 매핑 값 11C와 연관된 비-리프 자식 노드로 이동되도록 할당되고; 및 새로운 KVSET Z의 새 키 블록 (880)에 포함된 키 B (해시 (키 B) = 11C)에 대한 키 엔트리, 이는 매핑 값 0X2와 연관된 비-리프 자식 노드로 이동하도록 할당된다.
도 8b에 도시된 바와 같이, NEW KVSET 3의 파티셔닝은 NEW KVSET 3의 키 블록이 1X0의 맵핑 값을 갖지 않았기 때문에, 맵핑 값 1X0과 연관된 리프 노드에 대한 새로운 kvset로 귀결되지 않았다. KVSET X, Y, Z가 각각의 비-리프 자식 노드로 이동될 때, 일부 실시예에 따르면, 이러한 노드에 최신 kvset으로 추가된다 (예를 들어, 노드에서 가장 좌측 위치에 배치되는 것으로 표시됨). 도 8b에 또한 도시된 바와 같이, 기존 값 블록 (835, 850)은 계속 지속되지 않는다.
도 9a 내지 9c는 키 병합 이동을 위한 방법이 수행되는 예시적인 실시예의 맥락에서 컴퓨팅 환경 (100)의 컴포넌트들 사이의 상호 작용을 예시하는 상호 작용 다이어그램을 제공한다. 방법의 동작은 하드웨어 (예를 들어, 프로세싱 디바이스, 회로부, 전용 로직, 프로그램 가능 로직, 마이크로 코드, 디바이스의 하드웨어, 집적 회로 등), 소프트웨어 (예를 들어, 프로세싱 디바이스에서 실행되거나 수행되는 지침) 또는 이들의 조합을 포함할 수 있는 프로세싱 로직에 의해 수행될 수 있다. 일부 실시예에서, 방법은 호스트 시스템 (120)에 의해 수행된다. 동작이 특정 순서 또는 순서로 도시되지만, 달리 명시되지 않는 한, 프로세스의 순서는 수정될 수 있다. 따라서, 예시된 실시예는 단지 예시로서 이해되어야 하며, 예시된 프로세스는 상이한 순서로 수행될 수 있고, 일부 프로세스는 병렬로 수행될 수 있다. 추가로, 하나 이상의 프로세스는 다양한 실시예에서 생략될 수 있다. 따라서, 모든 실시예에서 모든 프로세스가 필요한 것은 아니다.
도 9a 내지 9c에 예시된 예의 맥락에서, 호스트 시스템은 호스트 시스템 (120)을 포함할 수 있고, 메모리 서브 시스템은 메모리 서브 시스템 (110)을 포함할 수 있으며, 여기서 메모리 컴포넌트 (112A 내지 112N) 중 하나 이상은 호스트 시스템 (120)에 의해 동작되는 KVS 트리를 저장하기 위한 데이터 스토리지 매체를 구현할 수 있다.
도시된 바와 같이, 동작 (902)에서 호스트 시스템 (120)은 키-값 저장소 트리 데이터 구조 (KVS tree)를 생성하고, 이는 호스트 시스템 (120)이 저장을 위해 메모리 서브 시스템 (110)에 기록한다. 이에 응답하여, 메모리 서브 시스템 (110)은 데이터 스토리지 매체 상에 KVS 트리를 저장한다.
동작 (904)에서, 호스트 시스템 (120)은 부모 노드의 키-값 세트 시퀀스를 병합하고 부모 노드의 자식 노드 세트로 이동시키기 위한 조건을 검출한다. 호스트 시스템 (120)이 조건을 검출하면, 동작 (906)에서, 호스트 시스템 (120)은 자식 노드들의 세트가 리프 노드를 포함하는지 여부를 결정한다. 그렇게 하기 위해, 호스트 시스템 (120)은 메모리 서브 시스템 (110)의 데이터 스토리지 매체에 저장된 KVS 트리 (예를 들어, 부모 노드 및 자식 노드의 세트 횡단하기 위해)를 판독하고, 메모리 서브 시스템 (110)은 동작 (912)에서 KVS 트리에 대한 액세스를 제공한다. 호스트 시스템 (120)이 자식 노드 세트가 리프 노드만을 포함한다고 결정하면, 호스트 시스템 (120)은 동작 (924)로 진행하고, 호스트 시스템 (120)이 자식 노드 세트가 리프 노드를 포함하지 않는다고 결정하면 호스트 시스템 (120)은 동작 (908)로 진행한다.
도시되지는 않았지만, 호스트 시스템 (120)은 자식 노드들의 세트가 적어도 하나의 리프 노드 및 적어도 하나의 비-리프 노드를 포함한다고 결정할 수 있다 (예를 들어, KVS 트리는 불균형(unbalanced) 임). 본 출원에서 설명된 바와 같이, 호스트 시스템 (120)이 자식 노드들의 세트가 적어도 하나의 리프 노드 및 적어도 하나의 비-리프 노드를 포함한다고 결정하면, 호스트 시스템 (120)은 키-값 세트들의 시퀀스를 비-리프 노드에 매핑되는 키 엔트리에 대한 제 1 병합된 키-값 세트 및 리프 노드에 매핑되는 키 엔트리에 대한 제 2 병합된 키-값 세트로 병합한다. 이어서, 제 1 병합된 키-값 세트는 동작 (920) 및 그 이후의 동작에 의해 동작될 수 있고, 제 2 병합된 키-값 세트는 동작 (926) 및 그 이후의 동작에 의해 동작될 수 있다.
동작 (908)에서, 호스트 시스템 (120)은 키-값 세트 시퀀스에 포함된 (예를 들어, 키-값 세트에 의해 참조되는) 기존 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 키-값 세트를 생성하기 위해 부모 노드의 키-값 세트 시퀀스를 병합한다. 본 출원에 언급된 바와 같이, 새로운 키 블록 세트는 키-값 세트의 시퀀스에 포함된 (예를 들어, 키-값 세트에 의해 포함된) 기존 키 블록 세트에 기초하여 생성된다. 부모 노드의 키-값 세트의 시퀀스를 병합하기 위해, 호스트 시스템 (120)은 메모리 서브 시스템 (110)의 데이터 스토리지 매체에 저장된 KVS 트리를 판독하고 (예를 들어, 시퀀스의 키-값 세트를 판독 위해), 메모리 서브 시스템 (110)은 동작 (914)에서 KVS 트리에 대한 액세스를 제공한다.
동작 (908) 이후, 동작 (920)에서, 호스트 시스템 (120)은 키-값 세트 시퀀스의 모든 기존 값 블록(들)을 삭제하고 키-값 세트의 시퀀스의 기존 값 블록(들)을 모두 그대로 남겨 둠으로써 키-값 세트 시퀀스를 삭제한다. 호스트 시스템 (120)은 이러한 변경 사항을 메모리 서브 시스템 (110)의 데이터 스토리지 매체에 저장된 KVS 트리에 기록하고, 이는 이러한 변경 사항을 동작 (930)에서 저장된 KVS 트리에 위임(commit)한다. 이어서, 동작 (922)에서 호스트 시스템 (120)은 병합된 키 값 세트 (동작 (908)에서 발생)를 부모 노드의 자식 노드 세트로 이동시킨다. 다시, 호스트 시스템 (120)은 이러한 변경을 메모리 서브 시스템 (110)에 기록하고, 이는 동작 (932)에서 저장된 KVS 트리에 이러한 변경을 위임한다.
동작 (924)에서, 호스트 시스템 (120)은 새로운 값 블록의 세트를 참조하는 새로운 키 블록의 세트를 포함하는 병합된 키-값 세트를 생성하기 위해 부모 노드의 키-값 세트의 시퀀스를 병합한다. 본 출원에 언급된 바와 같이, 새로운 키 블록 세트는 키-값 세트의 시퀀스에 포함된 (예를 들어, 키-값 세트에 의해 포함된) 기존 키 블록 세트에 기초하여 생성되고, 새로운 값 블록 세트는 기존 키 블록 세트에 의해 참조되는 기존 값 블록 세트를 기반으로 생성된다. 부모 노드의 키-값 세트 시퀀스를 병합하기 위해, 호스트 시스템 (120)은 메모리 서브 시스템 (110)의 데이터 스토리지 매체에 저장된 KVS 트리를 판독하고, 메모리 서브 시스템 (110)은 동작 (934)에서 KVS 트리에 대한 액세스를 제공한다.
동작 (924) 이후, 동작 (926)에서, 호스트 시스템 (120)은 KVS 트리의 리프 노드들에 대한 가장 큰 데이터 생성 번호들의 세트를 결정한다. 이를 위해, 호스트 시스템 (120)은 메모리 서브 시스템 (110)의 데이터 스토리지 매체에 저장된 KVS 트리 (예를 들어, KVS 트리의 리프 노드를 조사하기 위해)를 판독하고, 메모리 서브 시스템 (110)은 동작 (936)에서 KVS 트리에 대한 액세스를 제공한다. 동작 (928)에서 호스트 시스템 (120)은 동작 (926)에서 결정된 가장 큰 데이터 생성 번호 세트 중 가장 작은 데이터 생성 번호를 결정한다. 동작 (940)에서 호스트 시스템 (120)은 키-값 세트 시퀀스의 모든 기존 값 블록 (들)을 삭제함으로써 키-값 세트 시퀀스를 삭제하고, 동작 (928)에서 결정된 가장 작은 데이터 생성 번호보다 작은 데이터 생성 번호를 갖는 키-값 세트 시퀀스의 임의의 기존 값 블록 (들)을 삭제한다. 호스트 시스템 (120)은 이러한 변경 사항을 메모리 서브 시스템 (110)의 데이터 스토리지 매체에 저장된 KVS 트리에 기록하고, 이는 동작 (944)에서 저장된 KVS 트리에 이러한 변경 사항을 위임한다. 이어서, 동작 (942)에서 호스트는 시스템 (120)은 병합된 키 값 세트 (동작 (924)에서 발생)를 부모 노드의 자식 노드 세트로 이동시킨다. 다시, 호스트 시스템 (120)은 이러한 변경을 메모리 서브 시스템 (110)에 기록하고, 이는 동작 (946)에서 이러한 변경 사항을 저장된 KVS 트리에 위임한다.
도 10은 기계로 하여금 본 출원에서 논의된 방법 중 임의의 하나 이상을 수행하게 하기 위해 지침 세트가 실행될 수 있는 컴퓨터 시스템 (1000) 형태의 예시적인 기계를 도시한다. 일부 실시예에서, 컴퓨터 시스템 (1000)은 메모리 서브 시스템 (예를 들어, 도 1의 메모리 서브 시스템 (110))을 포함하거나 이에 결합되거나 이를 이용하는 호스트 시스템 (예를 들어, 도 1의 호스트 시스템 (120))에 대응할 수 있거나 또는 컨트롤러의 동작을 수행하는데 사용될 수 있다 (예를 들어, 도 1의 키 병합 이동 컴포넌트 (122)에 대응하는 동작을 수행하기 위해 운영 체제를 실행하여). 대안적인 실시예에서, 기계는 근거리 통신망 (LAN), 인트라넷, 엑스트라넷 및/또는 인터넷의 다른 기계에 연결 (예를 들어, 네트워크화)될 수 있다. 기계는 클라이언트-서버 네트워크 환경의 서버 또는 클라이언트 기계의 능력으로, 피어-투-피어 (또는 분산) 네트워크 환경의 피어 기계, 또는 클라우드 컴퓨팅 인프라 또는 환경의 서버 또는 클라이언트 기계로서 동작할 수 있다.
기계는 개인용 컴퓨터 (PC), 태블릿 PC, 셋톱 박스 (STB), PDA (Personal Digital Assistant), 휴대 전화, 웹 기기, 서버, 네트워크 라우터, 네트워크 스위치, 네트워크 브리지 또는 해당 기계가 취할 조치를 지정하는 지침의 세트 (순차적 또는 다른)를 실행할 수 있는 임의의 기계일 수 있다. 또한, 단일 기계가 예시되어 있지만, "기계(machine)" 라는 용어는 본 출원에서 논의된 방법론 중 임의의 하나 이상을 수행하기 위해 지침 세트 (또는 다수의 세트)를 개별적으로 또는 공동으로 실행하는 임의의 기계 세트를 포함하는 것으로 간주되어야 한다.
예시적인 컴퓨터 시스템 (1000)은 프로세싱 디바이스 (1002), 메인 메모리 (1004) (예를 들어, 판독 전용 메모리 (ROM), 플래시 메모리, 동기식 DRAM (SDRAM) 또는 RDRAM (Rambus DRAM)과 같은 동적 랜덤 액세스 메모리 (DRAM) 등), 정적 메모리 (1006) (예를 들어, 플래시 메모리, 정적 랜덤 액세스 메모리 (SRAM) 등), 및 버스 (1030)를 통해 서로 통신하는 데이터 스토리지 디바이스 (1018)를 포함한다.
프로세싱 디바이스 (1002)는 마이크로 프로세서, 중앙 프로세싱 유닛 등과 같은 하나 이상의 범용 프로세싱 디바이스를 나타낸다. 보다 구체적으로, 프로세싱 디바이스 (1002)는 CISC(complex instruction set computing) 마이크로 프로세서, RISC(reduced instruction set computing) 마이크로 프로세서, VLIW(very long instruction word) 마이크로 프로세서, 다른 지침 세트를 구현하는 프로세서, 또는 지침 세트의 조합을 구현하는 프로세서일 수 있다. 프로세싱 디바이스 (1002)는 또한 ASIC (application specific integrated circuit), FPGA (field programmable gate array), DSP (digital signal processor), 네트워크 프로세서 등과 같은 하나 이상의 특수 목적 프로세싱 디바이스일 수 있다. 프로세싱 디바이스 (1002)는 본 출원에서 논의되는 동작 및 단계를 수행하기 위한 지침 (1026)을 실행하도록 구성된다. 컴퓨터 시스템 (1000)은 네트워크 (1020)를 통해 통신하기 위한 네트워크 인터페이스 디바이스 (1008)를 더 포함할 수 있다.
데이터 스토리지 디바이스 (1018)는 하나 이상의 지침 세트 (1026) 또는 본 출원에서 설명된 임의의 하나 이상의 방법론 또는 기능을 구현하는 소프트웨어가 저장된 기계 판독 가능 저장 매체 (1024) (컴퓨터 판독 가능 매체라고도 함)를 포함할 수 있다. 지침 (1026)은 또한 컴퓨터 시스템 (1000)에 의해 실행되는 동안 메인 메모리 (1004) 내에 및/또는 프로세싱 디바이스 (1002) 내에 완전히 또는 적어도 부분적으로 상주할 수 있고, 메인 메모리 (1004) 및 프로세싱 디바이스 (1002)는 또한 기계 판독 가능 저장 매체를 구성한다. 기계 판독 가능 저장 매체 (1024), 데이터 스토리지 디바이스 (1018) 및/또는 메인 메모리 (1004)는 도 1의 메모리 서브 시스템 (110)에 대응할 수 있다.
일 실시예에서, 지침 (1026)은 부분 계산 추적 (예를 들어, 도 1의 키 병합 이동 컴포넌트 (122))을 갖는 패러티(parity) 계산기에 대응하는 기능을 구현하기 위한 지침을 포함한다. 기계 판독 가능 저장 매체 (1024)가 예시적인 실시예에서 단일 매체인 것으로 도시 되어 있지만, "기계 판독 가능 저장 매체"라는 용어는 하나 이상의 지침 세트를 저장하는 단일 매체 또는 다수의 매체를 포함하는 것으로 간주되어야 한다. "기계 판독 가능 저장 매체"라는 용어는 또한 기계에 의한 실행을 위한 지침 세트를 저장하거나 인코딩할 수 있고 기계로 하여금 본 개시의 방법론 중 임의의 하나 이상을 수행하게 하는 임의의 매체를 포함하는 것으로 간주된다. 따라서, "기계 판독 가능 저장 매체"라는 용어는 솔리드 스테이트 메모리, 광학 매체 및 자기 매체를 포함하지만 이에 한정되지 않는 것으로 간주되어야 한다.
전술한 상세한 설명의 일부 부분은 컴퓨터 메모리 내의 데이터 비트에 대한 연산의 상징적 표현 및 알고리즘의 관점에서 제시되었다. 이러한 알고리즘 설명 및 표현은 데이터 처리 기술의 숙련자가 자신의 작업의 본질을 당업자에게 가장 효과적으로 전달하기 위해 사용하는 방법이다. 여기에서 알고리즘은 일반적으로 원하는 결과로 이어지는 자체-일관된 동작 시퀀스로 간주된다. 동작은 물리량의 물리적 조작이 필요한 동작이다. 반드시 그런 것은 아니지만 일반적으로 이러한 수량은 저장, 결합, 비교 및 다른 조작이 가능한 전기 또는 자기 신호의 형태를 취한다. 주로 일반적인 사용의 이유로 이러한 신호를 비트, 값, 엘리먼트, 기호, 문자, 용어, 숫자 등으로 지칭하는 것이 편리한 것으로 입증되었다.
그러나, 이들 및 유사한 용어 모두는 적절한 물리량과 연관되어야 하며 이러한 수량에 적용되는 편리한 라벨일 뿐이라는 것을 명심해야 한다. 본 개시는 컴퓨터 시스템의 레지스터와 메모리 내에서 물리적 (전자적) 수량으로 표시된 데이터를 컴퓨터 시스템의 메모리 또는 레지스터 또는 기타 그러한 정보 스토리지 시스템 내에서의 물리량으로 유사하게 표현된 다른 데이터로 변환하는 컴퓨터 시스템 또는 유사한 전자 컴퓨팅 디바이스의 동작 및 프로세스를 지칭할 수 있다.
본 개시는 또한 본 출원의 동작을 수행하기 위한 디바이스에 관한 것이다. 이 디바이스는 의도된 목적을 위해 특별히 구성될 수 있거나 컴퓨터에 저장된 컴퓨터 프로그램에 의해 옵션으로 활성화되거나 재구성된 범용 컴퓨터를 포함할 수 있다. 이러한 컴퓨터 프로그램은 한정되는 것은 아니지만, 플로피 디스크, 광학 디스크, CD-ROM 및 자기 광학 디스크; 판독 전용 메모리 (ROM); RAM (Random Access Memory); EPROM(erasable programmable read-only memories), EEPROM; 자기 또는 광학 카드; 또는 전자 명령을 저장하기에 적절한 임의의 유형의 매체를 포함하는 임의의 유형의 디스크와 같은 컴퓨터 판독 가능 저장 매체에 저장될 수 있고, 각각은 컴퓨터 시스템 버스에 결합된다.
본 출원에 제시된 알고리즘 및 디스플레이는 본질적으로 특정 컴퓨터 또는 다른 장치와 관련이 없다. 다양한 범용 시스템이 본 명세서의 교시에 따라 프로그램과 함께 사용될 수 있거나, 방법을 수행하기 위해보다 전문화된 장치를 구성하는 것이 편리함을 입증할 수 있다. 이러한 다양한 시스템에 대한 구조는 위의 설명에 개시된 대로 나타난다. 또한, 본 개시는 임의의 특정 프로그래밍 언어를 참조하여 설명되지 않는다. 다양한 프로그래밍 언어가 본 출원에 설명된 바와 같은 개시의 교시를 구현하기 위해 사용될 수 있다는 것이 이해될 것이다.
본 개시는 컴퓨터 시스템 (또는 다른 전자 디바이스)를 프로그래밍하여 본 개시에 따른 프로세스를 수행하는데 사용될 수 있는 지침이 저장된 기계 판독 가능 매체를 포함할 수 있는 컴퓨터 프로그램 제품 또는 소프트웨어로서 제공될 수 있다. 기계 판독 가능 매체는 기계 (예를 들어, 컴퓨터)에 의해 판독 가능한 형태로 정보를 저장하기 위한 임의의 메커니즘을 포함한다. 일부 실시예에서, 기계 판독 가능 (예를 들어, 컴퓨터 판독 가능) 매체는 판독 전용 메모리 (ROM), 랜덤 액세스 메모리 (RAM), 자기 디스크 스토리지 매체, 광학 스토리지 매체, 플래시 메모리 컴포넌트 등과 같은 기계 판독 가능 (예를 들어, 컴퓨터 판독 가능) 스토리지 매체를 포함한다.
전술한 명세서에서, 본 개시의 실시예들은 그 특정 예시적인 실시예들을 참조하여 설명되었다. 이하의 청구 범위에 기재된 본 개시의 더 넓은 실시예로부터 벗어나지 않고 다양한 수정이 이루어질 수 있다는 것이 명백할 것이다. 따라서, 명세서 및 도면은 제한적인 의미가 아니라 예시적인 의미로 간주되어야 한다.
예 1은 다음을 포함하는 시스템이다 : 키-값 저장소 트리 데이터 구조(key-value store tree data structure)를 저장하는 메모리 컴포넌트의 세트로서, 상기 키-값 저장소 트리 데이터 구조는 노드 세트를 포함하고, 상기 노드 세트 내의 노드는 키 값 세트의 시퀀스를 포함하는, 상기 메모리 컴포넌트의 세트; 및 상기 메모리 컴포넌트의 세트에 동작 가능하게 결합된 프로세싱 디바이스로서, 상기 키-값 세트의 시퀀스를 병합하고 상기 키-값 저장소 트리 데이터 구조의 노드로부터 상기 노드의 자식 노드의 세트로 이동시키는 조건을 검출하는 단계; 및 상기 조건 검출에 대한 응답하여, 상기 노드의 자식 노드 세트가 리프 노드(leaf node)를 포함하는지 여부를 결정하는 단계; 및 상기 자식 노드 세트가 상기 리프 노드를 포함하는지의 결정에 기초하여 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 단계를 포함하는 동작을 수행하도록 구성된, 상기 프로세싱 디바이스를 포함한다.
예 2에서, 예 1의 주제는 옵션으로 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동하는 시키는 것이 다음을 포함하는 경우를 포함한다 : 상기 자식 노드 세트가 상기 리프 노드를 포함하지 않는다는 결정에 대한 응답하여, 상기 키-값 세트 시퀀스의 기존 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트 시퀀스를 병합하는 단계로서, 상기 새로운 키 블록 세트는 상기 키-값 세트 시퀀스의 기존 키 블록 세트에 기초하여 생성되는, 상기 키-값 세트 시퀀스를 병합하는 단계; 및 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 단계를 포함한다.
예 3에서, 예 1 또는 예 2의 주제는 옵션으로 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 것이 다음을 포함하는 경우를 포함한다 : 상기 병합된 키-값 세트를 분할(split) 키-값 세트의 세트로 파티션(partition)하는 단계로서, 각각의 분할 키-값 세트는 상기 자식 노드 세트의 다른 자식 노드에 할당되는, 상기 파티션하는 단계; 및 상기 분할 키-값 세트의 각각의 분할 키-값 세트를 상기 자식 노드 세트의 할당된 자식 노드로 이동시키는 단계를 포함한다.
예 4에서, 예 1 내지 3 중 어느 하나의 주제는 옵션으로 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것이 병합된 키-값이 생성된 후 다음을 포함하는 경우를 포함한다 : 상기 자식 노드 세트가 상기 리프 노드를 포함하지 않는다는 결정에 응답하여, 상기 노드로부터 상기 키-값 세트의 시퀀스에서 각각의 특정 키-값 세트를 삭제하는 단계로서, 상기 특정 키-값 세트를 삭제하는 단계는 상기 특정 키-값 세트의 하나 이상의 키 블록을 삭제하고 상기 특정 키-값 세트의 하나 이상의 값 블록을 남겨두는 것을 포함하는, 상기 삭제하는 단계를 포함한다.
예 5에서, 예 1 내지 4 중 어느 하나의 주제는 옵션으로 상기 새로운 키 블록의 세트는 상기 새로운 키 블록의 세트가 상기 기존 값 블록 세트에 대한 하나 이상의 참조를 포함하도록 상기 기존 키 블록 세트를 복사함으로써 상기 키-값 세트 시퀀스의 기존 키 블록 세트에 기초하여 생성되는 경우를 포함한다.
예 6에서, 예 1 내지 5 중 어느 하나의 주제는 옵션으로 상기 노드의 값 블록 세트 내의 각각의 특정 값 블록에 상기 특정 값 블록이 상기 키-값 저장소 트리 구조에 대해 초기에 생성된 시퀀스 순서를 나타내는 데이터 생성 번호(data generation number)가 할당되는 경우를 포함하고, 상기 키-값 세트 시퀀스를 상기 자식 노드 세트로 이동시키는 단계는, 상기 자식 노드 세트가 상기 리프 노드를 포함한다는 결정에 응답하여, 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 단계로서, 상기 새로운 키 블록 세트는 상기 키-값 세트의 시퀀스의 기존 키 블록 세트를 기반으로 생성되고, 상기 새로운 값 블록 세트는 상기 키-값 세트 시퀀스의 기존 값 블록 세트를 기반으로 생성되고, 상기 새로운 값 블록 세트에는 상기 기존 값 블록 세트의 임의의 값 블록에 할당된 특정 가장 큰 데이터 생성 번호가 할당되는, 상기 키-값 세트의 시퀀스를 병합하는 단계; 및 상기 병합된 키-값 세트를 노드의 상기 자식 노드 세트로 이동시키는 단계를 포함한다.
예 7에서, 예 1 내지 6 중 어느 하나의 주제는 옵션으로 상기 병합된 키-값 세트를 노드의 상기 자식 노드 세트로 이동시키는 것이 다음을 포함하는 경우를 포함한다 : 상기 병합된 키-값 세트를 분할 키-값 세트의 세트로 파티션하는 단계로서, 각각의 분할 키-값 세트는 상기 자식 노드 세트의 다른 자식 노드에 할당되는, 상기 파티션하는 단계; 및 상기 분할 키-값 세트의 각각의 분할 키-값 세트를 상기 자식 노드 세트의 할당된 자식 노드로 이동시키는 단계를 포함한다.
예 8에서, 예 1 내지 7 중 어느 하나의 주제는 옵션으로 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것이 병합된 키-값이 생성된 후 다음을 포함하는 경우를 포함한다 : 상기 자식 노드 세트가 상기 리프 노드를 포함한다는 결정에 응답하여, 상기 키-값 저장소 트리 데이터 구조의 각각의 특정 리프 노드에 대해 상기 특정 리프 노드와 관련된 임의의 값 블록에 할당된 가장 큰 데이터 생성 번호를 결정함으로써 가장 큰 데이터 생성 번호 세트를 결정하는 단계; 상기 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하는 단계; 및 상기 노드로부터, 상기 키-값 세트의 시퀀스에 각각의 특정 키-값 세트를 삭제하는 단계로서, 상기 특정 키-값 세트를 삭제하는 단계는, 상기 가장 작은 데이터 생성 번호보다 작은 특정 데이터 생성 번호를 갖는 상기 특정 키-값 세트의 기존 키 블록에 의해 참조되는 임의의 기존 값 블록을 삭제하는 단계; 및 상기 특정 키-값 세트의 하나 이상의 기존 키 블록을 삭제하는 단계를 포함한다.
예 9에서, 예 1 내지 8 중 어느 하나의 주제는 옵션으로 상기 노드의 값 블록 세트 내의 각각의 특정 값 블록에는 상기 특정 값 블록이 상기 키-값 저장소 트리 구조에 대해 초기에 생성된 시퀀스 순서를 나타내는 데이터 생성 번호가 할당되는 경우를 포함하고 상기 동작은, 상기 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하는 단계; 상기 주어진 값 블록의 특정 데이터 생성 번호가 상기 가장 작은 데이터 생성 번호보다 작은 지 여부를 결정하는 단계; 및 상기 특정 데이터 생성 번호가 상기 가장 작은 데이터 생성 번호보다 작다는 결정에 응답하여 상기 키-값 저장소 트리 데이터 구조의 주어진 값 블록을 삭제하는 단계를 더 포함한다.
예 10에서, 예 1 내지 9 중 어느 하나의 주제는 옵션으로 시스템이 메모리 서브 시스템인 경우를 포함한다.
예 11에서, 예 1 내지 10 중 어느 하나의 주제는 옵션으로 호스트 시스템이 프로세싱 디바이스를 포함하고 메모리 서브 시스템이 메모리 컴포넌트 세트를 포함하는 경우를 포함한다.
예 12는 방법은, 키-값 저장소 트리 데이터 구조를 메모리 컴포넌트 세트 상에 생성하는 단계로서, 상기 키-값 저장소 트리 구조는 노드의 세트를 포함하고, 상기 노드 세트의 노드는 키 값 세트의 시퀀스를 포함하는, 상기 생성하는 단계; 상기 프로세싱 디바이스에 의해, 상기 키-값 세트의 시퀀스를 병합하고 상기 노드로부터 상기 노드의 자식 노드 세트로 이동시키는 조건을 검출하는 단계; 및 상기 조건 검출에 대한 응답하여, 상기 프로세싱 디바이스에 의해, 상기 노드의 자식 노드 세트가 리프 노드를 포함하는지 여부를 결정하는 단계; 및 상기 프로세싱 디바이스에 의해, 상기 자식 노드 세트가 상기 리프 노드를 포함하는지의 결정에 기초하여 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 단계를 포함한다.
예 13에서, 예 12의 주제는 옵션으로 상기 키-값 세트의 시퀀스를 자식 노드 세트로 이동시키는 것이 다음을 포함하는 경우를 포함한다 : 상기 자식 노드 세트가 상기 리프 노드를 포함하지 않는다는 결정에 응답하여, 상기 키-값 세트 시퀀스의 기존 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트 시퀀스를 병합하는 단계로서, 상기 새로운 키 블록 세트는 상기 키-값 세트 시퀀스의 기존 키 블록 세트에 기초하여 생성되는, 상기 키-값 세트 시퀀스를 병합하는 단계; 및 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 단계를 포함한다.
예 14에서, 예 12 또는 예 13의 주제는 옵션으로 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동하는 시키는 것이 다음을 포함하는 경우를 포함한다 : 상기 병합된 키-값 세트를 분할(split) 키-값 세트의 세트로 파티션(partition)하는 단계로서, 각각의 분할 키-값 세트는 상기 자식 노드 세트의 다른 자식 노드에 할당되는, 상기 파티션하는 단계; 및 상기 분할 키-값 세트의 각각의 분할 키-값 세트를 상기 자식 노드 세트의 할당된 자식 노드로 이동시키는 단계를 포함한다.
예 15에서, 예 12 내지 14 중 어느 하나의 주제는 옵션으로 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것이 병합된 키-값이 생성된 후 다음을 포함하는 경우를 포함한다 : 상기 자식 노드 세트가 상기 리프 노드를 포함하지 않는다는 결정에 응답하여, 상기 노드로부터 상기 키-값 세트의 시퀀스에서 각각의 특정 키-값 세트를 삭제하는 단계로서, 상기 특정 키-값 세트를 삭제하는 단계는 상기 특정 키-값 세트의 하나 이상의 키 블록을 삭제하고 상기 특정 키-값 세트의 하나 이상의 값 블록을 남겨두는 것을 포함하는, 상기 삭제하는 단계를 포함한다.
예 16에서, 예 12 내지 15 중 어느 하나의 주제는 옵션으로 상기 새로운 키 블록의 세트는 상기 새로운 키 블록의 세트가 상기 기존 값 블록 세트에 대한 하나 이상의 참조를 포함하도록 상기 기존 키 블록 세트를 복사함으로써 상기 키-값 세트 시퀀스의 기존 키 블록 세트에 기초하여 생성되는 경우를 포함한다.
예 17에서, 예 12 내지 16 중 어느 하나의 주제는 옵션으로 상기 노드의 값 블록 세트 내의 각각의 특정 값 블록에 상기 특정 값 블록이 상기 키-값 저장소 트리 구조에 대해 초기에 생성된 시퀀스 순서를 나타내는 데이터 생성 번호(data generation number)가 할당되는 경우를 포함하고, 상기 키-값 세트 시퀀스를 상기 자식 노드 세트로 이동시키는 단계는, 상기 자식 노드 세트가 상기 리프 노드를 포함한다는 결정에 응답하여, 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하는 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 단계로서, 상기 새로운 키 블록 세트는 상기 키-값 세트의 시퀀스의 기존 키 블록 세트를 기반으로 생성되고, 상기 새로운 값 블록 세트는 상기 키-값 세트 시퀀스의 기존 값 블록 세트를 기반으로 생성되고, 상기 새로운 값 블록 세트에는 상기 기존 값 블록 세트의 임의의 값 블록에 할당된 특정 가장 큰 데이터 생성 번호가 할당되는, 상기 키-값 세트의 시퀀스를 병합하는 단계; 및 상기 병합된 키-값 세트를 노드의 상기 자식 노드 세트로 이동시키는 단계를 포함한다.
예 18에서, 예 12 내지 17 중 어느 하나의 주제는 옵션으로 상기 병합된 키-값 세트를 노드의 자식 노드 세트로 이동시키는 것이 다음을 포함하는 경우를 포함한다 : 상기 병합된 키-값 세트를 분할 키-값 세트의 세트로 파티션하는 단계로서, 각각의 분할 키-값 세트는 상기 자식 노드 세트의 다른 자식 노드에 할당되는, 상기 파티션하는 단계; 및 상기 분할 키-값 세트의 각각의 분할 키-값 세트를 상기 자식 노드 세트의 할당된 자식 노드로 이동시키는 단계를 포함한다.
예 19에서, 예 12 내지 18 중 어느 하나의 주제는 옵션으로 상기 병합된 키-값 세트를 생성하기 위해 키-값 세트의 시퀀스를 병합하는 것이 상기 병합된 키-값이 생성된 후 다음을 포함하는 경우를 포함한다 : 상기 자식 노드 세트가 상기 리프 노드를 포함한다는 결정에 응답하여, 상기 키-값 저장소 트리 데이터 구조의 각각의 특정 리프 노드에 대해 상기 특정 리프 노드와 관련된 임의의 값 블록에 할당된 가장 큰 데이터 생성 번호를 결정함으로써 가장 큰 데이터 생성 번호 세트를 결정하는 단계; 상기 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하는 단계; 및 상기 노드로부터, 상기 키-값 세트의 시퀀스에 각각의 특정 키-값 세트를 삭제하는 단계로서, 상기 특정 키-값 세트를 삭제하는 단계는, 상기 가장 작은 데이터 생성 번호보다 작은 특정 데이터 생성 번호를 갖는 상기 특정 키-값 세트의 기존 키 블록에 의해 참조되는 임의의 기존 값 블록을 삭제하는 단계; 및 상기 특정 키-값 세트의 하나 이상의 기존 키 블록을 삭제하는 단계를 포함한다.
예 20은 지침을 포함하는 비 일시적 기계 판독 가능 저장 매체에 있어서, 상기 지침은 프로세싱 디바이스에 의해 실행될 때, 상기 프로세싱 디바이스로 하여금, 메모리 컴포넌트의 세트 상에서, 키-값 저장소 트리 데이터 구조에 액세스하고, 상기 키-값 저장소 트리 데이터 구조는 노드 세트를 포함하고, 상기 노드 세트의 노드는 키 값 세트의 시퀀스를 포함하고; 키-값 세트 시퀀스를 병합하고 상기 노드로부터 상기 노드의 자식 노드 세트로 이동시키는 조건을 검출하고; 및 상기 조건 검출에 응답하여, 상기 노드의 자식 노드 세트가 리프 노드를 포함하는지 여부를 결정하고; 및 상기 자식 노드 세트가 상기 리프 노드를 포함하는지 여부의 결정에 기반하여 상기 키-값 세트 시퀀스를 상기 자식 노드 세트로 이동시키도록 한다.

Claims (15)

  1. 시스템에 있어서,
    키-값 저장소 트리 데이터 구조(key-value store tree data structure)를 저장하는 메모리 컴포넌트 세트 - 상기 키-값 저장소 트리 데이터 구조는 노드 세트를 포함하고, 상기 노드 세트 내의 노드는 키-값 세트의 시퀀스를 포함하고, 상기 노드의 각각의 키-값 세트는 적어도 하나의 값 블록을 포함하고, 상기 노드의 각각의 개별 값 블록에는 상기 개별 값 블록이 상기 키-값 저장소 트리 데이터 구조에 대해 초기에 생성된 시퀀스 순서를 나타내는 데이터 생성 번호(data generation number)가 할당됨 -; 및
    상기 메모리 컴포넌트 세트에 동작 가능하게 결합되어 동작들을 수행하도록 구성된 프로세싱 디바이스를 포함하고, 상기 동작들은,
    상기 키-값 세트의 시퀀스를 병합하고 상기 키-값 저장소 트리 데이터 구조의 노드로부터 상기 노드의 자식 노드 세트로 이동시키는 조건을 검출하는 것; 및
    상기 조건을 검출하는 것에 응답하여,
    상기 노드의 자식 노드 세트가 리프 노드(leaf node)를 포함하는지 여부를 결정하는 것; 및
    상기 자식 노드 세트가 리프 노드를 포함한다고 결정하는 것에 응답하여, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 것을 포함하고, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 것은,
    병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것을 포함하고, 상기 병합된 키-값 세트는 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하고, 상기 새로운 값 블록 세트에는 상기 키-값 세트의 시퀀스의 기존 값 블록 세트 내의 임의의 값 블록에 할당된 특정 가장 큰 데이터 생성 번호가 할당되는, 시스템.
  2. 제 1 항에 있어서, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 것은,
    상기 자식 노드 세트가 리프 노드를 포함하지 않는다고 결정하는 것에 응답하여,
    상기 키-값 세트의 시퀀스의 상기 기존 값 블록 세트를 참조하는 상기 새로운 키 블록 세트를 포함하는 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것 - 상기 새로운 키 블록 세트는 상기 키-값 세트의 시퀀스의 기존 키 블록 세트에 기초하여 생성됨 -; 및
    상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 것을 포함하는, 시스템.
  3. 제 2 항에 있어서, 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 것은,
    상기 병합된 키-값 세트를 분할(split) 키-값 세트의 세트로 파티션(partition)하는 것 - 각각의 분할 키-값 세트는 상기 자식 노드 세트 내의 상이한 자식 노드에 할당됨 -; 및
    상기 분할 키-값 세트의 세트 내의 각각의 분할 키-값 세트를 상기 자식 노드 세트 내의 할당된 자식 노드로 이동시키는 것을 포함하는, 시스템.
  4. 제 2 항에 있어서, 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것은, 상기 병합된 키-값이 생성된 후,
    상기 자식 노드 세트가 리프 노드를 포함하지 않는다고 결정하는 것에 응답하여, 상기 노드로부터, 상기 키-값 세트의 시퀀스에서 각각의 특정 키-값 세트를 삭제하는 것을 포함하고, 상기 특정 키-값 세트를 삭제하는 것은 상기 특정 키-값 세트의 하나 이상의 값 블록을 남겨두면서 상기 특정 키-값 세트의 하나 이상의 키 블록을 삭제하는 것을 포함하는, 시스템.
  5. 제 2 항에 있어서, 상기 새로운 키 블록 세트는 상기 새로운 키 블록 세트가 상기 기존 값 블록 세트에 대한 하나 이상의 참조를 포함하도록 상기 기존 키 블록 세트를 복사함으로써 상기 키-값 세트의 시퀀스의 기존 키 블록 세트에 기초하여 생성되는, 시스템.
  6. 제 1 항에 있어서, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 것은, 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 것을 포함하는, 시스템.
  7. 제 6 항에 있어서, 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 것은,
    상기 병합된 키-값 세트를 분할 키-값 세트의 세트로 파티션하는 것 - 각각의 분할 키-값 세트는 상기 자식 노드 세트 내의 상이한 자식 노드에 할당됨 -; 및
    상기 분할 키-값 세트의 세트 내의 각각의 분할 키-값 세트를 상기 자식 노드 세트 내의 할당된 자식 노드로 이동시키는 것을 포함하는, 시스템.
  8. 제 1 항에 있어서, 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것은, 상기 병합된 키-값 세트가 생성된 후,
    상기 키-값 저장소 트리 데이터 구조의 각각의 특정 리프 노드에 대해, 상기 특정 리프 노드와 관련된 임의의 값 블록에 할당된 가장 큰 데이터 생성 번호를 결정함으로써 가장 큰 데이터 생성 번호 세트를 결정하는 것;
    상기 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하는 것; 및
    상기 노드로부터, 상기 키-값 세트의 시퀀스에 각각의 특정 키-값 세트를 삭제하는 것을 포함하고, 상기 특정 키-값 세트를 삭제하는 것은,
    상기 가장 작은 데이터 생성 번호보다 작은 특정 데이터 생성 번호를 갖는 상기 특정 키-값 세트의 기존 키 블록에 의해 참조되는 임의의 기존 값 블록을 삭제하는 것; 및
    상기 특정 키-값 세트의 하나 이상의 기존 키 블록을 삭제하는 것을 포함하는, 시스템.
  9. 제 1 항에 있어서, 상기 동작들은,
    결정된 가장 큰 데이터 생성 번호 세트에서 가장 작은 데이터 생성 번호를 결정하는 것;
    주어진 값 블록의 특정 데이터 생성 번호가 상기 가장 작은 데이터 생성 번호보다 작은 지 여부를 결정하는 것; 및
    상기 특정 데이터 생성 번호가 상기 가장 작은 데이터 생성 번호보다 작다고 결정하는 것에 응답하여 상기 키-값 저장소 트리 데이터 구조의 상기 주어진 값 블록을 삭제하는 것을 더 포함하는, 시스템.
  10. 제 1 항에 있어서, 상기 시스템은 메모리 서브 시스템인, 시스템.
  11. 제 1 항에 있어서, 호스트 시스템이 상기 프로세싱 디바이스를 포함하고, 메모리 서브 시스템이 상기 메모리 컴포넌트 세트를 포함하는, 시스템.
  12. 방법에 있어서,
    프로세싱 디바이스에 의해, 키-값 저장소 트리 데이터 구조를 메모리 컴포넌트 세트 상에 생성하는 단계 - 상기 키-값 저장소 트리 구조는 노드 세트를 포함하고, 상기 노드 세트의 노드는 키-값 세트의 시퀀스를 포함하고, 상기 노드의 각각의 키-값 세트는 적어도 하나의 값 블록을 포함하고, 상기 노드의 각각의 개별 값 블록에는 상기 개별 값 블록이 상기 키-값 저장소 트리 데이터 구조에 대해 초기에 생성된 시퀀스 순서를 나타내는 데이터 생성 번호가 할당됨 -;
    상기 프로세싱 디바이스에 의해, 상기 키-값 세트의 시퀀스를 병합하고 상기 노드로부터 상기 노드의 자식 노드 세트로 이동시키는 조건을 검출하는 단계; 및
    상기 조건을 검출하는 것에 응답하여,
    상기 프로세싱 디바이스에 의해, 상기 노드의 자식 노드 세트가 리프 노드를 포함하는지 여부를 결정하는 단계; 및
    상기 자식 노드 세트가 리프 노드를 포함한다고 결정하는 것에 응답하여, 상기 프로세싱 디바이스에 의해, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 단계를 포함하고, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 단계는,
    병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 단계를 포함하고, 상기 병합된 키-값 세트는 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하고, 상기 새로운 값 블록 세트에는 상기 키-값 세트의 시퀀스의 기존 값 블록 세트 내의 임의의 값 블록에 할당된 특정 가장 큰 데이터 생성 번호가 할당되는, 방법.
  13. 제 12 항에 있어서, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 단계는,
    상기 자식 노드 세트가 리프 노드를 포함하지 않는다고 결정하는 것에 응답하여,
    상기 키-값 세트의 시퀀스의 상기 기존 값 블록 세트를 참조하는 상기 새로운 키 블록 세트를 포함하는 상기 병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 단계 - 상기 새로운 키 블록 세트는 상기 키-값 세트의 시퀀스의 기존 키 블록 세트에 기초하여 생성됨 -; 및
    상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 단계를 포함하는, 방법.
  14. 제 12 항에 있어서, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 단계는, 상기 병합된 키-값 세트를 상기 노드의 자식 노드 세트로 이동시키는 단계를 포함하는, 방법.
  15. 명령어들을 포함하는 비 일시적 기계 판독 가능 저장 매체에 있어서, 상기 명령어들은 프로세싱 디바이스에 의해 실행될 때, 상기 프로세싱 디바이스로 하여금,
    메모리 컴포넌트 세트 상에서, 키-값 저장소 트리 데이터 구조에 액세스하고 - 상기 키-값 저장소 트리 데이터 구조는 노드 세트를 포함하고, 상기 노드 세트의 노드는 키-값 세트의 시퀀스를 포함하고, 상기 노드의 각각의 키-값 세트는 적어도 하나의 값 블록을 포함하고, 상기 노드의 각각의 개별 값 블록에는 상기 개별 값 블록이 상기 키-값 저장소 트리 데이터 구조에 대해 초기에 생성된 시퀀스 순서를 나타내는 데이터 생성 번호가 할당됨 -;
    키-값 세트의 시퀀스를 병합하고 상기 노드로부터 상기 노드의 자식 노드 세트로 이동시키는 조건을 검출하고;
    상기 조건을 검출하는 것에 응답하여,
    상기 노드의 자식 노드 세트가 리프 노드를 포함하는지 여부를 결정하고;
    상기 자식 노드 세트가 리프 노드를 포함한다고 결정하는 것에 응답하여, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키도록 하고, 상기 키-값 세트의 시퀀스를 상기 자식 노드 세트로 이동시키는 것은,
    병합된 키-값 세트를 생성하기 위해 상기 키-값 세트의 시퀀스를 병합하는 것을 포함하고, 상기 병합된 키-값 세트는 새로운 값 블록 세트를 참조하는 새로운 키 블록 세트를 포함하고, 상기 새로운 값 블록 세트에는 상기 키-값 세트의 시퀀스의 기존 값 블록 세트 내의 임의의 값 블록에 할당된 특정 가장 큰 데이터 생성 번호가 할당되는, 비 일시적 기계 판독 가능 저장 매체.
KR1020217014028A 2018-10-10 2019-10-02 압축한 키-값 저장소 트리 데이터 블록 유출 KR102665979B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/156,440 US11100071B2 (en) 2018-10-10 2018-10-10 Key-value store tree data block spill with compaction
US16/156,440 2018-10-10
PCT/US2019/054243 WO2020076580A1 (en) 2018-10-10 2019-10-02 Key-value store tree data block spill with compaction

Publications (2)

Publication Number Publication Date
KR20210057835A KR20210057835A (ko) 2021-05-21
KR102665979B1 true KR102665979B1 (ko) 2024-05-16

Family

ID=

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130204902A1 (en) * 2012-02-03 2013-08-08 Apple Inc. Enhanced B-Trees with Record Merging
US20130218840A1 (en) * 2012-02-17 2013-08-22 Charles Smith System and method for building a point-in-time snapshot of an eventually-consistent data store
US20150286695A1 (en) * 2014-04-03 2015-10-08 Sandisk Enterprise Ip Llc Methods and Systems for Performing Efficient Snapshots in Tiered Data Structures
US20180225315A1 (en) 2017-02-09 2018-08-09 Micron Technology, Inc. Kvs tree

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130204902A1 (en) * 2012-02-03 2013-08-08 Apple Inc. Enhanced B-Trees with Record Merging
US20130218840A1 (en) * 2012-02-17 2013-08-22 Charles Smith System and method for building a point-in-time snapshot of an eventually-consistent data store
US20150286695A1 (en) * 2014-04-03 2015-10-08 Sandisk Enterprise Ip Llc Methods and Systems for Performing Efficient Snapshots in Tiered Data Structures
US20180225315A1 (en) 2017-02-09 2018-08-09 Micron Technology, Inc. Kvs tree

Similar Documents

Publication Publication Date Title
US11100071B2 (en) Key-value store tree data block spill with compaction
US11599552B2 (en) Counter-based compaction of key-value store tree data block
CN113196259B (zh) 使用以选择性数据存储格式进行日志记录的键值存储
US10725930B2 (en) Logical to physical memory address mapping tree
CN113196260B (zh) 能够选择性使用键部分的键值存储树
US11657092B2 (en) Data tree with order-based node traversal
US8868926B2 (en) Cryptographic hash database
KR101397353B1 (ko) Key-value 스토어를 포함하는 메모리 시스템
KR102302426B1 (ko) 저장 디바이스 상의 네임스페이스에서의 오류 검사
CN115309584A (zh) 键值存储故障后的分区存储器装置恢复
KR102665979B1 (ko) 압축한 키-값 저장소 트리 데이터 블록 유출
US20220050807A1 (en) Prefix probe for cursor operations associated with a key-value database system
US11762913B2 (en) Cursor seek operations using deleted record spans
KR102360879B1 (ko) 캐시라인 컨시어스 익스텐더블 해싱 방법 및 장치