KR20200053512A - Kvs 트리 데이터베이스 - Google Patents
Kvs 트리 데이터베이스 Download PDFInfo
- Publication number
- KR20200053512A KR20200053512A KR1020207009185A KR20207009185A KR20200053512A KR 20200053512 A KR20200053512 A KR 20200053512A KR 1020207009185 A KR1020207009185 A KR 1020207009185A KR 20207009185 A KR20207009185 A KR 20207009185A KR 20200053512 A KR20200053512 A KR 20200053512A
- Authority
- KR
- South Korea
- Prior art keywords
- node
- key
- tree
- kvset
- entry
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9027—Trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
KVS 트리 데이터베이스 및 여기서의 동작이 본 명세서에서 기재된다. KVS 트리 데이터베이스는 기본 레벨과 다음 레벨을 포함하는 멀티레벨 트리이다. 기본 레벨은 노드에서 이종 kvset를 포함한다. 이종 kvset는 다수의 KVS 트리에 대한 엔트리, 가령, 제1 KVS 트리에 대한 제1 엔트리 및 제2 KVS 트리에 대한 제2 엔트리를 포함한다. 다음 레벨은 제1 KVS 트리에 대한 제1 동종 kvset를 포함하는 제1 노드 및 제2 KVS 트리에 대한 제2 동종 kvset를 포함하는 제2 노드를 포함한다. 여기서, 동종 kvset는 단 하나의 KVS 트리로부터의 노드만 포함한다. 상기 KVS 트리 데이터베이스는 기본 레벨과 다음 레벨 간 엔트리의 제1 결정적 매핑 및 다음 레벨들 간 엔트리의 제2 결정적 매핑을 더 포함한다.
Description
우선권 출원
이 출원은 그 전체가 본 명세서에 참조로서 포함되는 2017년 08월 31일에 출원된 미국 출원 번호 15/691,888의 우선권의 이익을 주장한다.
기술 분야
본 명세서에 기재되는 실시예는 일반적으로 키-값 데이터 스토어와 관련되며 더 구체적으로 KVS 트리 데이터베이스를 구현하는 것과 관련된다.
데이터 구조가 거기에 저장된 데이터와 상호대화하는 다양한 방식을 가능하게 하는 데이터의 구성이다. 데이터 구조는 데이터의 효율적인 검색을 가능하게 하도록, 예를 들어 이진 검색 트리로 설계되거나, 희소 데이터의 효율적인 저장을 가능하게 하도록, 가령, 링크드 리스트로 설계되거나, 검색 가능한 데이터의 효율적인 저장을 가능하게 하도록, 가령, B-트리로 설계될 수 있는 등이다.
키-값 데이터 구조는 키-값 쌍을 수용하고 키에 대한 질의에 응답하도록 구성된다. 키-값 데이터 구조는 딕셔너리(가령, 맵, 해시 맵 등) 같은 구조를 포함할 수 있으며, 여기서 키는 각자의 값을 링크(또는 포함)하는 리스트에 저장된다. 이들 구조가 메모리-내에서(가령, 스토리지와 다르게 메인 또는 시스템 상태 메모리에서) 유용하지만, 영속 스토리지에서(가령, 온-디스크) 이들 구조의 스토리지 표현은 비효율적일 수 있다. 따라서 로그-기반 스토리지 구조의 클래스가 도입되었다. 하나의 예시가 로그 구조 병합 트리(log structured merge tree)(LSM 트리)이다.
다양한 LSM 트리 구현예가 존재하지만, 다수가 키-값 쌍이 키-정렬 메모리내 구조로 수용되는 설계를 따른다. 메모리내 구조가 채워짐에 따라, 데이터가 자식 노드들 간에 분산된다. 분산은 자식 노드 내 키가 자식 노드 내에서 그리고 자식 노드들 간에 순서화되도록 이뤄진다. 예를 들어, 3개의 자식 노드를 갖는 제1 트리-레벨에서, 최좌측 자식 노드 내 가장 큰 키가 중앙 자식 노드로부터의 가장 작은 키보다 작고 중앙 자식 노드 내 가장 큰 키가 최우측 자식 노드로부터의 가장 작은 키보다 작다. 이 구조는 두 키 모두뿐 아니라 데이터 구조 내 키의 범위에 대해서도 효율적인 검색을 가능하게 한다.
반드시 실제 비율로 그려진 것은 아닌 도면에서, 상이한 도면에서 유사한 도면부호가 유사한 구성요소를 기술할 수 있다. 상이한 문자 접미사를 갖는 유사한 도면부호가 유사한 구성요소의 상이한 사례를 나타낼 수 있다. 도면은 일반적으로 비제한적 예를 들어, 본 명세서에서 언급된 다양한 실시예를 도시한다.
도 1은 하나의 실시예에 따르는 KVS 트리 데이터베이스의 예시를 도시한다.
도 2는 하나의 실시예에 따르는, 멀티-스트림 저장 디바이스로의 쓰기(write)의 일례를 도시하는 블록도이다.
도 3은 하나의 실시예에 따르는, 멀티-스트림 저장 디바이스로의 쓰기를 촉진시키기 위한 방법의 일례를 도시한다.
도 4는 하나의 실시예에 따르는 키(key) 및 값(value)에 대한 저장 구성의 하나의 예시를 도시하는 블록도이다.
도 5는 하나의 실시예에 따르는, KVS 트리 데이터베이스 인제스션을 도시하는 블록도이다.
도 6은 하나의 실시예에 따르는, KVS 트리 인제스션을 위한 방법의 예시를 도시한다.
도 7은 하나의 실시예에 따르는 키 압축(key compaction)을 도시하는 블록도이다.
도 8은 하나의 실시예에 따르는 키 압축을 위한 방법의 하나의 예시를 도시한다.
도 9는 하나의 실시예에 따르는, 키-값 압축을 도시하는 블록도이다.
도 10은 하나의 실시예에 따르는, 키-값 압축을 위한 방법의 하나의 예시를 도시한다.
도 11은 하나의 실시예에 따르는 스필 값 및 트리 데이터베이스와 이의 관계의 일례를 도시한다.
도 12는 하나의 실시예에 따라, 스필 값 함수를 위한 방법의 일례를 도시한다.
도 13은 하나의 실시예에 따라, 스필 압축을 도시하는 블록도이다.
도 14는 하나의 실시예에 따라, 스필 압축을 위한 방법의 일례를 도시한다.
도 15는 하나의 실시예에 따라, 호이스트 압축(hoist compaction)을 도시하는 블록도이다.
도 16은 하나의 실시예에 따라, 호이스트 압축을 위한 방법의 일례를 도시한다.
도 17은 하나의 실시예에 따라, KVS 트리 데이터베이스 상에서 유지관리를 수행하기 위한 방법의 일례를 도시한다.
도 18은 하나의 실시예에 따르는, 키 검색을 도시하는 블록도이다.
도 19는 하나의 실시예에 따르는, 키 검색을 수행하기 위한 방법의 일례를 도시한다.
도 20은 하나의 실시예에 따라, 키 스캔을 도시하는 블록도이다.
도 21은 하나 이상의 실시예가 구현될 수 있는 머신의 일례를 도시하는 블록도이다.
도 1은 하나의 실시예에 따르는 KVS 트리 데이터베이스의 예시를 도시한다.
도 2는 하나의 실시예에 따르는, 멀티-스트림 저장 디바이스로의 쓰기(write)의 일례를 도시하는 블록도이다.
도 3은 하나의 실시예에 따르는, 멀티-스트림 저장 디바이스로의 쓰기를 촉진시키기 위한 방법의 일례를 도시한다.
도 4는 하나의 실시예에 따르는 키(key) 및 값(value)에 대한 저장 구성의 하나의 예시를 도시하는 블록도이다.
도 5는 하나의 실시예에 따르는, KVS 트리 데이터베이스 인제스션을 도시하는 블록도이다.
도 6은 하나의 실시예에 따르는, KVS 트리 인제스션을 위한 방법의 예시를 도시한다.
도 7은 하나의 실시예에 따르는 키 압축(key compaction)을 도시하는 블록도이다.
도 8은 하나의 실시예에 따르는 키 압축을 위한 방법의 하나의 예시를 도시한다.
도 9는 하나의 실시예에 따르는, 키-값 압축을 도시하는 블록도이다.
도 10은 하나의 실시예에 따르는, 키-값 압축을 위한 방법의 하나의 예시를 도시한다.
도 11은 하나의 실시예에 따르는 스필 값 및 트리 데이터베이스와 이의 관계의 일례를 도시한다.
도 12는 하나의 실시예에 따라, 스필 값 함수를 위한 방법의 일례를 도시한다.
도 13은 하나의 실시예에 따라, 스필 압축을 도시하는 블록도이다.
도 14는 하나의 실시예에 따라, 스필 압축을 위한 방법의 일례를 도시한다.
도 15는 하나의 실시예에 따라, 호이스트 압축(hoist compaction)을 도시하는 블록도이다.
도 16은 하나의 실시예에 따라, 호이스트 압축을 위한 방법의 일례를 도시한다.
도 17은 하나의 실시예에 따라, KVS 트리 데이터베이스 상에서 유지관리를 수행하기 위한 방법의 일례를 도시한다.
도 18은 하나의 실시예에 따르는, 키 검색을 도시하는 블록도이다.
도 19는 하나의 실시예에 따르는, 키 검색을 수행하기 위한 방법의 일례를 도시한다.
도 20은 하나의 실시예에 따라, 키 스캔을 도시하는 블록도이다.
도 21은 하나 이상의 실시예가 구현될 수 있는 머신의 일례를 도시하는 블록도이다.
전통적으로, LSM 트리가 많은 양의 쓰기가 기대되고 또한 데이터에 대한 효율적인 액세스가 기대되는 데이터에 대한 인기 있는 저장 구조이다. 이들 특징을 지원하기 위해, 종래의 솔루션은 LSM의 부분이 유지되는 매체에 대해 LSM의 부분을 조정할 수 있고 백그라운드 프로세스는 일반적으로 상이한 부분들 간 (예를 들어, 메모리-내 부분에서 디스크 상 부분으로)의 데이터 이동을 처리한다. 본 명세서에서, "메모리-내(in-memory)"는 랜덤 액세스 및 바이트-어드레싱 가능한 디바이스(가령, 정적 랜덤 액세스 메모리(SRAM) 또는 동적 랜덤 액세스 메모리(DRAM))를 지칭하며, "온-디스크(on-disk)"는 블록 어드레싱 가능한 - 또는 바이트보다 큰 그 밖의 다른 워드 어드레싱 가능한 영역, 가령, 페이지, 라인, 스트링 등 - 디바이스(가령, 하드 디스크 드라이브, 컴팩트 디스크, 디지털 다목적 디스크, 또는 솔리드-스테이트 드라이브(SSD), 가령, 플래시 메모리 기반 디바이스)를 지칭하며, 이들은 또한 미디어 디바이스 또는 저장 디바이스라고도 지칭된다. LSM 트리는 메모리-내 디바이스에 의해 제공되는 준비된 액세스를 활용하여 들어오는 데이터를 키별로 정렬하여 해당 값에 대한 준비된 액세스를 제공할 수 있다. 데이터가 디스크 상 부분(on-disk portion)에 병합될 때 상주하는 온-디스크 데이터는 새 데이터와 병합되고 다시 디스크로 블록 단위로 써진다.
LSM 트리는 다수의 데이터베이스 및 볼륨 스토리지(가령, 클라우드 스토리지) 설계의 기본 구조로 널리 사용되지만 몇 가지 단점이 있다. 첫째, 키에 의해 정렬된 내부 구조를 유지하기 위해 새로운 데이터를 오래된 데이터와 지속적으로 병합하는 것이 상당한 쓰기 증폭(write amplification)을 초래한다. 쓰기 증폭은 주어진 저장 기술에 의해 부과되는 데이터에 대한 최소 쓰기 수의 증가이다. 예를 들어, 데이터를 저장하기 위해 디스크에 적어도 한 번 써진다. 예를 들어, 이는 이미 써진 데이터의 끝 부분 상에 데이터의 최신의 것을 추가(append)함으로써 이뤄질 수 있다. 그러나 이 구조는 검색 속도가 느리며(가령, 데이터 양에 따라 선형으로 증가), 데이터가 변경되거나 삭제될 때 비효율성을 초래할 수 있다. LSM 트리는 디스크로부터 데이터를 읽고 새 데이터와 병합하여 이 데이터를 디스크로 다시 쓰기 때문에 쓰기 증폭을 증가시킨다. 저장 디바이스 활동, 가령, 하드 디스크 드라이브의 조각모음 또는 SSD의 가비지 수집이 포함될 때, 쓰기 증폭 문제가 악화될 수 있다. SSD 상의 쓰기 증폭은 이들 디바이스가 쓰기 횟수의 함수로서 "마모"될 수 있기 때문에 특히 중요하다. 즉, SSD는 쓰기로 측정된 제한된 수명을 가진다. 따라서 SSD에서의 쓰기 증폭이 기본 하드웨어의 사용 수명을 단축시키도록 작용한다.
LSM 트리의 두 번째 문제는 병합을 수행하는 동안 소비될 수 있는 많은 양의 공간을 포함하다. LSM 트리는 디스크 상 부분이 키 별로 정렬됨을 보장한다. 디스크에 상주하는 데이터의 양이 많은 경우, 많은 양의 임시, 또는 스크래치, 공간이 병합을 수행하는 데 소비될 수 있다. 이는 디스크 상 부분을 비-중첩 구조로 분할하여 데이터 서브세트에 대한 병합을 허용함으로써 다소 완화될 수 있지만, 구조 오버헤드와 성능 간 균형을 달성하기 어려울 수 있다.
LSM 트리의 세 번째 문제는 쓰기 처리량이 제한될 수 있다는 것이다. 이 문제는 LSM 데이터 전체의 본질적으로 항상 정렬되는 특성에서 비롯된다. 따라서 메모리 내 부분을 압도하는 많은 양의 쓰기는 시간-소모적일 수 있는 병합 동작에 의해 메모리 내 부분이 비워질 때까지 기다려야 한다. 이 문제를 해결하기 위해, 이 시나리오에서 병합 문제를 피하기 위해 더 작은 데이터 삽입이 조작되는 종래의 쓰기 버퍼(WB) 트리가 제안되었다. 구체적으로, WB 트리는 들어오는 키를 해싱하여 데이터를 확산시키고 키-해시 및 값 조합을 더 작은 인테이크 세트로 저장한다. 이들 세트는 다양한 시간에서 병합되거나 키-해시 값을 기초로 자식 노드에 써질 수 있다. 이를 통해 특정 키를 검색하는 동안 LSM 트리의 비싼 병합 작업을 피할 수 있다. 그러나 WB 트리가 키-해시로 정렬되는 것은, 가령, 키의 범위를 검색할 때, 키-해시에 의해 직접 참조되지 않는 값을 찾기 위한 비싼 전체 트리 스캔을 초래한다.
KVS 트리 및 대응하는 동작은 LSM 트리 또는 이와 관련된 데이터 구조와 관련하여 위에서 설명한 문제를 해결한다. KVS 트리는 트리의 내용보다는 키의 지정 파생에 기초하여 부모 노드와 자식 노드 간 연결을 갖는 노드를 포함하는 트리 데이터 구조이다. 노드는 KVS라고도 알려진 키-값 세트(kvset)의 시간순 시퀀스를 포함한다. Kvset은 키-정렬된 구조에 키-값 쌍을 포함한다. Kvset은 작성되면 변경될 수 없다. KVS 트리는 노드에 kvset를 유지하고, kvset가 정렬된 키와, 예를 들어, 키 메트릭(가령, 블룸 필터, 최소 및 최대 키 등)을 포함하여, kvset의 효율적인 검색을 제공함으로써, WB 트리 검색을 개선하면서 WB-트리의 쓰기-처리량을 달성한다. 많은 예에서, KVS 트리는 키를 값에서 분리하고 더 작은 kvset 모음을 병합함으로써, LSM 트리의 임시 저장 문제를 개선할 수 있다. 또한, 기재된 KVS 트리는 kvset에 대한 다양한 유지관리 동작을 통해 쓰기 증폭을 감소시킬 수 있다. 또한 노드에서의 kvset이 변경 불가능하기 때문에, SSD의 쓰기 마모(write wear)와 같은 문제가 데이터 구조에 의해 관리될 수 있어서, 디바이스 자체의 가비지 수집 활동을 감소시킬 수 있다. 이는 더 우수한 외부 드라이브 성능(가령, 읽기 또는 쓰기 속도)을 야기하는 내부 디바이스 자원(가령, 버스 대역폭, 프로세싱 사이클 등)을 해방한다는 추가 이점을 가진다.
KVS 트리는 다양한 저장 작업을 위한 유연하고 강력한 데이터 구조이지만, 본 개시에서 기재된 바와 같이, 다수의 KVS 트리를 KVS 트리 데이터베이스(KVDB)로 결합함으로써 보다 큰 효율성이 얻어질 수 있다. KVS 트리의 읽기 및 쓰기 성능을 유지하거나 향상시키기 위해, KVDB는 복수의 KVS 트리의 루트 계층(root layer)을 복수의 트리로부터의 엔트리와 노드 및 kvset을 포함하는 기본 레벨로 혼합한다. KVDB의 기본 레벨을 넘어서, 복수의 KVS 트리는 이들 서브-트리의 노드의 kvset가 동종(예를 들어, 단 하나의 KVS 트리의 엔트리를 포함함)이도록 개별 서브-트리로 분기될 수 있다. 다시 말해 KVDB는 공통 루트 구조를 가진 서로소인 KVS 트리들의 포레스트(forest)이다. KVDB는 KVS 트리에 비해 많은 장점을 제공할 수 있다. 예를 들어, 여러 트리에 대한 쓰기가 기본 레벨 kvset에서 결합될 수 있기 때문에 쓰기 효율이 향상될 수 있다. 추가 KVDB 장점이 이하에서 기재된다.
본 개시의 구현이, 기본 레벨의 혼합 트리 kvset를 지원하기 위한 검색 또는 유지관리(예를 들어, 압축) 동작 동안 트리를 구별하기 위해, 엔트리 키와 함께 사용되는 트리 식별자(TID)를 기술한다. 엔트리 키와 함께 TID를 사용하는 것을 제외하고, KVS 트리 동작은 KVDB에 적용되어, KVS 트리의 가볍고 효율적인 집성(aggregation)을 제공할 수 있다. 복수의 KVS 트리를 결합하는 것이 여러 KVS 트리에 대한 쓰기가 함께 버퍼링되어 하나의 kvset에 써질 수 있기 때문에 별도의 KVS 트리에서 발생할 수 있는 것보다 더 큰 블록으로 기본 매체(가령, 디스크 또는 그 밖의 다른 스토리지)로의 효율적인 읽기 및 쓰기 동작을 가능하게 한다. 본 명세서에 기재된 기술 및 구조가 솔리드-스테이트 드라이브(가령, NAND FLASH 디바이스)에 특히 이점을 제공하지만, 이들 구조 및 기술은 또한 그 밖의 다른 다양한 형태의 머신 판독형 매체 중 하나에서 사용 가능하고 유용하다.
도 1은 하나의 실시예에 따른 KVDB(100)의 예시적인 블록도를 도시한다. KVDB(100)는 KVS 트리들 간 공통 기본 레벨과 서로소인 다음 레벨(가령, L1, L2 및 L3)을 갖는 트리로 구성되는 복수의 KVS 트리 - T1 및 T2로 도시됨 - 를 포함한다. 값은 상기 값을 참조하는 대응하는 키와 함께 KVDB(100)에 저장된다. 포함된 KVS 트리(가령, KVDB(100) 내 KVS 트리)와 관련하여, 키-엔트리가 키와 추가 정보, 가령, 값에 대한 참조 모두를 보유하는 데 사용되지만, 달리 특정되지 않는 한, 단순성을 위해 키-엔트리는 간단히 키라고 지칭된다. 키 자체가 KVS 트리 내에서 총 순서(total ordering)를 가진다. 따라서, 키들은 서로 간에 정렬될 수 있다. 키는 또한 서브-키(sub-key)로 나뉠 수 있다. 일반적으로 서브-키들은 하나의 키의 겹치지 않는 부분들이다. 하나의 예를 들면, 키의 총 순서는 복수의 키들 간에 유사한 서브-키를 비교하는 것을 기초로 한다(예를 들어, 하나의 키의 제1 서브-키가 또 다른 키의 제1 서브-키와 비교됨). 하나의 예에서, 키 프리픽스(key prefix)는 하나의 키의 시작 부분이다. 키 프리픽스는 사용될 때 하나 이상의 서브-키로 구성될 수 있다.
KVDB(100)는 하나 이상의 노드, 가령, 노드(105, 110 또는 130)를 포함한다. 노드는 시간 순서로 불변 키-값 세트(kvset)의 시간순 시퀀스를 포함한다. 앞서 언급한 바와 같이, KVDB(100)은 기본 레벨에서 이종 kvset - 복수의 KVS 트리로부터의 엔트리를 포함하는 kvset - 와, 다음 레벨에서 동종 kvset - 단 하나의 KVS 트리로부터의 엔트리를 포함하는 kvset - 를 포함함으로써, 하나의 KVS 트리와 다르다. 도면 전체에 걸쳐, 이종 kvset는 줄무늬(예를 들어, kvset(115 및 120))로 도시되고 동종 kvset는 색칠(예를 들어, kvset(125))로 도시된다. 또한, 다음 레벨 노드가 단일 KVS 트리에 속함을 나타내기 위해, 노드는 왼쪽 위 모서리에 자신의 트리 소속을 나타내는 배지(예를 들어, 도 1의 T1 또는 T2)를 포함한다. 또한, 도시된 바와 같이, kvset(115)는 신이 시퀀스 중 가장 최신(newest)임을 나타내기 위해 'N' 배지를 포함하고, kvset(120)는 자신이 시퀀스 중 가장 오래됨(oldest)을 나타내기 위해 'O'배지를 포함한다. Kvset(125)는 'I' 배지를 포함하여, 자신이 시퀀스의 중간임을 나타낸다. 이들 배지가 전체적으로 kvset를 라벨링하기 위해 사용되지만, 단순히 익명 kvset인 물결표시 "~"가 아닌 한, 또 다른 배지(가령, "X")가 시퀀스 내 자신의 위치(가령, 최신, 중간, 오래됨 등)가 아닌 특정 kvset을 지시한다. 이하에서 더 상세히 설명될 바와 같이, 오래된 키-값 엔트리일수록 KVDB(100)에 포함 된 KVS 트리 내 낮은 곳에서 발생한다. 따라서 엔트리의 레벨을 올리는 것, 가령, L2에서 L1으로 올리는 것이 수신 노드 내 가장 오래된 위치에 새 kvset이 있게 한다.
KVS 트리가 노드 내 키를 단일 자식 노드에 매핑하는 결정적 매핑을 포함한다. 따라서 키-값 쌍이 주어지면, 외부 개체가 트리의 내용를 몰라도 가능한 자식 노드의 KVS 트리를 통한 경로를 추적할 수 있다. 예를 들어, 이는 트리의 검색-최적화된 구조를 유지하기 위해 특정 키의 값이 어디에 해당하는지를 결정할 B-트리와 꽤 다르다. 대신에, KVS 트리의 결정적 매핑은, 예를 들어, 키가 주어지면, 최대 트리-레벨(가령, 트리 심도)가 L1에 불과할 때조차, 이 키가 매핑될 L3에서의 자식을 계산할 수 있도록 하는 규칙을 제공한다.
KVDB(100)는 또한 결정적 매핑(determinative mapping)을 포함한다. 그러나, KVDB는 기본 레벨과 다음 레벨(가령, L1) 간 엔트리의 제1 결정적 매핑, 및 다음 레벨들 간 제2 결정적 매핑을 포함한다. 하나의 예를 들면, 제1 결정적 매핑은 하나의 엔트리에 대응하는 KVS 트리에 대한 TID를 기초로 한다. KVDB(100)는 2개의 KVS 트리(T1 및 T2)를 갖는 것으로 도시되어 있다. 제1 결정적 매핑은 이종 kvset(예를 들어, kvset(120))을 포함하는 기본 레벨 노드(가령, 노드(110))로부터 단일 KVS 트리로부터 동종 kvset을 갖는 다음 레벨 노드(예를 들어, 노드(135))로 엔트리를 매핑한다. 예를 들어, KVS 트리 T1으로 도시된 바와 같이, 제1 결정적 매핑은 KVS 트리에 대한 단일 루트 다음 노드(가령, 노드(135))로 엔트리를 배치하기 위해 TID만 사용할 수 있다. 루트 다음 노드는 동종 kvset이 있는 최상위 레벨 노드이다. 그러나, T2와 관련하여 도시 된 바와 같이, 둘 이상의 루트 다음 노드가 존재할 수 있다. 이러한, 제1 결정적 매핑은 TID를 이용하여 엔트리에 대해 가능한 여러 루트 다음 노드 중 하나만 선택할 수 있다. 하나의 예를 들면, TID는, 가령, KVS 트리 T2와 관련하여 도시된 바와 같이, 엔트리에 대한 키와 결합되어, 여러 노드 중 하나로 엔트리를 매핑할 수 있다.
제1 결정적 매핑에서 TID 사용을 용이하게 하기 위해, 이종 kvset의 엔트리는 엔트리의 일부로서 TID를 포함할 수 있다. 예를 들어, 동종 kvset은 엔트리로부터 TID를 생략시킨다. 따라서, 사용되는 경우, TID는 쉽게 이용 가능하고, 사용되지 않는 경우, 엔트리로부터 TID를 생략함으로써 공간이 절약된다. 하나의 예를 들면, TID는 동종 kvset을 갖는 노드에 저장될 수 있다. 이는 더 유연한 노드 구현을 가능하게 하면서, 엔트리 내 공간을 절약하는 절충을 제공할 수 있다.
하나의 예를 들면, 제2 결정적 매핑은 다음 레벨의 노드에 대응하는 KVS 트리에 대해 특정된 결정적 매핑이다. 예를 들어, 도 1에서 T2로 마킹된 노드는 KVS 트리에 의해 T2로 특정된 제2 결정적 매핑을 이용하는 다음 레벨 노드이고, 도 1에서 T1으로 마킹된 노드는 KVS 트리에 의해 T1으로 특정된 제2 결정적 매핑을 이용하는 다음 레벨 노드이다. 따라서, 제2 결정적 매핑(둘 이상이 존재하더라도)이 동종 kvset을 갖는 다음 레벨 노드에서 동작한다.
KVS 트리에서, 기본 레벨, 또는 루트는 바이트-어드레싱 가능한 제1 매체, 가령, RAM(random access memory) 등에서 단일 노드, 및 블록 어드레싱 가능한 제1 매체, 가령, 플래시 스토리지 상에서의 단일 노드를 갖도록 구성될 수 있다. 노드(105)가 제1 매체에 있고 모든 자식 노드가 제2 매체에 있도록, KVDB(100)가 마찬가지로 기본 레벨에서 구성될 수 있다. 하나의 예를 들면, KVDB(100)는 여러 제2 매체 자식 노드, 가령, 노드(110) 및 노드(130)를 포함한다. 이 예에서, KVDB(100)는 기본 레벨의 서브 레벨들 간 제3 결정적 매핑을 포함 할 수 있으며, 따라서 기본 레벨은 계층적으로 세분화된다. 제3 결정적 매핑은 TID와 키의 조합을 사용하여 주어진 엔트리가 매핑되는 서브-레벨 자식을 결정할 수 있으며, 따라서 제3 결정적 매핑은 기본 레벨 내 부모 노드와 자식 노드 간 매핑과 관련된다. 그러나 검색 또는 스토리지 관리 관점에서 엔트리를 베이스 레벨의 자식 서브-레벨로 고르게 확산시키는 것이 바람직할 수 있다. 따라서, 하나의 예를 들면, 제3 결정적 매핑은 엔트리의 TID를 무시할 수 있다(예를 들어, 사용하지 않을 수 있다).
결정적 매핑은 소스 물질, 가령, TID, 키, 또는 둘 모두의 해시의 일부분을 기초로 할 수 있다. 예를 들어, 결정적 매핑은 키의 일부의 해시의 일부를 사용할 수 있다. 따라서, 서브-키는 매핑 세트에 도달하기 위해 해싱될 수 있다. 이 세트의 일부는 KVDB(100)의 임의의 주어진 레벨에 대해 사용될 수 있다. 하나의 예에서, 키의 일부가 전체 키이다.
하나의 예를 들면, 해시는 해시의 일부를 포함하는 복수의 겹치지 않는 부분을 포함한다. 하나의 예를 들면, 복수의 겹치지 않는 부분들 각각은 KVDB(100)의 레벨에 대응한다. 하나의 예를 들면, 해시의 부분은 노드의 레벨에 의해 복수의 겹치지 않는 부분들로부터 결정된다. 예를 들어, 노드의에 대한 자식 노드의 최대 수는 해시의 부분의 크기에 의해 정의된다. 하나의 예를 들면, 해시 부분의 크기는 비트 수이다. 이러한 예는 8 비트를 도출하는 키의 해시를 사용하여 설명될 수 있다. 이들 8 비트는 첫 2 비트, 비트 3 내지 6(총 4 비트), 및 비트 7 및 8의 3개의 세트로 분할될 수 있다. 자식 노드는 비트 세트에 기초하여 인덱스될 수 있어서, 제1 레벨(예를 들어, L1)의 자식 노드는 2 비트 이름을 가지며, 제2 레벨(예를 들어, L2)의 자식 노드는 4-비트 이름을 가지며, 제3 레벨(가령, L3) 상의 자식 노드는 2 비트 이름을 가진다. 확장된 설명이 도 11 및 12와 관련하여 이하에서 제공된다.
KVS 트리에서와 같이, KVDB(100)의 kvset은 KVDB(100)의 노드에서 구성된 키 및 값 저장소이다. 앞서 언급했듯이, KVDB(100)은 이종 kvset을 KVS 트리의 동종 kvset에 추가한다. kvset의 불변성은 kvset가 노드에 배치되면 변경되지 않음을 의미하다. 그러나, kvset은 삭제될 수 있고, 그 내용의 일부 또는 전부가 새로운 kvset 등에 추가될 수 있다. 예를 들어, kvset의 불변성은 kvset 내에 포함된 임의의 제어 또는 메타-데이터로 확장된다. 일반적으로 이는 메타-데이터가 적용되는 내용이 변경되지 않고, 따라서 종종 메타-데이터가 그 시점에서 정적일 것이기 때문에 가능하다.
또한 KVDB(100)는 전체 키들 사이에서 고유성을 요구하지 않지만, 주어진 kvset는 키 중 단 하나만 가진다. 즉, 주어진 kvset의 모든 키는 kvset의 나머지 키와 다르다. 이 마지막 설명은 특정 kvset에 적용되며, 따라서 예를 들어, kvset이 버저닝될 때는 적용되지 않을 수 있다. Kvset 버저닝은 데이터 스냅샷을 만들기 위해 유용할 수 있다. 버저닝된 kvset의 경우 kvset의 키의 고유성이 kvset 식별자(ID)와 버전의 조합에 의해 결정된다. 그러나, 두 개의 상이한 kvset(예를 들어, kvset(115) 및 kvset(120))는 각각 동일한 키를 포함할 수 있다. 이종 kvset은 해당 키가 속한 KVS 트리와 관련하여 키의 고유성을 정의한다. 따라서, 이종 kvset(110)는 KVS 트리 T1 및 T2 둘 모두에 대한 키 "A"를 적절하게 포함할 수 있지만, 단일 KVS 트리에 대해 두 개의 키 "A"를 적절하게 포함하지 않을 수 있다. 따라서, 주어진 키의 고유성은 이종 kvset에서 TID와 키의 조합에 의해 결정된다.
KVDB(100)에 포함 된 KVS 트리는 정적이 아니고, 오히려 동적이다. 즉, KVDB가 동작한 후 KVS 트리 T1이 KVDB(100)에 추가되고 차후에 삭제(예를 들어, 제거)될 수 있다. 이 기능은 TID가 엔트리에 제1 결정적 매핑의 구성요소로서 첨부되는 덕분이다. 따라서 일반적으로 유지관리 동작 또는 메트릭이 KVDB가 특정 KVS 트리의 포함을 알게 하는 것에 좌우되지 않고, 오히려, 특정 KVS 트리와 이종 kvset 내 이의 엔트리를 연결하고, 어느 다음 레벨 노드가 KVDB(100)에 포함된 주어진 KVS 트리에 속하는지를 선택하기 위한 공통 메커니즘을 아는 것에 좌우된다.
KVS 트리는 KVDB로부터 삭제될 수 있다. 예를 들어, 이종 kvset을 비우기 위해, KVS 트리에 대한 "모두 삭제" (또는 와일드 카드) 툼스톤이 인제스트(ingest)될 수 있다 - 본 명세서에서 사용될 때, 툼스톤(tombstone)은 키에 대응하는 값이 삭제되었음을 나타내는 데이터 마커이다 - . 이 툼스톤은 주어진 KVS 트리에 대한 어느 엔트리와도 매칭된다. 하나의 예를 들면, 메타 데이터가 베이스 레벨에서 연관되어, 주어진 KVS 트리에 대한 모든 엔트리(가령, 키-값 쌍)가 낡은 것(obsolete)으로 정의할 수 있다. 이러한 조치는 KVS 트리로부터 엔트리에 대한 임의의 쿼리가 실패할 것이기 때문에 KVDB(100)로부터 KVS 트리를 효과적으로 제거할 것이다. 그러나 KVS 트리의 다음 레벨을 전지(pruning)(가령, 다음 레벨에 대한 참조 제거)하는 두 번째 동작이 데이터 교정 또는 그 밖의 다른 가비지 수집 활동을 가속시킬 수 있다. 예를 들어, 전지는 KVS 트리의 다음 레벨의 모든 노드를 삭제하는 것을 포함한다. 예를 들어, 노드를 삭제하는 것은 노드 내에 포함된 모든 kvset을 삭제하는 것을 포함한다. 따라서, KVDB(100)가 공통 루트 구조를 공유하는 서로소 KVS 트리들의 포레스트로서 구성되기 때문에, KVDB(100)에 KVS 트리를 추가 - 간단히, TID를 갖는 엔트리를 인제스트 - 하고, KVS 트리를 삭제하는 것이 비교적 간단하다.
예를 들어, kvset는 kvset의 키-값 쌍의 키 엔트리를 저장하기 위해 키-트리를 포함한다. 이진 검색 트리, B-트리 등과 같은 키 트리(트리가 아닐 수도 있음)에서 고유 키를 효율적으로 저장하고 검색하기 위해 다양한 데이터 구조가 사용될 수 있다. 예를 들어, 키가 키-트리의 리프 노드(leaf node)에 저장된다. 예를 들어, 키-트리의 임의의 서브트리 내 최대 키, 가령, 키의 자연스러운 정렬 순서에 의해 결정된 가장 큰 값을 갖는 키가 최우측 자식의 최우측 엔트리에 있다. 예를 들어, 키-트리의 제1 노드의 최우측 에지가 키-트리의 서브-노드에 링크된다. 예를 들어, 키-트리의 서브-노드에 기반을 둔 서브트리의 모든 키가 키 트리의 제1 노드의 모든 키보다 크다.
하나의 예를 들면, kvset의 키 엔트리는 주 키-블록(primary key-block) 및 0개 또는 하나 이상의 확장 키-블록을 포함하는 키-블록의 세트에 저장된다. 하나의 예를 들면, 키-블록 세트의 구성원은 저장 매체, 가령, SSD, 하드 디스크 드라이브 등을 위한 매체 블록에 대응한다. 예를 들면, 각각의 키-블록이 키-블록으로서 자신을 식별하기 위한 헤더를 포함한다. 예를 들면, 주 키 블록은 kvset의 하나 이상의 확장 키-블록에 대한 매체 블록 식별자의 리스트를 포함한다.
하나의 예를 들면, 주 키-블록은 kvset의 키-트리에 대한 헤더를 포함한다. 헤더는 키, 또는 일반적으로 kvset과의 상호대화를 더 쉽게 만들기 위한 다수의 값을 포함할 수 있다. 예를 들어, 주 키-블록, 또는 헤더는 kvset의 키-트리에서 가장 낮은 키의 사본을 포함한다. 여기서, 가장 낮은 키는 트리의 지정된 트리의 정렬 순서(예를 들어, 트리(100)에서 키의 총 순서)에 의해 결정된다. 하나의 예를 들면, 주 키-블록은 동종 kvset에 대한 TID를 포함한다. 하나의 예를 들면, 주 키-블록은 이종 kvset 내 엔트리에 대한 TID 세트를 포함한다. 하나의 예를 들면, 주 키-블록은 이종 kvset 내 엔트리의 TID에 대한 블룸 필터(bloom filter)를 포함한다. 하나의 예를 들면, 주 키-블록은 이종 kvset 내 (TID, 키) 엔트리에 대한 블룸 필터를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 키-트리 내 가장 높은(예를 들어, 최대) 키의 사본을 포함하며, 가장 높은 키는 트리의 지정된 정렬 순서에 의해 결정된다. 하나의 예를 들면, 주 키-블록은 kvset의 키-트리에 대한 매체 블록 식별자의 리스트를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 블룸 필터에 대한 블룸 필터 헤더를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 블룸 필터에 대한 매체 블록 식별자의 리스트를 포함한다.
하나의 예를 들면, kvset의 값은 값-블록 세트에 저장된다. 여기서, 값-블록의 세트의 구성원은 저장 매체에 대한 매체 블록에 대응한다. 하나의 예를 들면, 각각의 값-블록은 자신을 값-블록으로 식별하기 위한 헤더를 포함한다. 하나의 예를 들면, 값 블록은 이들 값을 분리하지 않고, 하나 이상의 값에 대한 저장 섹션을 포함한다. 따라서, 제1 값의 비트는 이들 간 가드(guard), 컨테이너, 또는 그 밖의 다른 구분자 없이, 저장 매체 상의 제2 값의 비트로 이어진다. 하나의 예를 들면, 주 키-블록은 값 블록 세트 내 값-블록에 대한 매체 블록 식별자의 리스트를 포함한다. 따라서, 주 키-블록은 값-블록에 대한 저장 참조를 관리한다.
예를 들어, 주 키-블록은 kvset에 대한 메트릭의 세트를 포함한다. 이종 kvset에서 키의 고유성이 해당 키의 엔트리에 대한 TID를 포함한다는 점을 제외하고 엔트리의 TID가 고려되지 않는다는 점에서, 이종 및 동종 kvset에 대해 메트릭이 유사하게 작동한다. 그렇지 않다면, 모든 키-값 쌍 또는 툼스톤이 이들이 속한 KVS 트리에 무관하게 고려된다. 일반적으로, 툼스톤은 키 엔트리 내에 상주할 것이며 어떠한 값-블록 공간도 이 키-값 쌍에 대해 소비되지 않을 것이다. 툼스톤의 목적은 값을 트리에서 제거하는 비싼 작업을 피하면서 값의 삭제를 표시하는 것이다. 따라서, 시간 순서화된 검색을 이용해 툼스톤에 직면될 때, 키-값 상의 만료된 버전이 트리 내 오래된 위치에 상주하는 경우라도 대응하는 값이 삭제됨이 자명하다. 하나의 예를 들면, 메트릭의 세트는 kvset에 저장된 키의 총 수의 키를 포함한다. 예를 들어, 메트릭의 세트는 kvset에 저장된 툼스톤 값을 갖는 키의 수를 포함한다.
하나의 예를 들면, 주 키-블록에 저장된 메트릭의 세트는 kvset에 저장된 키에 대한 모든 키 길이의 합을 포함한다. 예를 들어, 메트릭의 세트는 kvset에 저장된 키에 대한 모든 값 길이의 합을 포함한다. 이들 마지막 두 메트릭은 kvset에 의해 소비되는 대략적인(또는 정확한) 저장 양을 제공하다. 하나의 예를 들면, 메트릭의 세트는 kvset의 값-블록 내 비-참조 데이터(unreferenced data)(예를 들어, 비-참조 값)의 양을 포함한다. 이 마지막 메트릭은 유지관리 동작에서 회수될 수 있는 공간의 추정치를 제공하다. 키-블록 및 값-블록의 추가 세부사항은 도 4과 관련하여 이하에서 논의된다.
KVDB는 그 밖의 다른 조합된 트리 구조, 가령, HBase 또는 RocksDB에 비해 이점을 제공한다. 예를 들어, 다중-트리의 각각의 트리는 이들 데이터베이스에서 열 패밀리(column family)로 간주될 수 있다. KVDB는 다중-트리 루트 구조를 결합함으로써 둘 이상의 KVS 트리에서 키-값 쌍을 저장 또는 삭제하는 트랜잭션이, 동일한 kvset(또는 원자적으로-인제스트되는 kvset의 모음) 내 주어진 트랜잭션과 연관된 모든 키-값 쌍 또는 툼스톤을 인제스트함으로써, 로그 선행 기입(write-ahead log)의 오버헤드 - 추가 처리, I/O 또는 저장 용량 소비를 포함할 수 있음 - 없이 원자적일 수 있도록 한다. 인제스트된 kvset이 KVDB 내 임의의 또는 모든 KVS 트리와 연관된 키-값 쌍 또는 툼스톤을 포함할 수 있기 때문에, 추가 KVDB가 kvset 인제스트 크기, 그리고 따라서 I/O 효율을 증가시킬 수 있다. 또한, 메모리-내 기본 레벨 내 kvset가 KVDB 내 임의의 또는 모든 KVS 트리와 연관된 키-값 쌍 또는 툼스톤을 포함할 수 있기에 KVDB 내 각각의 KVS 트리에 대한 개별 kvset 버퍼가 메모리 내베이스의 kvset 때문에 유지될 필요가 없기 때문에, KVDB는 kvset 버퍼링에 대한 메모리의 전체 양(가령, 바이트-어드레싱 가능한 노드 레벨에서)을 감소시키는 것을 가능하게 한다.
앞서 언급한 바와 같이, KVDB(100)는 제1 컴퓨터 판독형 매체에 기본 레벨 노드(105)를 포함하고 제2 컴퓨터 판독형 매체에 제2 기본 레벨 노드(110)를 포함할 수 있다. 하나의 예를 들면, 제2 기본 레벨 노드(110)는 제1 기본 레벨 노드(105)의 유일한 자식이다. 하나의 예를 들면, 제1 컴퓨터 판독 가능 매체는 바이트 어드레싱 가능하고 제2 컴퓨터 판독 가능 매체는 블록 어드레싱 가능하다. 상이한 매체 상에서의 제1 기본 레벨 노드(105) 및 제2 기본 레벨 노드(110)의 분할이 많은 이점을 제공한다. 예를 들어, 바이트-어드레싱 가능 메모리에서 kvset을 수정하는 유연성은 블록 어드레싱 가능한 스토리지 상의 불변 kvset의 성능 특성에 영향을 미치지 않는다. 따라서, 데이터는 노드(105)에서 빠르고 효율적인 방식으로 인제스트될 수 있는 반면, KVDB(100)는 블록 스토리지 상의 불변 kvset의 쓰기 성능 특성을 유지한다. 앞서 언급한 바와 같이, 하나의 예를 들면, 제1 기본 레벨 노드(105)는 제2 컴퓨터 판독형 매체 상에 몇 개의 자식 노드(예를 들어, 노드(110) 및 노드(130))를 가질 수 있다. 기본 레벨 노드가 KVDB 내 여러 KVS 트리의 공통 루트 구조를 형성하기 때문에, 기본 레벨 노드를 증가시키는 것이 데이터 인제스트 또는 불러오기 효율성과 관련하여 이점을 가질 수 있다.
상기 논의는 KVDB(100)의 다양한 조직 속성을 설명한다. KVDB(100)와 상호대화하는 동작, 가령, 트리 유지관리(예를 들어, 최적화, 가비지 수집 등), 검색 및 불러오기가 도 5-20과 관련하여 이하에서 설명된다. 이들 주제로 진행하기 전에, 도 2 및 도 3이 KVDB(100)의 구조를 활용하여 멀티-스트림 저장 디바이스의 효과적인 사용을 구현하는 기법을 도시한다.
플래시 메모리 또는 SSD를 포함하는 저장 디바이스는 유사한 수명을 갖는 데이터가 플래시 소거 블록으로 그룹화되는 경우 더 효율적으로 동작하고 더 큰 내구성을 가질 수 있다(가령, "마모(wear out)"되지 않을 것이다). 다른 비휘발성 매체를 포함하는 저장 디바이스는 또한 SMR(shingled magnetic recording) 하드 디스크 드라이브(HDD)와 같은 유사한 수명을 갖는 데이터를 그룹화함으로써 이익을 얻을 수 있다. 이와 관련하여 데이터는 동시에 또는 비교적 짧은 시간 간격 내에 삭제되는 경우 유사한 수명을 가진다. 일부 저장 디바이스의 경우, 저장된 데이터는 원본 데이터를 삭제하고 새로운(가령, 변경된) 데이터를 씀으로써 수정된다. 저장 디바이스 상에서 데이터를 삭제하기 위한 방법은 저장 디바이스 상에서 데이터를 명시적으로 할당해제(deallocating), 논리적으로 덮어 쓰기, 또는 물리적으로 덮어 쓰기하는 것을 포함 할 수 있다.
저장 디바이스가 그 안에 저장된 다양한 데이터의 수명을 일반적으로 인식하지 않을 수 있기 때문에, 저장 디바이스는 데이터가 연관된 논리적 수명 그룹을 식별하기 위해 데이터 액세스 커맨드(예를 들어, 읽기 또는 쓰기)에 대한 인터페이스를 제공할 수 있다. 예를 들어, 산업 표준 SCSI 및 제안된 NVMe 저장 디바이스 인터페이스는 저장 디바이스에 써질 데이터와 상기 데이터가 대응하는 스트림이라 불리는 수명 그룹에 대한 숫자 스트림 식별자(스트림 ID)를 포함하는 쓰기 커맨드를 특정한다. 복수의 스트림을 지원하는 저장 디바이스는 멀티-스트림 저장 디바이스이다.
온도는 데이터를 분류하기 위한 안정성 값이며, 이로써 이 값은 주어진 시간 간격 동안 데이터가 삭제될 상대 확률에 대응한다. 예를 들어, HOT 데이터는 1분 이내에 삭제(또는 변경) 될 것으로 예상될 수 있고, 반면 COLD 데이터는 1시간 이상 지속될 것으로 예상될 수 있다. 하나의 예를 들면, 한정된 안정성 값 세트가 이러한 분류를 특정하는 데 사용될 수 있다. 예를 들어, 안정성 값의 세트는 {HOT, WARM, COLD}일 수 있으며, 여기서, 주어진 시간 간격 내에서, HOT으로 분류된 데이터는, COLD로 분류된 데이터보다 삭제될 확률이 더 높은 WARM으로 분류된 데이터보다 삭제될 확률이 더 높다.
도 2 및 3은 주어진 안정성 값 및 KVDB 내의 하나 이상의 KVDB 또는 KVS 트리에 대한 하나 이상의 데이터 속성에 기초하여 상이한 스트림 ID를 상이한 쓰기에 할당하는 것을 제시한다. 따라서, 앞의 예를 계속들면, 주어진 저장 디바이스에 대해, 제1 세트의 스트림 식별자는 HOT으로 분류된 데이터에 대한 쓰기 커맨드와 함께 사용될 수 있고, 제2 세트의 스트림 식별자는 WARM으로 분류된 데이터에 대한 쓰기 커맨드와 함께 사용될 수 있으며, 제3 세트의 스트림 식별자는 COLD로 분류된 데이터에 대한 쓰기 커맨드와 함께 사용될 수 있으며, 이때 스트림 식별자는 이들 세 세트 중 최대한 하나에 속한다.
이하의 용어는 도 2 내지 3의 멀티-스트림 저장 디바이스 시스템 및 기법을 설명하는 데 편의를 위해 제공된다:
DID는 저장 디바이스에 대한 고유한 디바이스 식별자이다.
SID는 특정 저장 디바이스 상의 스트림에 대한 스트림 식별자이다.
TEMPSET은 온도 값의 유한 세트이다.
TEMP는 TEMPSET의 원소이다.
FID는 KVS 트리의 모음에 대한 고유한 포레스트 식별자이다. 예를 들면, FID는 KVDB를 나타낸다.
TID는 KVS 트리에 대한 고유 트리 식별자이다.
LNUM은 주어진 KVS 트리의 레벨 번호이며, 편의상, KVS 트리의 블록-어드레싱 가능 루트 노드가 트리-레벨 0으로 간주되고, 루트 노드의 자식 노드(존재하는 경우)가 트리-레벨 1인 것으로 간주되며, 그러한 식으로 계속된다. 하나의 예를 들면, LNUM은 KVDB에 대한 것이며 그 안에 포함된 어떠한 KVS 트리에 대한 것도 아니다. 따라서, 블록 어드레싱 가능한 매체의 제1 기본 레벨 노드는 기본 레벨이든 다음 레벨이든 무관하게 더 깊은 레벨을 갖는 레벨 0이고, KVDB 심도가 증가함에 따라 LNUM을 증분시킨다.
NNUM은 주어진 KVDB 또는 KVS 트리에서 주어진 레벨의 주어진 노드에 대한 숫자이며, 편의상, NNUM은 0에서 (NodeCount(LNUM)-1) 범위의 숫자일 수 있고, 여기서 NodeCount(LNUM)은 트리-레벨 LNUM의 총 숫자여서, KVDB 또는 KVS 트리의 모든 노드가 튜플(LNUM, NNUM)로 고유하게 식별될 수 있도록 한다. 도 1에 도시된 바와 같이, 노드(110)에서 시작하여, 위에서 아래로, 좌에서 우로 진행하는 노드 튜플의 완전한 리스트가 다음과 같을 것이다:
L0(노드 110에서 시작하는 기본 레벨): (0,0), (0, 1)
L1: (1,0), (1,1), (1,2)
L2: (2,0), (2,1), (2,2), (2,3)
L3: (3,0), (3,1), (3,2), (3,3)
KVSETID는 고유한 kvset 식별자이다.
WTYPE은 아래에서 설명될 바와 같이, KBLOCK 또는 VBLOCK 값이다.
WLAST는 아래에서 설명될 바와 같이, 부울 값(TRUE 또는 FALSE)이다.
도 2는 하나의 실시예에 따르는, 멀티-스트림 저장 디바이스(가령, 디바이스(260 또는 265))로의 쓰기(write)의 하나의 예를 도시하는 블록도이다.도 2는 복수의 KVDB, KVDB(205) 및 KVDB(210)를 도시한다. 도시된 바와 같이, 각각의 KVDB는 각자 쓰기 동작(215 및 220)을 수행하고 있다. 이들 쓰기 동작은 저장 서브시스템(225)에 의해 핸들링된다. 저장 서브시스템은 가령, 디바이스(260)에 대한, 디바이스 드라이버, 복수의 디바이스(가령, 디바이스(260) 및 디바이스(265))를 관리하기 위한 저장 제어기, 가령, 운영 체제, 네트워크 연결된 저장 디바이스 등, 또는 이들의 임의의 조합에서 발견되는 것들을 포함할 수 있다. 마침내, 저장 서브시스템(225)은 동작(250 및 255)에서 각각 저장 디바이스(260 및 265)에 대한 쓰기를 완료할 것이다. 스트림-매핑 회로(230)는 디바이스 쓰기(250)에서 사용될 주어진 쓰기(215)에 스트림 ID를 제공한다.
KVDB(205)에서, kvset의 불변성은 전체 kvset가 한번에 써지거나 삭제되게 한다. 따라서, kvset을 포함하는 데이터는 유사한 수명을 가진다. 새로운 kvset을 포함하는 데이터가 소거 코딩(erasure coding) 또는 RAID와 같은 기법을 사용하여 단일 저장 디바이스 또는 여러 저장 디바이스(예를 들어, 디바이스(260) 및 디바이스(265))에 써질 수 있다. 또한, kvset의 크기가 임의의 주어진 디바이스 쓰기 동작(250)보다 클 수 있기 때문에, kvset를 쓰는 것은 다수의 쓰기 커맨드를 주어진 저장 디바이스(260)로 보내는 것을 포함할 수 있다. 스트림-매핑 회로(230)의 동작을 촉진시키기 위해, 다음 중 하나 이상이 이러한 각각의 쓰기 커맨드(250)에 대한 스트림 ID를 선택하는 데 사용될 수 있다:
A)
써질 kvset의 KVSETID
B)
저장 디바이스에 대한 DID
C)
KVS 트리가 속한 포레스트 또는 KVDB에 대한 FID
D)
KVS 트리에 대한 TID
E)
kvset을 포함하는 KVS 트리 내 노드의 LNUM
F)
kvset을 포함하는 KVS 트리 내 노드의 NNUM
G)
WTYPE은 쓰기 커맨드가 DID 상의 KVSETID에 대한 키-블록에 대한 경우 KBLOCK이거나 쓰기 커맨드가 DID 상의 KVSETID에 대한 값-블록에 대한 경우 VBLOCK이다
H)
WLAST는 쓰기 커맨드가 DID 상의 KVSETID에 대한 마지막인 경우 참(TRUE)이고 그렇지 않으면 거짓(FALSE)이다
예를 들어, 이러한 각각의 쓰기 커맨드에 대해, 튜플(DID, FID, TID, LNUM, NNUM, KVSETID, WTYPE, WLAST) - 스트림-매핑 튜플이라고 함 - 은 스트림-매핑 회로(230)에 전송될 수 있다. 그 후 스트림-매핑 회로(230)는 저장 서브시스템(225)에 대한 스트림 ID로 응답하여 쓰기 커맨드(250)과 함께 사용될 수 있다. KVDB 기본 레벨의 이종 kvset과 KVDB 다음 레벨의 동종 kvset 간 차이를 해결하기 위해 튜플 값이 kvset의 유형을 기초로 조절된다. 예를 들어, 이종 kvset의 혼합된 KVS 트리 속성이 튜플에서 TID의 의미를 감소시키거나 제거한다. 이 문제를 해결하기 위해 이종 kvset 내 TID의 값이 KVS 트리 식별자와 상이한 값으로 설정될 수 있다. 하나의 예를 들면, TID는 포레스트 식별자(FID)로 설정된다(예를 들어, TID는 FID와 동일한 값을 할당 받는다). KVS 트리 식별자를 사용하는 예에서, TID는 KVDB 내 하나의 KVS 트리의 TID로 설정된다. 이 예에서, 이종 kvset을 나타내도록 선택된 KVS 트리는 항상 동일한 KVS 트리이며,이 KVS 트리는 이종 kvset 내 모든 KVS 트리를 나타낸다. 예를 들어, TID는 상수 값, 가령, 0으로 설정된다. 예를 들어, 이종 kvset 쓰기에서 TID에 대해 사용된 값은 무엇이든, KVDB의 이종 kvset에 대해 일관되게 사용(가령, 항상 사용)된다.
스트림-매핑 회로(230)는 전자 하드웨어로 구현된 제어기(235), 액세스 가능한 스트림 ID(A-SID) 테이블(240) 및 선택된 스트림 ID(S-SID) 테이블(245)을 포함할 수 있다. 제어기(235)는 입력으로서 스트림- 튜플을 수락하고 스트림 ID로 응답하도록 구성된다. 하나의 예를 들면, 제어기(235)는 복수의 KVDB(205 및 210)를 저장하는 복수의 저장 디바이스(260 및 265)로 구성된다. 제어기(235)는 액세스 가능한 디바이스에 대한 구성을 (예를 들어, 구성, 질의 등에 의해) 획득하도록 구성된다. 제어기(235)는 또한 안정성 값의 세트 TEMPSET를 구성하고, TEMPSET의 각각의 값 TEMP에 대해 주어진 저장 디바이스 상에서 스트림 수의 분수, 수, 또는 그 밖의 다른 결정자를 구성하여, 이들 값으로 데이터를 분류하는 데 사용되게 할 수 있다.
하나의 예를 들면, 제어기(235)는 온도 할당 기법을 획득(예를 들어, 구성, 메시지 등을 통해 수신, 구성 디바이스, 펌웨어 등으로부터 검색)하도록 구성된다. 이 예에서 온도 할당 기법은 쓰기 요청(215)에 안정성 값을 할당하기 위해 사용될 것이다. 하나의 예를 들면, 스트림-매핑 튜플은 DID, FID, TID, LNUM, NNUM, KVSETID, WTYPE 또는 WLAST 중 하나 이상을 포함할 수 있고, TEMPSET에서 안정성 값 TEMP을 선택하기 위해 제어기(235)에 의해 실행될 온도 할당 기법으로의 입력으로 사용될 수 있다. 하나의 예를 들면, KVS 트리 스코프(tree scope)는 써지는 KVS 트리 구성요소(예를 들어, kvset)에 특정된 쓰기에 대한 파라미터의 모음이다. 예를 들어, KVS 트리 스코프는 FID, TID, LNUM, NNUM 또는 KVSETID 중 하나 이상을 포한다. 따라서, 이 예에서, 스트림-매핑 튜플은 KVS 트리 스코프의 구성요소뿐만 아니라 DID, WLAST 또는 WTYPE과 같은 디바이스 특정 또는 쓰기 특정 구성요소를 포함할 수 있다. 예를 들어, 안정성 또는 온도, 스코프 튜플 TSCOPE는 스트림-매핑 튜플로부터 파생된다. 다음은 TSCOPE를 만드는 데 사용될 수 있는 구성 요소 KVS 트리 스코프의 예이다:
A)
(FID, TID, LNUM)으로서 계산된 TSCOPE
B)
(LNUM)으로서 계산된 TSCOPE
C)
(TID)로서 계산된 TSCOPE
D)
(TID, LNUM)으로서 계산된 TSCOPE, 또는
E)
(TID, LNUM, NNUM)로서 계산된 TSCOPE.
하나의 예를 들면, 제어기(235)는 정적 온도 할당 기법을 구현할 수 있다. 정적 온도 할당 기법은 예를 들어, 구성 파일, 데이터베이스, KVDB 또는 KVS 트리 메타 데이터, 또는 그 밖의 다른 데이터베이스, 가령, KVDB FID 또는 KVS 트리 TID에 저장된 메타 데이터로부터 선택된 TEMP를 읽을 수 있다. 이 예시에서, 이들 데이터 소스는 TSCOPE로부터 안정성 값으로의 매핑을 포함한다. 하나의 예를 들면, 매핑은 (예를 들어, 제어기(235)의 활성화 시 또는 추후 동작 동안 동적으로) 캐싱되어 쓰기 요청이 도착함에 따라 안정성 값의 할당을 가속화할 수 있다.
하나의 예를 들면, 제어기(235)는 동적 온도 할당 기법을 구현할 수 있다. 동적 온도 할당 기법은 kvset가 TSCOPE에 써지는 주파수에 기초하여 선택된 TEMP를 계산할 수 있다. 예를 들어, 제어기(235)가 주어진 TSCOPE에 대한 온도 할당 기법을 실행하는 주파수가 측정되고 TEMPSET 내 TEMPS를 중심으로 클러스터링될 수 있다. 따라서, 이러한 계산은 예를 들어, TEMP의 값이 kvset가 TSCOPE에 써지는 주파수를 포함하는 주파수 범위에 의해 결정되도록 주파수 범위의 세트를 정의하고 각 주파수 범위로부터 안정성 값으로의 매핑을 정의할 수 있다.
제어기(235)는 스트림 할당 기법을 획득(예를 들어, 구성, 메시지 등을 통해 수신, 구성 디바이스, 펌웨어 등으로부터 검색)하도록 구성된다. 스트림 할당 기법은 스트림 ID를 생성하기 위해 쓰기(215)의 KVDB(205)(또는 그에 포함된 KVS 트리) 측면뿐만 아니라 (예를 들어, 온도 할당으로부터의) 안정성 값을 소비할 것이다. 하나의 예를 들면, 제어기(235)는 스트림 할당 기법에서 스트림-매핑 튜플(예를 들어, KVS 트리 스코프 포함)을 사용하여 스트림 ID를 선택할 수 있다. 하나의 예를 들면, 안정성 값과 함께 DID, FID, TID, LNUM, NNUM, KVSETID, WTYPE 또는 WLAST 중 하나 이상이 제어기(235)에 의해 실행된 스트림 할당 기법에서 스트림 ID를 선택하는 데 사용될 수 있다. 예를 들어, 스트림-스코프 튜플 SSCOPE이 스트림-매핑 튜플로부터 파생된다. 다음은 SSCOPE를 만드는 데 사용될 수 있는 구성 요소 KVS 트리 스코프 구성요소의 예시이다:
A)
(FID, TID, LNUM, NNUM)으로서 계산된 SSCOPE
B)
(KVSETID)로서 계산된 SSCOPE
C)
(TID)로서 계산된 SSCOPE
D)
(TID, LNUM)으로서 계산된 SSCOPE
E)
(TID, LNUM, NNUM)으로서 계산된 SSCOPE
F)
(LNUM)으로서 계산된 SSCOPE
제어기(235)는 입력을 수락하기 전에 A-SID 테이블(240) 및 S-SID 테이블(245)을 초기화하도록 구성될 수 있다. A-SID 테이블(240)은 튜플 (DID, TEMP, SID) 에 대한 엔트리를 저장할 수 있고, DID 및 TEMP에 대한 특정된 값을 이용해 이러한 엔트리를 불러올 수 있는 데이터 구조(테이블, 딕셔너리 등)이다. 표기법 A-SID(DID, TEMP)는 DID 및 TEMP에 대해 특정된 값이 존재하는 경우 이들 값을 갖는, A-SID 테이블(240)의 모든 엔트리를 지칭한다. 하나의 예를 들면, A-SID 테이블(240)은 각각의 구성된 저장 디바이스(260 및 265) 및 TEMPSET 내 온도 값에 대해 초기화될 수 있다. A-SID 테이블(240) 초기화는 다음과 같이 진행될 수 있다: 각각의 구성된 저장 디바이스(DID)에 대해, 제어기(235)는 다음과 같이 구성될 수 있다:
A)
SCOUNT라고 지칭되는, DID 상에서 가용 스트림 수를 획득,
B)
DID 상의 각각의 SCOUNT 스트림에 대해 고유한 SID를 획득,
C)
TEMPSET의 각각의 값 TEMP에 대해:
a)
TCOUNT라고 지칭되는 TEMP에 대해 구성된 결정자에 따라 TEMP에 의해 분류된 데이터에 사용될 SCOUNT 스트림 수를 계산,
b)
A-SID 테이블(240)에 아직 입력되지 않은 DID에 대한 TCOUNT SID를 선택하고, DID에 대해 선택된 각각의 TCOUNT SID에 대해 (DID, TEMP, SID)에 대해 A-SID 테이블(240) 내 하나의 엔트리(가령, 행)을 생성.
따라서, 초기화되면, A-SID 테이블(240)은 각각의 구성된 저장 디바이스 DID 및 고유한 SID가 할당된 TEMPSET 내 TEMP 값에 대한 엔트리를 포함한다. 구성된 저장 디바이스(260)에 가용 스트림의 수 및 각각에 대한 사용 가능한 SID를 얻는 기술은 저장 디바이스 인터페이스에 따라 다르지만, 이들은 멀티-스트림 저장 디바이스의 인터페이스를 통해 쉽게 액세스될 수 있다.
S-SID 테이블(245)은 이미 사용중인 스트림의 레코드를 유지한다(예를 들어, 이미 주어진 쓰기의 일부이다). S-SID 테이블(245)은 튜플(DID, TEMP, SSCOPE, SID, 타임 스탬프)에 대한 엔트리를 저장할 수 있는 데이터 구조(테이블, 딕셔너리 등)이며 DID, TEMP 및 선택적으로 SSCOPE에 대한 특정된 값으로 이러한 엔트리를 불러오거나 삭제할 수 있다. 표기법 S-SID(DID, TEMP)는 DID 및 TEMP에 대해 특정된 값이 존재하는 경우 이들 값을 갖는 가진 S-SID 테이블(245) 내 모든 엔트리를 지칭한다. A-SID 테이블(240)과 같이, S-SID 테이블(245)은 제어기(235)에 의해 초기화될 수 있다. 하나의 예를 들면, 제어기(235)는 각각의 구성된 저장 디바이스(260 및 265) 및 TEMPSET 내 온도 값에 대해 S-SID 테이블(245)을 초기화하도록 구성된다.
앞서 언급된 바와 같이, S-SID 테이블(245) 내 엔트리는 쓰기 동작을 위해 현재 또는 이미 할당된 스트림을 나타낸다. 따라서, 일반적으로, S-SID 테이블(245)은 개시 후에 비워지고, 스트림 ID가 할당될 때 제어기(235)에 의해 엔트리가 생성된다.
하나의 예를 들면, 제어기(235)는 정적 스트림 할당 기법을 구현할 수 있다. 정적 스트림 할당 기법은 주어진 DID, TEMP 및 SSCOPE에 대해 동일한 스트림 ID를 선택한다. 하나의 예를 들면, 정적 스트림 할당 기법은 S-SID(DID, TEMP)가 SSCOPE에 대한 엔트리를 갖는지 여부를 결정할 수 있다. 적합한 엔트리가 없는 경우, 정적 스트림 할당 기법은 A-SID(DID, TEMP)로부터 스트림 ID SID를 선택하고 (DID, TEMP, SSCOPE, SID, 타임 스탬프)에 대해 S-SID 테이블(245)에 항목을 생성하며, 이때, 타임 스탬프는 선택 후 현재 시간이다. 예를 들어, A-SID(DID, TEMP)로부터의 선택은 랜덤이거나, 라운드-로빈 프로세스의 결과이다. S-SID 테이블(245)로부터의 엔트리가 발견되거나 생성되면, 스트림 ID SID는 저장 서브시스템(225)으로 반환된다. 하나의 예에서, WLAST가 참인 경우, (DID, TEMP, SSCOPE)에 대한 S-SID 테이블(245) 내 엔트리가 삭제된다. 이 마지막 예시는 저장 서브시스템(225)에는 알려지지 않고 트리(205)에는 알려진 kvset 등에 대한 쓰기(215)의 완료를 시그널링하기 위해 WLAST를 갖는 것이 유용하다는 것을 보여준다.
하나의 예를 들면, 제어기(235)는 LRU(least recently used) 스트림 할당 기법을 구현할 수 있다. LRU 스트림 할당 기법은 비교적 짧은 시간 간격 내에서 주어진 DID, TEMP 및 SSCOPE에 대해 동일한 스트림 ID를 선택한다. 하나의 예를 들면, LRU 할당 기법은 S-SID(DID, TEMP)가 SSCOPE에 대한 엔트리를 갖는지 여부를 결정한다. 엔트리가 존재하면, LRU 할당 기법은 이 엔트리 내 스트림 ID를 선택하고 S-SID 테이블(245)에서 이 엔트리 내 타임 스탬프를 현재 시각으로 설정한다.
SSCOPE 엔트리가 S-SID(DID, TEMP)에 없는 경우, LRU 스트림 할당 기법은 엔트리 S-SID(DID, TEMP)의 수가 엔트리 A-SID(DID, TEMP)의 수와 같은지 여부를 결정한다. 이것이 참이면, LRU 할당 기법은 가장 오래된 타임 스탬프를 갖는 S-SID(DID, TEMP) 내 엔트리로부터 스트림 ID SID를 선택한다. 여기서, S-SID 테이블(245) 내 엔트리는 새로운 엔트리(DID, TEMP, SSCOPE, SID, 타임 스탬프)로 대체되며, 이때, 타임 스탬프는 선택 후의 현재 시각이다.
A-SID(DID, TEMP) 엔트리보다 S-SSID(DID, TEMP) 엔트리가 더 적은 경우, 기법은 S-SID(DID, TEMP)에 선택된 스트림 ID를 갖는 엔트리가 없도록 A-SID(DID, TEMP)로부터 스트림 ID SID를 선택하며(DID, TEMP, SSCOPE, SID, 타임스탬프)에 대해 S-SID 테이블(245)에 엔트리를 생성하는데, 이때, 타임 스탬프는 선택 후 현재 시각이다.
S-SID 테이블(245)로부터의 엔트리가 발견되거나 생성되면, 스트림 ID SID는 저장 서브시스템(225)으로 반환된다. 하나의 예에서, WLAST가 참인 경우, (DID, TEMP, SSCOPE)에 대한 S-SID 테이블(245) 내 엔트리가 삭제된다.
동작 중에, 제어기(235)는 쓰기 요청(215)의 일부로서 수신된 주어진 스트림-매핑 튜플에 대한 안정성 값을 할당하도록 구성된다. 안정성 값이 결정되면, 제어기(235)는 SID를 할당하도록 구성된다. 온도 할당 및 스트림 할당 기법은 각각 A-SID 테이블(240) 및 S-SID 테이블(245)을 참조 및 업데이트할 수 있다. 하나의 예를 들면, 제어기(235)는 또한 요청자, 가령, 저장 서브시스템(225)에게 SID를 제공하도록 구성된다.
KVS 트리 스코프를 기초로 하는 스트림 ID를 이용함으로써 유사 데이터가 멀티-스트림 저장 디바이스(260) 상의 소거 블록(270)에 함께 위치될 수 있다. 이는 디바이스 상에서의 가비지 수집을 감소시키고 따라서 디바이스 성능 및 수명을 증가시킬 수 있다. 이 이점은 복수의 KVS 트리로 확장될 수 있다. KVS 트리는 포레스트, 또는 그로브에서 사용될 수 있으며, 이로 인해 여러 KVS 트리가 단일 구조, 가령, 파일 시스템을 구현하는 데 사용된다. 예를 들어, 하나의 KVS 트리는 블록 번호를 키로서 사용하고 블록 내 비트를 값으로서 사용할 수 있는 반면, 두 번째 KVS 트리는 파일 경로를 키로서 사용하고 블록 번호의 리스트를 값으로서 사용할 수 있다. 이 예시에서 경로에 의해 참조되는 주어진 파일에 대한 kvset와 블록 번호를 보유한 kvset가 유사한 수명을 가질 가능성이 높다 따라서 위의 FID 포함. KVDB 내 KVS 트리는 관련되거나 관련되지 않을 수 있다. 따라서, 스트림 할당을 위한 KVS 트리 스코프는 KVDB의 조합된 맥락에서도 적절할 수 있다. 그러나 FID를 KVDB 식별자로서 이용함으로써, 스트림 할당이 KVDB 또는 공통 루트 시스템을 공유하지 않는 KVS 트리 모음에서 유사하게 작동할 수 있다.
앞서 기재된 구조 및 기법은 플래시 저장 디바이스와 같은 저장 디바이스 및 KVDB를 구현하는 시스템에서 많은 이점을 제공한다. 하나의 예를 들면, 하나 이상의 저장 디바이스 상에 저장된 여러 KVDB를 구현하는 컴퓨팅 시스템은 KVDB(또는 그 안에 포함된 KVS 트리)의 지식을 이용하여 멀티-스트림 저장 디바이스에서 스트림을 더 효율적으로 선택할 수 있다. 예를 들어, 시스템은 이들 쓰기 동작에 의해 써지는 kvset 데이터에 할당된 온도 분류에 대해 예약된 임의의 주어진 저장 디바이스 상의 스트림의 수에 기초하여 동시 쓰기 동작(가령, 인제스트 또는 압축)의 수가 제한되도록 구성될 수 있다. 이는, kvset 내에서 kvset이 전체적으로 써지고 삭제되기 때문에 해당 데이터의 기대 수명이 동일하기 때문에 가능하다. 본 명세서에서 언급한 바와 같이, 키와 값은 분리될 수 있다. 따라서, kvset에 대한 키 쓰기는 단일 수명을 가질 것이며, 이는 예를 들어, 이하에서 언급될 바와 같이, 예를 들어, 키 압축이 수행될 때 값 수명보다 짧을 수 있다. 또한 트리-레벨은 데이터 수명의 강력한 지시자인 것으로 나타나며, 오래된 데이터, 및 따라서 더 큰(가령, 더 깊은) 트리-레벨이 더 높은 트리-레벨에서의 더 어린 데이터보다 긴 수명을 가진다.
다음의 시나리오는 쓰기를 제한하기 위한 스트림-매핑 회로(230)의 동작이 다음을 고려하는 것을 더 설명할 수 있다:
A)
HOT으로 분류된 데이터에 대해 사용되는 주어진 저장 디바이스 상의 H 스트림과 COLD로서 분류된 데이터에 대해 사용되는 주어진 저장 디바이스 상의 C 스트림을 갖는, 온도 값 {HOT, COLD}.
B)
(LNUM)으로서 계산된 TSCOPE로 구성된 온도 할당 방법으로서, 이로 인해 임의의 KVDB에서 기본 레벨 0에 써진 데이터에 HOT의 온도 값이 할당되고, 임의의 KVDB에서 L1 이상에 써진 데이터에 온도 값 COLD가 할당된다.
C)
(TID, LNUM)로서 계산된 SSCOPE로 구성된 LRU 스트림 할당 방법으로서, 여기서, TID는 다음 레벨에서의 KVS 트리 식별자이고 앞서 언급된 바와 같이 기본 레벨에서 구성된다(예를 들어, 이종의 kvset).
이 경우, 모든 KVDB에 대한 동시 인제스트 및 압축 동작의 총 수 - 쓰기를 생성하는 동작 - 가 다음의 조건을 따른다: 모든 KVDB에 대한 동시 인제스트 동작이 최대 H이고 - 모든 인제스트 동작에 대한 데이터가 KVDB 내에서 레벨 0에 써지고 따라서 HOT으로 분류될 것이기 때문 - , 동시 압축 동작이 최대 C이다 - 모든 스필 압축 및 그 밖의 다른 대부분의 압축 동작에 대한 데이터가 레벨 1 이상에 써지고 따라서 COLD로 분류될 것이기 때문 - .
그 밖의 다른 이러한 제한이 가능하고 KVDB 및 제어기(235)의 특정 구현 세부 사항에 따라 유리할 수 있다. 예를 들어, 제어기(235)가 앞서와 같이 구성되면, (TID, LNUM)로서 계산된 SSCOPE를 갖는 LRU 스트림 할당이 TID에서 주어진 KVSET에 대해 마지막 쓰기를 수신한 후 불필요한 S-SID 테이블(245) 엔트리를 제거하기 위해 스트림-매핑 튜플 내 WLAST를 이용하지 않아 차선의 SID 선택을 도출할 수 있기 때문에, 인제스트 동작의 수가 H의 분수(가령, 2분의1)이고 압축 동작의 수가 C의 분수(가령, 4분의3)인 것이 바람직할 수 있다.
스트림-매핑 회로(230)의 동작이 KVDB 및 KVS 트리와 관련하여 앞서 기재되지만, 그 밖의 다른 구조, 가령, LSM 트리 구현이 본 명세서에서 제공되는 개념으로부터 동일하게 이익을 얻을 수 있다. 여러 LSM 트리 변형은 키-값 쌍 및 툼스톤의 모음을 저장하며, 이로써, 주어진 모음은 인제스트 동작 또는 가비지 수집 동작(종종, 압축 또는 병합 동작이라고 지칭됨)에 의해 생성될 수 있고, 그 후 다음 인제스트 동작 또는 가비지 수집 동작의 결과로서 차후에 전체적으로 삭제될 수 있다. 따라서 KVS 트리 내 kvset를 포함하는 데이터와 같이, 이러한 모음을 포함하는 데이터는 유사한 수명을 가진다. 따라서, 위의 스트림-매핑 튜플과 유사한 튜플은 대부분의 다른 LSM 트리 변형에 대해 정의될 수 있으며, 여기서, KVSETID는 주어진 LSM 트리 변형에서 인제스트 동작 또는 가비지 수집 동작에 의해 만들어진 키-값 쌍 또는 툼스톤의 모음에 대한 고유의 식별자로 대체될 수 있다. 그 후 스트림-매핑 회로(230)는 이러한 키-값 쌍 및 툼스톤의 모음을 포함하는 데이터를 저장하는 데 사용되는 복수의 쓰기 커맨드에 대한 스트림 식별자를 선택하도록 기재된 바와 같이 사용될 수 있다.
도 3은 하나의 실시예에 따른, 멀티-스트림 저장 디바이스에의 쓰기를 촉진시키는 방법(300)의 예를 도시한다. 방법(300)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다. 방법(300)은 도 2과 관련하여 앞서의 설명을 구현하기 위한 다수의 예시를 제공한다.
동작(305)에서, 예를 들어, 애플리케이션, 운영 체제, 파일 시스템 등으로부터 멀티-스트림 저장 디바이스에 대한 KVS 트리 쓰기 요청의 통지가 수신된다. 예를 들어, 통지는 쓰기 요청 내 데이터에 대응하는 KVS 트리 스코프를 포함한다. 하나의 예를 들어, KVS 트리 스코프는 다음 중 적어도 하나를 포함한다: 데이터의 kvset에 대응하는 kvset ID, 데이터에 대응하는 KVS 트리의 노드에 대응하는 노드 ID, 데이터에 대응하는 트리-레벨에 대응하는 레벨 ID, KVS 트리에 대한 TID, KVS 트리가 속하는 포레스트에 대응하는 FID, 또는 데이터에 대응하는 유형. 예를 들어, 유형은 키-블록 유형 또는 값-블록 유형이다. 위에서 언급한 바와 같이, FID는 kvset이 속하는 KVDB에 대응할 수 있다. 하나의 예를 들면, TID는 이종 kvset에서 상수로 설정된다. 예를 들어, TID는 이종 kvset에서 FID로 설정된다. 예를 들어, 다수의 KVS 트리에 대한 TID는 이종 kvset에 대한 KVDB 내 선택된 하나의 KVS 트리에 대한 TID이다. 여기서 선택된 TID는 KVDB의 수명 동안(또는 적어도 KVDB가 임의의 kvset을 보유하는 동안) 변경되지 않는다.
하나의 예를 들면, 통지는 멀티-스트림 디바이스에 대한 디바이스 ID를 포함한다. 하나의 예를 들면, 통지는 kvset ID에 의해 식별된 kvset를 멀티-스트림 저장 디바이스에 쓰기 위한 쓰기 요청 시퀀스 내 마지막 쓰기 요청에 대응하는 WLAST 플래그를 포함한다.
동작(310)에서, 스트림 식별자(ID)는 KVS 트리 스코프 및 쓰기 요청의 안정성 값에 기초하여 쓰기 요청에 할당된다. 예를 들어, 안정성 값을 할당하는 단계는: 트리-레벨에 대응하는 레벨 ID에 대한 안정성 값 할당의 주파수의 세트를 유지하는 단계 - 주파수의 세트의 각각 구성원은 고유의 레벨 ID에 대응 - , 주파수의 세트로부터 KVS 트리 스코프의 레벨 ID에 대응하는 주파수를 불러오는 단계, 및 주파수에 기초하여 안정성 값을 주파수 범위로 매핑하는 것으로부터 안정성 값을 선택하는 단계를 포함한다.
하나의 예를 들면, KVS 트리 스코프 및 쓰기 요청의 안정성 값에 기초하여 스트림 ID를 쓰기 요청에 할당하는 단계는 KVS 트리 스코프로부터 스트림-스코프 값을 생성하는 단계를 포함한다. 하나의 예에서, 스트림-스코프 값은 데이터에 대한 레벨 ID를 포함한다. 하나의 예에서, 스트림-스코프 값은 데이터에 대한 트리 ID를 포함한다. 하나의 예에서, 스트림-스코프 값은 데이터에 대한 레벨 ID를 포함한다. 하나의 예를 들면, 스트림-스코프 값은 데이터에 대한 노드 ID를 포함한다. 하나의 예를 들면, 스트림-스코프 값은 데이터에 대한 kvset ID를 포함한다.
하나의 예에서, KVS 트리 스코프 및 쓰기 요청의 안정성 값에 기초하여 쓰기 요청에 스트림 ID를 할당하는 단계는 스트림-스코프 값을 사용하여 선택-스트림 데이터 구조에서 룩업을 수행하는 단계를 더 포함한다. 하나의 예를 들면, 선택-스트림 데이터 구조에서 룩업을 수행하는 단계는: 선택-스트림 데이터 구조에서 스트림-스코프 값을 찾지 못하는 단계, 안정성 값을 이용하여 가용 스트림 데이터 구조에 대한 룩업을 수행하는 단계, 스트림 ID를 포함하는 룩업의 결과를 수신하는 단계, 및 스트림 ID, 스트림-스코프 값, 및 엔트리가 추가 될 때의 타임스탬프를 포함하는 엔트리를 선택-스트림 데이터 구조에 추가하는 단계를 포함한다. 하나의 예를 들어, 가용-스트림 데이터 구조의 다수의 엔트리는 안정성 값에 대응하고, 룩업의 결과는 다수의 엔트리로부터의 엔트리의 라운드 로빈 또는 랜덤 선택 중 적어도 하나이다. 하나의 예를 들면, 가용-스트림 데이터 구조는, 멀티-스트림 저장 디바이스로부터 가용 다수의 스트림을 획득하며, 멀티-스트림 저장 디바이스로부터 모든 가용 스트림에 대한 스트림 ID를 획득하고 - 각각의 스트림 ID는 고유함 - , 안정성 값 그룹에 스트림 ID를 추가하며, 각각의 스트림 ID에 대한 가용-스트림 데이터 구조에 레코드를 생성함으로써 - 레코드는 스트림 ID, 멀티-스트림 저장 디바이스에 대한 디바이스 ID, 스트림 ID의 안정성 값 그룹에 대응하는 안정성 값을 포함함 - , 초기화될 수 있다.
하나의 예를 들면, 선택-스트림 데이터 구조에서 룩업을 수행하는 단계는: 선택-스트림 데이터 구조에서 스트림-스코프 값을 찾지 못하는 단계, 선택 스트림 데이터 구조의 내용을 기초로 선택-스트림 데이터 구조 또는 가용-스트림 데이터 구조로부터 스트림 ID를 찾는 단계, 및 스트림 ID, 스트림-스코프 값, 및 엔트리가 추가되는 시점의 타임스탬프를 포함하는 엔트리를 선택-스트림 데이터 구조로 생성하는 단계를 포함한다. 하나의 예를 들면, 선택 스트림 데이터 구조의 내용에 기초하여 선택-스트림 데이터 구조 또는 가용-스트림 데이터 구조로부터 스트림 ID를 찾는 단계는: 선택-스트림 데이터 구조로부터의 제1 엔트리 수를 가용-스트림 데이터 구조로부터의 제2 엔트리 수에 비교하여 제1 엔트리 수와 제2 엔트리 수가 동일함을 결정하는 단계, 안정성 값에 대응하는 엔트리 그룹을 선택-스트림 데이터 구조로부터 찾는 단계, 및 엔트리 그룹에서 가장 오래된 타임 스탬프를 갖는 엔트리의 스트림 ID를 반환하는 단계를 포함한다. 하나의 예를 들면, 선택 스트림 데이터 구조의 내용에 기초하여 선택-스트림 데이터 구조 또는 가용-스트림 데이터 구조로부터 스트림 ID를 찾는 단계는: 선택-스트림 데이터 구조로부터의 제1 엔트리 수를 가용-스트림 데이터 구조로부터의 제2 엔트리 수에 비교하여 제1 엔트리 수와 제2 엔트리 수가 동일하지 않음을 결정하는 단계, 선택-스트림 데이터 구조의 엔트리 내 안정성 값 및 스트림 ID를 이용해 가용-스트림 데이터 구조 상에서 룩업을 수행하는 단계, 선택-스트림 데이터 구조의 엔트리에 있지 않는 스트림 ID를 포함하는 룩업의 결과를 수신하는 단계, 및 스트림 ID, 스트림-스코프 값, 및 엔트리가 추가될 때의 타임스탬프를 포함하는 엔트리를 선택-스트림 데이터 구조에 추가하는 단계를 포함한다.
하나의 예에서, KVS 트리 스코프 및 쓰기 요청의 안정성 값에 기초하여 스트림 ID를 쓰기 요청에 할당하는 단계는 선택-스트림 데이터 구조로부터 스트림-스코프에 대응하는 스트림 ID를 반환(가령, 호출 애플리케이션으로 제공)하는 단계를 더 포함한다. 하나의 예에서, 선택-스트림 데이터 구조로부터 스트림-스코프에 대응하는 스트림 ID를 반환하는 단계는 스트림 ID에 대응하는 선택-스트림 데이터 구조 내 엔트리에 대한 타임 스탬프를 업데이트하는 단계를 포함한다. 하나의 예를 들면, 쓰기 요청은 WLAST 플래그를 포함하고, 선택-스트림 데이터 구조로부터 스트림-스코프에 대응하는 스트림 ID를 반환하는 단계는 선택-스트림 데이터 구조로부터 스트림 ID에 대응하는 엔트리를 제거하는 단계를 포함한다.
하나의 예에서, 방법(300)은 선택-스트림 데이터 구조로부터 임계값을 초과하는 타임 스탬프를 갖는 엔트리를 제거하는 단계를 포함하도록 확장될 수 있다.
동작(315)에서, 스트림 ID는 쓰기 요청으로의 스트림 할당을 통제하기 위해 반환되며, 이때, 스트림 할당은 멀티-스트림 저장 디바이스의 쓰기 동작을 수정한다.
하나의 예를 들면, 방법(300)은 KVS 트리 스코프에 기초하여 안정성 값을 할당하는 단계를 포함하도록 선택적으로 확장될 수 있다. 예를 들어, 안정성 값은 안정성 값의 지정 세트 중 하나이다. 예를 들어, 안정성 값의 지정 세트는 HOT, WARM 및 COLD를 포함하며, 여기서 HOT은 멀티-스트림 저장 디바이스 상의 데이터의 예상 최저 수명을 나타내고 COLD는 멀티-스트림 저장 디바이스 상에서의 데이터의 예상 최고 수명을 나타낸다.
하나의 예를 들면, 안정성 값을 할당하는 단계는 KVS 트리 스코프의 일부를 사용하여 데이터 구조로부터 안정성 값을 찾는 단계를 포함한다. 하나의 예를 들면, KVS 트리 스코프의 일부는 데이터에 대한 레벨 ID를 포함한다. 하나의 예를 들면, KVS 트리 스코프의 일부는 데이터에 대한 유형을 포함한다.
하나의 예를 들면, KVS 트리 스코프의 일부는 데이터에 대한 트리 ID를 포함한다. 하나의 예를 들면, KVS 트리 스코프의 일부는 데이터에 대한 레벨 ID를 포함한다. 하나의 예를 들면, KVS 트리 스코프의 일부는 데이터에 대한 노드 ID를 포함한다.
도 4는 하나의 실시예에 따르는 키(key) 및 값(value)에 대한 저장 구성의 하나의 예시를 도시하는 블록도이다. Kvset은 키를 보유하기 위해 키-블록(필요에 따라 툼스톤과 함께) 및 값을 보유하기 위해 값-블록을 이용해 저장될 수 있다. 주어진 kvset에 대해, 키-블록은 단일 키를 효율적으로 찾고, 키의 범위를 찾으며, 키 툼스톤을 포함해 kvset의 모든 키의 전 순서를 생성하고, 이들 키와 연관된 값이 존재하는 경우 이를 획득하기 위한 인덱스 및 그 밖의 다른 정보(가령, 블룸 필터)를 더 포함할 수 있다.
단일 kvset이 도 4에 나타나 있다. 키-블록은 헤더(405)를 포함하는 주 키 블록(410) 및 확장 헤더(417)를 포함하는 확장 키-블록(415)을 포함한다. 값 블록은 헤더(420, 440) 및 각자의 값(425, 430, 435 및 445)을 포함한다. 두 번째 값 블록은 또한 자유 공간(450)을 포함한다.
kvset에 대한 트리 표현은 키-블록(410 및 415)에 걸쳐있는 것으로 도시되어 있다. 이 예시에서, 리프 노드는 값(425, 430, 435 및 445)에 대한 값 참조(VID) 및 툼스톤을 갖는 두 개의 키를 포함한다. 이는, 하나의 예시에서, 툼스톤이 키-값 쌍의 유형으로 지칭될 수 있더라도, 값 블록 내 대응하는 값을 갖지 않음을 보여준다.
값 블록의 그림은 각각이 헤더와 값이 구분 없이 나란히 있을 수 있음을 보여준다. 값, 가령, 값(425)에 대한 값 블록 내 특정 비트에 대한 참조가 일반적으로 오프셋 및 확장 포맷으로 대응하는 키 엔트리에 저장된다.
도 5는 하나의 실시예에 따른 KVDB 인제스트를 도시하는 블록도이다. KVDB에서, KVS 트리처럼, 새로운 kvset를 기본 레벨(510)에 쓰는 프로세스를 인제스트(ingest)라고 한다. 키-값 쌍(505)(툼스톤 포함)은 KVDB의 기본 레벨 510(메모리-내에서 시작될 수 있음)에 누적되며, 최신 것(515)부터 가장 오래된 것(520)까지 순서화된 kvset으로 조직된다.
기본 레벨이(예를 들어, 엔트리로) 채워지면, 스필(525)은 기본 레벨 노드(510)에서 가장 오래된 kvset(520) 내 키-값 쌍 및 툼스톤을 KVDB의 다음 레벨 노드(530 또는 540) 내 새로운(및 최신) kvset(535)에 쓰며, 그런 다음 기본 레벨(510)로부터 상기 kvset(520)를 삭제한다. 기본 레벨 내에서, 메모리-내 노드로부터 블록 어드레싱 가능한 노드로 유사한 형태의 스필이 발생할 수 있다. 이 경우, 절차가 결정적 매핑에 대해 제외하고 동일하게 유지된다. 단일 메모리-내 노드 및 단일 루트 블록 어드레싱 가능한 노드가 존재하는 경우, 결정적 매핑이 단순히 메모리-내 노드로부터 루트 블록 어드레싱 가능 노드로 포인팅한다. 다수의 어드레싱 가능한 루트 노드가 존재하는 경우, 기본 레벨과 다음 레벨 간에 사용되는 것과 상이한 결정적 매핑이 사용될 수 있다.
KVS 트리 동작과는 달리, 기본 레벨 노드(510)의 kvset은 둘 이상의 KVS 트리로부터의 엔트리(예를 들어, 키-값 쌍)를 포함하는 이종이다. 앞서 언급한 바와 같이, 이종 kvset의 엔트리는 자신의 KVS 트리와의 연관성을 유지하여, 예를 들어 다수의 트리가 동일한 키를 갖도록 하며(가령, 키 고유성은 TID와 키의 조합에 의해 결정됨), 또한 KVS 트리 연관성을 기초로 기본 레벨 노드(510)로부터 다음 레벨 노드(530 또는 540)로의 제1 결정적 매핑(가령, 스필(525)에 의해 도시됨)을 가능하게 한다(가령, 노드(530 및 540) 상의 배지에 의해 각각 지시되는 KVS 트리 T1 또는 T2). 따라서, TID는 이종 kvset(520)으로부터 동종 kvset(535 및 545)로의 스필을 가능하게 한다.
도 6은 하나의 실시예에 따른 KVDB 인제스트를 위한 방법(600)의 예를 도시한다. 방법(600)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(605)에서, KVDB에 저장되도록 kvset이 수신된다. 여기서, KVDB는 KVS 트리들 중 공통 루트 시스템을 갖는 트리로 조직된다. Kvset는 KVDB의 기본 레벨에서 다수의 KVS 트리에 대한 값으로의 고유 키의 매핑을 포함한다. Kvset의 키 및 값은 불변이며 트리의 노드는 kvset의 시간 순서 시퀀스를 가진다.
하나의 예를 들면, kvset이 적어도 하나의 저장 매체에 써질 때, kvset는 불변이다. 하나의 예를 들면, kvset의 키 엔트리는 주 키-블록(primary key-block) 및 0개 또는 하나 이상의 확장 키-블록을 포함하는 키-블록의 세트에 저장된다. 여기서, 키-블록의 세트의 구성원은 이를 키-블록으로 식별하기 위해 헤더를 포함하는 각각의 키-블록을 갖는 적어도 하나의 저장 매체에 대한 매체 블록에 대응한다.
예를 들면, 주 키-블록은 kvset의 하나 이상의 확장 키-블록에 대한 매체 블록 식별자의 리스트를 포함한다. 하나의 예를 들면, 주 키-블록은 값 블록 세트 내 값-블록에 대한 매체 블록 식별자의 리스트를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 키-트리 내 가장 낮은 키의 사본을 포함하며, 가장 낮은 키는 트리의 지정된 정렬 순서에 의해 결정된다. 하나의 예를 들면, 주 키-블록은 kvset의 키-트리 내 가장 높은 키의 사본을 포함하며, 가장 높은 키는 트리의 지정된 정렬 순서에 의해 결정된다. 하나의 예를 들면, 주 키-블록은 kvset의 키-트리에 대한 헤더를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 키-트리에 대한 매체 블록 식별자의 리스트를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 블룸 필터에 대한 블룸 필터 헤더를 포함한다. 하나의 예를 들면, 주 키-블록은 kvset의 블룸 필터에 대한 매체 블록 식별자의 리스트를 포함한다.
하나의 예를 들면, 동작(605)에서 값들은 값-블록의 세트에 저장된다. 여기서, 값-블록의 세트의 구성원은 이를 값-블록으로 식별하기 위해 헤더를 포함하는 각각의 값-블록을 갖는 적어도 하나의 저장 매체에 대한 매체 블록에 대응한다. 하나의 예를 들면, 값 블록은 이들 값을 분리하지 않고, 하나 이상의 값에 대한 저장 섹션을 포함한다.
예를 들어, 주 키-블록은 kvset에 대한 메트릭의 세트를 포함한다. 하나의 예를 들면, 메트릭의 세트는 kvset에 저장된 키의 총 수를 포함한다. 예를 들어, 메트릭의 세트는 kvset에 저장된 툼스톤 값을 갖는 키의 수를 포함한다. 예를 들어, 메트릭의 세트는 kvset에 저장된 키에 대한 모든 키 길이의 합을 포함한다. 예를 들어, 메트릭의 세트는 kvset에 저장된 키에 대한 모든 값 길이의 합을 포함한다. 하나의 예를 들면, 메트릭의 세트는 kvset의 값-블록 내 비-참조 데이터의 양을 포함한다.
동작(610)에서, kvset은 KVDB의 기본 레벨의 kvset의 시퀀스에 써진다.
방법(600)은 동작(615-625)을 포함하도록 확장될 수 있다.
동작(615)에서, 키-값 데이터 구조에 저장하기 위한 TID, 키 및 대응하는 값이 (예를 들어, 호출자로부터) 수신된다.
동작(620)에서, TID, 키 및 값은 예비 kvset에 배치되고, 예비 kvset은 변경 가능하다. 예를 들어, 제1 기본 레벨 노드로 쓰는 속도(동작(610))가 임계 값을 초과한다. 이 예에서, 방법(600)은 KVDB에 대한 쓰기 요청을 스로틀링(throttle)하도록 확장될 수 있다. 여기서, 스로틀링은 호출자에게 반환 또는 확인을 지연시키는 것을 포함할 수 있다.
동작(625)에서, kvset은 메트릭에 도달할 때 KVDB 내 또 다른 노드로 써진다. 하나의 예를 들면, 메트릭은 제1 기본 레벨 노드의 크기이다. 예를 들어, 메트릭은 경과 시간이다.
인제스션이 발생하면, 다양한 유지 관리 동작이 KVDB 또는 여기에 포함된 KVS 트리를 유지 관리하도록 채용될 수 있다. 예를 들어, 키가 한 번은 제1 값으로 써지고 차후 제2 값으로 써지는 경우, 제1 키-값 쌍을 제거하는 것이 공간을 비울 것이며 검색 시간을 감소시킬 것이다. 이러한 문제 중 일부를 해결하기 위해 KVDB는 압축을 사용할 수 있다. 몇몇 압축 동작의 세부사항이 도 7-16과 관련하여 이하에서 설명된다. 설명된 압축 동작은 병합 동안 낡은 데이터, 가령, 키 또는 키-값 쌍을 제거할 수 있기 때문에 가비지 수집의 형태이다.
압축은 다양한 트리거 조건 하에서, 가령, 노드 내 kvset가 특정된 또는 계산된 기준을 충족할 때 발생한다. 이러한 압축 기준의 예는 kvset의 총 크기 또는 kvset 내 가비지 양을 포함한다. Kvset 내 가비지의 한 가지 예는 가령, 더 새로운 kvset 내 키-값 쌍 또는 툼스톤에 의해 낡은 것이 된 하나의 kvset 내 키-값 쌍 또는 툼스톤, 또는 유효 시간(time-to-live) 제약을 위반한 키-값 쌍 등이 있다. Kvset 내 가비지의 또 다른 예는 키 압축으로 인한 값-블록 내 참조되지 않은 데이터(비참조 값)이다.
일반적으로, 압축 동작으로의 입력은 압축 기준이 충족될 때 노드에서의 일부 또는 모든 kvset이다. 이러한 kvset을 병합 세트(merge set)라고 하며 둘 이상의 kvset의 시간 연속 시퀀스를 포함한다.
새로운 데이터가 인제스트될 때 압축이 일반적으로 트리거되기 때문에, 방법(600)은 압축을 지원하도록 확장될 수 있지만, 예를 들어, 자유로운 처리 자원이 있을 때, 또는 유지 관리를 수행하기 위한 그 밖의 다른 편리한 시나리오가 있을 때 다음 동작이 또한 트리거될 수 있다. 따라서, KVDB는 압축될 수 있다. 하나의 예를 들면, 압축은 트리거에 응답하여 수행된다. 하나의 예에서, 트리거는 시간 주기의 만료이다.
하나의 예에서, 트리거는 노드의 메트릭이다. 하나의 예에서, 메트릭은 노드의 kvset의 총 크기이다. 하나의 예에서, 메트릭은 노드의 kvset의 수이다. 하나의 예에서, 메트릭은 노드의 비참조 값의 총 크기이다. 하나의 예에서, 메트릭은 비참조 값의 수이다.
도 7은 하나의 실시예에 따르는 키 압축(key compaction)을 도시하는 블록도이다. 키 압축은 병합 세트(가령, 압축되는 모든 kvset의 조합)에서 키 및 툼스톤을 읽지만 값을 읽지 않고, 모든 낡은 키 또는 툼스톤을 제거하며, 최종 키 및 툼스톤을 (가령, 새 키-블록으로 씀으로써) 하나 이상의 새 kvset로 쓰며, 노드로부터 키-저장소(key-store)를 삭제하지만 값을 삭제하진 않는다. 새로운 kvset은 노드에서 최신에서 가장 오래된 것까지 kvset의 논리적 순서화 내에서 내용과 배치 모두에서 병합 세트를 원자적으로 대체하며, 논리적으로 동일하다. KVDB의 이종 kvset(가령, 기본 레벨 노드의 kvset)에서, 다음 레벨 노드에서의 동종 kvset과 대조적으로, 엔트리의 TID가 키와 함께 고려되어 낡음 또는 툼스톤 매칭을 결정할 수 있다.
도시된 바와 같이, 이종 kvsets KVS3(최신의 것), KVS2 및 KVS1(가장 오래된 것)은 노드(705)에 대한 키 압축을 겪는다. 이들 kvset에 대한 키-저장소가 병합될 때, 키 B 상에서 충돌이 발생하지만 키 A 상에서는 충돌이 발생하지 않는데, 이는 키 A는 두 개의 상이한 KVS 트리(TID 1 및 TID 2로 표시됨)에 한 번 존재하고 키 B는 단일 KVS 트리(TID 2로 표시됨)에 두 번 존재하기 때문이다. 새로운 kvset, KVS4(노드(705)의 하위 버전에서 도시됨)가, TID도 고려할 때, 병합된 각각의 키 중 하나만 포함할 수 있기 때문에, 충돌은 키 B에 대한 값 ID(11)를 지칭하는 가장 최근의 (도시될 때 최좌측의) 키에 유리하게 해결된다. 키 A와 C는 충돌하지 않으므로 새로운 kvset KVS4에 포함된다. 예를 들어, 새로운 kvset, KVS4의 일부가 될 키 엔트리가 최상부 노드에서 음영 처리된다.
예를 들어, KVS4가 노드(705)에서 KVS1, KVS2 및 KVS3에 걸쳐 있도록 그려지고 값 엔트리가 노드(705) 내 유사한 위치에 그려진다. 이들 위치의 목적은 값이 키 압축에서 변경되지 않고, 오히려 키만 변경됨을 보이기 위함이다. 이하에서 설명될 바와 같이, 이는 임의의 주어진 노드에서 검색된 kvset 수를 감소시킴으로써 더 효율적인 검색을 제공하고 유지관리 동작을 지시하기 위한 유용한 통찰을 더 제공할 수 있다. 또한 값(20)은 점선으로 표시되어, 노드에서 지속되지만 각자의 키 엔트리가 압축에서 제거되었기 때문에 상기 키 엔트리에 의해 더는 참조되지 않음을 나타낸다.
정의하자면, 추가된 kvset가 키 압축으로부터 도출된 kvset(가령, KVS4)보다 논리적으로 더 새로울 것이기 때문에, 새로운 kvset(가령, KVS5)가 압축 중에 KVS3 또는 KVS4의 최신 위치(가령, 왼쪽)에 배치될 수 있으므로 키 압축은 넌-블로킹(non-blocking)이다.
도 8은 하나의 실시예에 따른 키 압축을 위한 방법(800)의 예를 도시한다. 방법(800)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(805)에서, 노드에 대한 kvset의 시퀀스로부터 kvset의 서브세트가 선택된다. 하나의 예를 들면, kvset의 서브세트는 연속적인 kvset이고 가장 오래된 kvset을 포함한다.
동작(810)에서, 충돌 키의 세트가 찾아진다. 충돌 키의 세트의 구성원은 노드에 대한 kvset의 시퀀스 내 적어도 두 개의 kvset 내 키 엔트리를 포함한다. KVDB의 동종 kvset에서, 충돌은 키에만 기반할 수 있다. KVDB의 이종 kvset에서, 충돌은 키와 TID의 조합을 기초로 하여, 식별 TID를 갖는 동일한 키들이 충돌이고 상이한 TID를 갖는 동일한 키가 충돌이 아니다.
동작(815)에서, 충돌 키의 세트의 각 구성원에 대한 가장 최신 키 엔트리가 새 kvset에 추가된다. 새 kvset가 이종 kvset 인 경우, 키에 해당하는 TID가 또한 새 kvset에 추가된다. 예를 들어, 노드가 자식 노드를 갖지 않는 경우, 그리고 kvset의 서브세트가 가장 오래된 kvset를 포함하는 경우, 충돌 키의 세트의 각각의 구성원에 대한 최신 키 엔트리를 새 kvset에 쓰고 충돌 키의 세트에 속하지 않는 kvset의 서브세트의 구성원 내 각각의 키에 대한 엔트리를 새 kvset에 쓰는 것이 툼스톤을 포함하는 임의의 키 엔트리를 생략하는 것을 포함한다. 예를 들어, 노드가 자식 노드를 갖지 않는 경우, 그리고 kvset의 서브세트가 가장 오래된 kvset를 포함하는 경우, 충돌 키의 세트의 각각의 구성원에 대한 최신 키 엔트리를 새 kvset에 쓰고 충돌 키의 세트에 속하지 않는 kvset의 서브세트의 구성원 내 각각의 키에 대한 엔트리를 새 kvset에 쓰는 것이 만료된 임의의 키 엔트리를 생략하는 것을 포함한다.
동작(820)에서, 충돌 키의 세트에 속하지 않는 kvset의 서브세트의 구성원 내 각각의 키에 대한 엔트리가 새 kvset에 추가된다. 하나의 예를 들면, 동작(820 및 815)은 새 kvset에 엔트리를 추가하기 위해 동시에 동작할 수 있다.
동작(825)에서, 새 kvset를 쓰고 kvset의 서브세트를 제거(예를 들어, 삭제, 삭제 표시 등)함으로써 kvset의 서브세트가 새 kvset로 대체된다.
도 9는 하나의 실시예에 따르는, 키-값 압축을 도시하는 블록도이다. 키 값 압축은 값의 처리에서 키 압축과 상이하다. 키-값 압축은 병합 세트로부터 키-값 쌍과 툼스톤을 읽고, 낡은 키-값 쌍 또는 툼스톤을 제거하고, 결과적 키-값 쌍 및 툼스톤을 동일한 노드(905)의 하나 이상의 새로운 kvset에 쓰며, 노드(905)로부터 병합 세트를 포함하는 kvset을 삭제한다. 새로운 kvset은 노드(905)에서 최신에서 가장 오래된 것까지 kvset의 논리적 순서화 내에서 내용과 배치 모두에서 병합 세트를 원자적으로 대체하며, 논리적으로 동일하다. 다시 말하면, 이종 노드(도 9에 도시됨)에서 충돌은 TID와 키의 조합으로 결정된다.
예를 들어, kvset KVS3, KVS2 및 KVS1은 병합 세트를 포함한다. 음영처리된 키 엔트리 및 값은 병합 상태로 유지되고 새 KVS4 내에 배치되어, KVS3, KVS2 및 KVS1을 대체하기 위해 노드(905)에 써진다. 다시 말해, 키 압축과 관련하여 앞서 예시된 바와 같이, 키 B에 대한 키 충돌은 가장 최신의 엔트리에 유리하게 해결된다. 키-값 압축이 키 압축과 차이나는 점은 참조되지 않는 값의 제거이다. 따라서, 여기서, KVS4는 자신의 현재 키 및 값을 보유하는 데 사용되는 공간만 소비하는 것으로 설명되어 있다.
실제로, 예를 들어, 키 및 값이 키-블록 및 값-블록에 개별적으로 저장될 때 KVS4는 새 키-블록(키 압축 결과와 같이)과 새 값 블록(키 압축 결과와는 달리)을 모두 포함한다. 다시 말하자면, 그러나, 추가된 kvset이 키-값 압축의 결과인 KVS4보다 논리적으로 더 최신일 것이기 때문에 키-값 압축이 실행되는 동안 키-값 압축은 노드(905)에 추가 kvset을 쓰는 것을 블록킹하지 않는다. 따라서, KVS4는 노드(905)의 가장 오래된 위치(예를 들어, 오른쪽)에 도시되어있다.
도 10은 하나의 실시예에 따르는, 키-값 압축을 위한 방법(1000)의 하나의 예시를 도시한다. 방법(1000)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(1005)에서, 노드에 대한 kvset의 시퀀스로부터 kvset의 서브세트(가령, 병합 세트)가 선택된다. 하나의 예를 들면, kvset의 서브세트는 연속적인 kvset이고 가장 오래된 kvset을 포함한다.
동작(1010)에서, 충돌 키의 세트가 찾아진다. 충돌 키의 세트의 구성원은 노드에 대한 kvset의 시퀀스 내 적어도 두 개의 kvset 내 키 엔트리를 포함한다. 이종 kvset에서, 충돌 키는 키와 TID의 매칭되는 조합이며, 반면에 동종 kvset에서, 충돌은 매칭되는 키만이다.
동작(1015)에서, 충돌 키의 세트의 각각의 구성원에 대한 가장 최신 키 엔트리 및 이에 대응하는 값이 새 kvset에 추가된다. 예를 들어, 노드가 자식 노드를 갖지 않는 경우, 그리고 병합 세트가 가장 오래된 kvset를 포함하는 경우, 충돌 키의 세트의 각각의 구성원에 대한 최신 키 엔트리를 새 kvset에 쓰고 충돌 키의 세트에 속하지 않는 kvset의 서브세트의 구성원 내 각각의 키에 대한 엔트리를 새 kvset에 쓰는 것이 툼스톤을 포함하는 임의의 키 엔트리를 생략하는 것을 포함한다. 예를 들어, 노드가 자식 노드를 갖지 않는 경우, 그리고 병합 세트가 가장 오래된 kvset를 포함하는 경우, 충돌 키의 세트의 각각의 구성원에 대한 최신 키 엔트리를 새 kvset에 쓰고 충돌 키의 세트에 속하지 않는 kvset의 서브세트의 구성원 내 각각의 키에 대한 엔트리를 새 kvset에 쓰는 것이 만료된 임의의 키 엔트리를 생략하는 것을 포함한다.
동작(1020)에서, 충돌 키의 세트에 속하지 않는 kvset의 서브세트의 구성원 내 각각의 키에 대한 엔트리 및 값이 새 kvset에 추가된다.
동작(1025)에서, 새 kvset를 (가령, 저장장치로) 쓰고 kvset의 서브세트를 제거함으로써 kvset의 서브세트가 새 kvset로 대체된다.
도 13-16과 관련하여 이하에서 언급되는, 스필 및 호이스트 압축이 결과 kvset이 각각 자식 노드 또는 부모 노드에 배치되는 키-값 압축의 형태이다. 각각이 KVDB를 순회하고, KVDB가 부모 노드와 자식 노드 간에 결정적 매핑을 시행함에 따라, 그 밖의 다른 압축 동작을 언급하기 전에 이 결정적 매핑에 대한 간략한 설명이 여기서 제공된다.
도 11은 하나의 실시예에 따른 스필 값 및 이의 KVDB와의 관계의 예를 도시한다. 앞서 언급한 바와 같이, KVDB는 기본 레벨과 다음 레벨 사이의 제1 결정적 매핑, 다음 레벨들 사이의 제2 결정적 매핑, 및 가능하면 기본 레벨들 사이의 제3 결정적 매핑을 포함한다. 결정적 매핑은 KVS 트리와 키가 주어지면 KVDB의 내용에 관계없이 키-값 쌍이 매핑될 KVDB 노드를 알 수 있다. 각각의 스필 함수는 키를 수락하고 KVDB에 대한 결정적 매핑에 대응하는 각각의 스필 값을 생성한다. 예를 들어, 스필 함수는 키와 현재 트리-레벨을 모두 수락하고 해당 트리-레벨에서의 키의 부모 또는 자식 노드에 특정한 스필 값을 생성한다.
설명을 위해, 간단한 결정적 매핑(도 11에 도시되지 않음)은 예를 들어 알파벳 문자로 구성된 키에 대해 각각의 트리-레벨이 알파벳의 각각의 글자에 대한 하나씩의 자식을 포함하는 알파벳 매핑을 포함할 수 있고, 매핑은 차례로 키의 문자를 이용하는데, 예를 들어 첫 번째 문자는 L1 자식을 결정하고 두 번째 문자는 L2 자식을 결정하며, 그런 식으로 계속된다. 제1 결정적 매핑을 위해, TID가 키 앞에 붙여질 수 있다. 단순하고 KVDB의 결정적 매핑을 충족시키는 반면, 이 기법은 KVDB 내 강직성, 불균형 및 패닝(fanning)에 대한 제어 결여로 어려움을 겪는다.
더 나은 기법이 키에 대해 해시를 수행하고 각각의 트리-레벨 매핑에 대해 해시의 부분을 지정하는 것이다. 이를 통해 키가 KVDB를 순회함에 따라 키가 고르게 확산되고(적절한 해시 기법을 가정) 임의의 주어진 트리-레벨에 대한 해시 부분의 크기를 선택함으로써 팬-아웃이 제어됨이 보장된다. 또한, 해시 기법은 일반적으로 결과 해시의 크기가 구성될 수 있게 하기 때문에, 예를 들어, 짧은 단어(가령, "the")만 3 레벨 트리에 대해 충분한 문자인, 앞서 언급된 단순한 기법의 문제를 회피하면서, 적절한 수의 비트가 보장될 수 있다. 다시 말하면, TID는 제1 결정적 매핑을 생성하기 위해 해싱 전에 키에 추가될 수 있다. 하나의 예에서, TID가 사용되어 자식 노드의 세트와 주어진 엔트리가 상기 자식 노드의 세트 중 어느 것에 매핑되는지를 선택하는 이들 TID에 대응하는 키의 해시를 식별할 수 있다.
도 11은 (TID(1101)를 갖는) 트리 T1의 L1, L2, L3 및 L4에 각각 대응하는 부분(1103, 1105, 1110 및 1115)을 갖는 다음 레벨 키 해시의 결과를 도시한다. 도시된 바와 같이, T2는 기본 레벨에서 다음 레벨로의 전환을 수락하기 위해 단일의 다음 레벨 노드를 가진다. 따라서, T2의 TID(1101)는 기본 레벨에서 T2 다음 레벨로 키-값 엔트리 전환에 대해 결정적이다. 따라서, T2와 유사한 L1 부분(1103)은 필요하지 않다(예를 들어, 사용되지 않음). 주어진 키 해시와 TID(1101)에 의해, KVDB의 순회가 점선과 노드를 따라 진행된다. 구체적으로, 기본 레벨 노드(1120)에서 시작하여, 부분(1103)은 제1 결정적 매핑(예를 들어, TID(1101) 및 부분(1103))을 사용하여 T1 엔트리의 순회를 노드(1122)로 지향시킨다. 그런 다음, 부분(1105)은 (예를 들어, 본 명세서에서 언급된 제2 결정적 매핑을 이용해) T1 다음 레벨 순회를 노드(1125)로 지향시킨다. 그 후, 부분(1110)은 순회를 노드(1130)로 지향시킨다. 순회는 부분(1115)이 도시된 키 해시의 크기 및 할당에 기초하여 가능한 트리의 가장 깊은 레벨에서 노드(1135)를 향함에 따라 완료된다. 제2 결정적 매핑은 KVS 트리 특정적이다. 따라서, T2 다음 레벨에 대한 제2 결정적 매핑은 T1 다음 레벨에 대한 것과 상이할 수 있다.
예를 들어, 주어진 키 K에 대해 키 K의 해시(또는 키 K의 서브키(subkey))를 키 K의 스필 값(spill value)이라고 한다. 두 개의 상이한 키가 동일한 스필 값을 가질 수 있다. 서브 키를 사용하여 스필 값을 생성할 때, 이하에서 설명될 바와 같이, 이는 프리픽스(prefix) 스캔 또는 툼스톤을 활성화하도록 발생하는 것이 종종 바람직하다. 다시 말하면, TID가 스필 값에 포함되는지 여부는 본래 노드에 따라 달라있다. 예를 들어, TID는 인트라 기본 레벨 매핑 또는 인트라 다음 레벨 매핑에 대한 스필 값에서 사용되지 않지만 기본 레벨에서 다음 레벨로의 매핑에서 사용된다.
예를 들어, 주어진 KVDB에 대해, 주어진 키 K에 대한 스필 값은 상수이고, 스필 값의 이진 표현은 B 비트를 포함한다. 이 예에서, 스필 값의 B 비트는 0 내지 (B - 1)의 번호가 매겨진다. 또한,이 예에서, KVDB는 트리-레벨 L의 노드가 모두 동일한 수의 자식 노드를 갖도록 구성되며, 이 자식 노드의 수는 2 이상의 정수 제곱이다. 이 거동은 레벨 이동의 키 해싱 특정적이다. 그러나 기본 레벨에서 다음 레벨로 전환할 때 KVS 트리가 또한 고려된다. 여기서, 키 해싱 특성은 하나의 KVS 트리 내에서 앞서 언급한 자식 노드 제약을 생성할 것이지만 많은 KVS 트리가 존재할 수 있고 따라서 총 자식 노드 카운트가 이러한 KVS 트리의 수를 기초로 한다. 이 구성에서, 키 분배를 위한 키 K에 대한 스필 값의 비트는 아래에 도시 된 바와 같이 사용될 수 있다.
KVDB의 레벨 L에 있는 노드의 경우, 2^E(L)을 노드에 대해 구성된 자식 노드의 수로 두면, 2^E(L) >= 2이다. 그런 다음 KVS 트리에서 주어진 노드와 주어진 키 K에 대해, 키 K의 스필 값은 스필 압축에 사용되는 노드의 자식 노드를 다음과 같이 특정한다:
A)
레벨 0 : 스필 값 비트 0 내지 (E(0) - 1)가 키 K에 대한 자식 노드 번호를 특정한다
B)
레벨 1 : 스필 값 비트 E(0) 내지 (E(0) + E(1) - 1)가 키 K에 대한 자식 노드 번호를 특정한다.
C)
레벨 L(L>1): 스필 값 비트 sum(E(0)..., E(L-1)) 내지 (sum(E(0),..., E(L)) - 1)가 키 K에 대한 자식 노드 번호를 특정한다.
아래 표는 7 레벨을 갖는 KVDB 내 KVS, 키 K, 및 키 K에 대한 16-비트 스필 값이 주어질 때 상기의 기수-기반 키 분배 기법의 특정 예시를 보여준다:
여기서 레벨이 KVDB 내 KVS 트리 내 레벨 번호이고, 자식 노드 카운트는 특정된 레벨의 모든 노드에 대해 구성된 자식 노드의 수이며, 스필 값은 특정된 레벨에서의 키 분배를 위해 스필 압축이 이용하는 스필 값 비트 수이며, 키 K 스필 값은 주어진 키 K에 대한 주어진 16-비트 스필 값의 이진 표현, 구체적으로, 0110011110100011이고 - 명료성을 위해, 스필 값은 특정 레벨에서의 키 분배를 위해 스필 압축이 이용하는 비트로 세그먼팅되고, 선택된 자식 노드는 주어진 스필 값을 갖는 임의의 (낡지 않은) 키-값 쌍 또는 툼스톤을 위해 스필 압축이 선택한 자식 노드 번호이고 - 이는 주어진 키 K를 갖는 모든 (낡지 않은) 키-값 쌍 또는 툼스톤뿐 아니라 동일한 스필 값을 가질 수 있는 키 K와 상이한 그 밖의 다른 키까지 포함한다. 다시 말하면, 이는 키가 결정적 매핑을 제공하도록 하는 메커니즘이다. 그러나, KVDB에서, 기본 레벨들 사이, 다음 레벨들 사이, 및 기본 레벨과 다음 레벨 사이에 상이한 결정적 매핑이 사용될 수 있다.
예를 들어, 주어진 KVDB 및 결정적 매핑에 대해, 스필 값 계산 및 스필 값 크기(비트)가 모든 키에 대해 동일할 수 있다. 앞서 언급한 바와 같이, 적절한 해시를 이용함으로써 스필 값의 비트 수를 제어할 수 있으며, 또한, 예를 들어, 트리-레벨의 원하는 수 및 각각의 레벨에서의 노드에 대한 자식 노드의 원하는 수를 수용하기에 충분한 스필 값 크기를 보장할 수 있다. 예를 들어, 주어진 KVS 트리에 대해, 키 K에 대한 스필 값은 필요에 따라 계산되거나 저장 매체(예를 들어, 캐시)에 저장될 수 있다.
도 12는 하나의 실시예에 따라, 스필 값 함수를 위한 방법(1200)의 일례를 도시한다. 방법(1200)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(1205)에서, 키의 일부가 추출된다. 예를 들어, 키의 일부는 전체 키이다.
동작(1210)에서, 스필 값은 KVDB 노드 순회(예를 들어, 기본 레벨에서 다음 레벨로의 순회)에 기초하여 선택된 결정적 매핑의 세트 중 하나를 이용하여 키의 부분으로부터 파생된다. 하나의 예에서, 키 부분으로부터 스필 값을 파생하는 단계는 키의 부분의 해시를 수행하는 단계를 포함한다.
동작(1215)에서, 스필 값의 일부분이 부모 노드의 트리-레벨에 기초하여 반환된다. 하나의 예에서, 부모 노드의 트리-레벨에 기초하여 스필 값의 일부를 반환하는 것은 스필 값에 지정된 배정(apportionment)을 적용하는 단계, 및 지정된 배정에 대응하는 스필 값의 일부분 및 부모 노드의 트리-레벨을 반환하는 단계를 포함한다. 여기서, 지정된 배정은 KVDB의 각자 레벨에 적용되는 스필 값의 일부분을 정의한다.
예를 들어, 지정된 배정은 트리-레벨 중 적어도 일부에 대한 자식 노드의 최대 수를 정의한다. 예를 들어, 지정된 배정은 트리의 최대 심도를 정의한다. 예를 들어, 지정된 배정은 비트-카운트의 시퀀스를 정의하며, 각각의 비트-카운트는 비트 수를 특정하고, 시퀀스는 낮은 트리-레벨에서부터 높은 트리-레벨로 순서화되어, 가장 낮은 트리-레벨에 대한 스필 값 부분이 스필 값의 시작부분에서 시작하는 제1 비트-카운트와 동일한 비트 수와 동일하게 되고, n번째 트리-레벨에 대한 스필 값 부분이 제1 비트-카운트에서 시작하여 n 빼기 1 비트-카운트에서 끝나는 비트 카운트의 합의 스필 값의 오프셋을 두고 비트 카운트의 시퀀스 내 n번째 비트-카운트와 동일하게 된다.
도 13은 하나의 실시예에 따른, 기본 레벨 노드에서 다음 레벨 노드로의 스필 압축을 도시하는 블록도이다. 앞서 언급한 바와 같이, 스필 압축은 키-값 압축과 (자식 노드로의) 트리 순회를 조합하여 결과적인 kvset을 배치하는 것이다. 따라서 스필 압축(또는 단순히 스필)은 병합 세트로부터 키-값 쌍과 툼스톤을 읽고, 모든 낡은 키-값 쌍 또는 툼스톤(가비지)을 제거하고, 결과적 키-값 쌍 및 툼스톤을 병합 세트를 포함하는 노드의 일부 또는 모든 자식 노드 내 새 kvset에 쓰며, 병합 세트를 포함하는 kvset을 삭제한다. 이들 새 kvset은 병합 세트를 원자적으로 대체하고 이와 논리적으로 동등하다. 이 스필 압축은 기본 레벨 노드 또는 다음 레벨 노드 사이에 있지 않기 때문에, 엔트리의 KVS 트리(가령, TID)가 스필 값에 영향을 준다. 다음 레벨 노드는 이들이 속하는 각자의 KVS 트리(예를 들어, T1, T2 및 T3)로 라벨링된다.
스필 압축은 병합 세트 내 키-값 쌍 및 툼스톤을 병합 세트를 포함하는 노드의 자식 노드에 분배하기 위해 결정적 기법을 사용한다. 특히, 스필 압축은, 주어진 노드 및 주어진 키 K에 대해 스필 압축이 키 K를 갖는 임의의 (낡지 않은) 키-값 쌍 또는 툼스톤을 상기 노드의 동일한 자식 노드로 쓰도록, 이러한 키 분배 방법을 이용할 수 있다. KVDB에서 결정적 기법은 부모 및 자식 노드가 기본 레벨 노드인지, 부모가 기본 레벨 노드이고 자식이 다음 레벨 노드인지, 또는 부모 및 자식이 다음 레벨 노드인지에 따라 다를 수 있다. 하나의 실시예에서, 스필 압축은 이하에서 제시된 예에서와 같은, 기수-기반 키 분배 방법을 사용한다.
스필(spill)의 이해를 돕기 위해, 부모 노드는 병합 세트를 포함하는 두 개의 kvset을 포함한다. 두 개의 kvset 내 TID 인식 키-값 쌍(1305, 1310 및 1315)은 각각 부모 노드의 네 개의 자식 노드 중 세 개에 대응하는 스필 값을 가진다. 따라서, 키-값 쌍(1305)은 새 kvset X(T1 노드)에 배치되고, 키-값 쌍(1310)은 새 kvset Y(또한 T1 노드)에 배치되고, 키-값 쌍(1315)은 새 kvset Z(T3 노드)에 배치되며, 이때, 각각의 새로운 kvset은 스필 값에 대응하는 자식에 써진다. 또한 새 kvset은 각자의 자식 노드에서 가장 최신 위치(가령, 가장 왼쪽)에 써진다.
예를 들어, 스필 압축에 대한 병합 세트는 상기 병합 세트를 포함하는 노드에서 가장 오래된 kvset을 포함해야 한다. 예를 들어, 병합 세트를 포함하는 노드가 스필 압축의 시작에서 어떠한 자식 노드로 갖지 않는 경우, 자식 노드의 구성된 수가 생성된다.
앞서 언급된 다른 압축에서와 같이, 스필 압축이 실행되는 동안 새 kvset은 스필 압축을 위한 병합 세트를 포함하는 노드에 추가될 수 있는데, 이는 원리적으로, 이들 추가된 kvset이 스필 압축을 위한 병합 세트에 속하지 않을 것이기 때문에 그리고 이들 추가된 kvset가 스필 압축으로부터 도출된 kvset보다 논리적으로 새로울 것이기 때문이다.
도 14는 하나의 실시예에 따른 스필 압축을 위한 방법(1400)의 예를 도시한다. 방법(1400)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(1405)에서, kvset 시퀀스의 서브 세트가 선택된다. 하나의 예에서, 서브세트는 가장 오래된 kvset도 포함하는 연속 kvset을 포함한다.
동작(1410)에서, kvset의 서브세트의 각각의 kvset 내 각각의 키에 대한 자식-매핑은 노드의 위치에 기초하여 선택된 결정적 매핑에 기초하여 계산된다. 따라서 노드가 기본 레벨 노드이고 이의 자식 노드가 다음 레벨 노드인 경우 제1 결정적 매핑이 선택되고, 노드가 다음 레벨 노드인 경우 제2 결정적 매핑이 선택되고, 자식 노드가 기본 레벨 노드인 경우 제3 결정적 매핑이 선택된다. 여기서, 자식 매핑은 키, 부모 노드의 트리-레벨, 및 가능하면 TID 등에 기초하여 부모 노드에서 자식 노드로의 결정적 맵이다.
동작(1415)에서, 키, 아마도 TID 및 대응하는 값이 자식-매핑에 기초하여 kvset로 수집되는데, 이때, 각각의 kvset 세트가 정확히 하나씩의 자식 노드로 매핑된다. 이 수집 동안 키 충돌이 발생할 수 있다. 도 8 및 10와 관련하여 앞서 언급한 바와 같이 이러한 충돌은 더 새로운 키 엔트리에 유리하게 해결된다.
동작(1420)에서, kvset은 각자의 자식 노드 내 kvset의 각자의 시퀀스에서 가장 최신 위치에 써진다.
동작(1425)에서, kvset의 서브세트가 루트 노드로부터 제거된다.
방법(1400)은 스필 동작의 동작 후 임계값을 초과하는 자식 노드의 메트릭에 응답하여 자식 노드에 대해 두 번째 스필 동작을 수행하는 단계를 포함하도록 확장될 수 있다.
도 15는 하나의 실시예에 따른 다음 레벨 노드로부터 기본 레벨 노드로의 호이스트 압축(hoist compaction)을 도시하는 블록도이다. 호이스트 압축은 새 kvset이 부모 노드에 써진다는 점에서 스필 압축과 다르다. 따라서, 호이스트 압축 또는 간단히 호이스트는 병합 세트에서 키-값 쌍과 툼스톤를 읽고, 모든 낡은 키-값 쌍 또는 툼스톤를 제거하고, 결과적 키-값 쌍과 툼스톤을 병합 세트를 포함하는 노드의 부모 노드 내 새 kvset에 쓰며, 병합 세트를 포함하는 kvset를 삭제한다. 이들 새 kvset은 병합 세트를 원자적으로 대체하고 이와 논리적으로 동등하다. 이 경우, TID 등도 새 kvset에 써진다.
Kvset이 가장 최신의 것에서 가장 오래된 것으로 조직되기 때문에, 호이스트 압축은 병합 세트를 포함하는 노드에 가장 최신 kvset을 포함하고, 호이스트 압축으로 도출된 kvset은 부모 노드의 kvset 시퀀스에서 가장 오래된 위치에 배치된다. 앞서 설명한 다른 압축과 달리, 압축중인 노드의 최신 kvset이 병합 세트에 있도록 하기 위해, 호이스트 압축이 실행되는 동안 병합 세트를 포함하는 노드에 새로운 kvset을 추가할 수 없다. 따라서, 호이스트 압축은 블로킹 압축이다.
예로 든 바와 같이, KVS(1505 및 1510)의 키-값 쌍이 새로운 KVS M(1515)에 병합되고 부모 노드의 kvset 시퀀스에서 가장 오래된 위치에 저장된다. 예를 들어 목표가 KVS 트리의 레벨 수를 감소시키고 따라서 KVS 트리에서 키를 검색하는 효율성을 높이는 것일 때 병합 세트에 호이스트 압축이 적용될 수 있다.
도 16은 하나의 실시예에 따른 호이스트 압축을 위한 방법(1600)의 예를 도시한다. 방법(1600)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다. 예를 들어,
동작(1605)에서, 새 kvset을 자식 노드에 기록하지 않고 새 kvset을 생성하기 위해 자식 노드 상에서 키 및 값 압축이 수행된다.
동작(1610)에서, 새 kvset는 노드의 kvset의 시퀀스에 대해 가장 오래된 위치에서 노드에 써진다.
키-값 압축, 스필 압축 및 호이스트 압축 동작은 병합 세트에서 낡은 키-값 쌍과 툼스톤를 물리적으로 제거하고 이로써 KVDB에 저장된 키-값 데이터의 양(가령, 바이트)을 줄일 수 있다. 그렇게 함으로써, 이들 압축 동작은 예를 들어, 병합 세트에서 값-블록으로부터 낡지 않은 값을 읽고 이들 값을 압축 동작으로 도출된 kvset 내 값-블록에 쓴다.
반대로, 키 압축 동작은 키(및 툼스톤)를 물리적으로 제거 할 수 있지만 병합 세트로부터는 값을 논리적으로만 제거한다. 따라서 값이 키 압축으로부터 도출된 kvset에 물리적으로 유지된다. 키 압축은 예를 들어 키-값 압축 동작에 의해 발생하는 값-블록의 추가 읽기 및 쓰기를 피하면서 병합 세트를 포함하는 노드에서 kvset의 수를 감소시킴으로써 상기 노드에서 키를 검색하는 효율을 증가시킬 수 있다. 또한 키 압축은 차후 유지관리 작업에 유용한 정보를 제공한다. 키 압축은 앞서 기재된 바와 같이 키-블록 및 값-블록의 키 및 값 분리로 인해 KVDB에 의해 고유하게 지원된다.
앞서 기재된 KVDB 유지 관리 기법(가령, 압축)은 트리거 조건이 충족 될 때 작동한다. 언제 그리고 어디서(예를 들어, 어떤 노드) 유지 보수가 발생하는지를 제어하는 것은 프로세싱 또는 시간, 소비 대 증가 공간 또는 검색 효율에 최적화를 제공할 수 있다. 유지 관리 또는 인제스트 동안 수집된 일부 메트릭은 차후 유지 관리 동작을 최적화할 수 있는 시스템 능력을 향상시킬 수 있다. 여기서, 이들 메트릭을 메트릭 계산 방법에 따라 가비지 메트릭 또는 추정된 가비지 메트릭이라고 한다. 이러한 가비지 메트릭의 예로는 노드 내 낡은 키-값 쌍 및 툼스톤의 수 또는 소비하는 저장 용량, 및 노드 내 값-블록 내 비참조 데이터에 의해 소비되는 저장 용량을 포함한다. 이러한 가비지 메트릭은 예를 들어 노드의 kvset에 대해 키-값 압축, 스필 압축, 또는 호이스트 압축을 수행함으로써, 제거될 수 있는 가비지의 양을 나타낸다.
다시 말하자면, 주어진 KVDB의 경우, 이의 노드에 대한 가비지 메트릭을 계산하거나 추정하는 것은 몇 가지 이점, 가령, 다음의 실용적 이점을 제공한다:
A)
가비지 수집 동작을 대부분의 가비지를 갖는 노드에 적용하는 것, 특히, 키-값 쌍 및 툼스톤을 물리적으로 삭제하는 가비지 수집 동작, 가령, 키-값 압축, 스필 압축, 및 호이스트-압축을 우선순위화 이러한 방식으로 가비지 수집 동작을 우선순위화하는 것이 효율을 증가시키고 연관된 쓰기-증폭을 감소킴, 또는
B)
KVDB에서 유효한 키-값 쌍의 수와 낡은 키-값 쌍의 수, 및 각각의 카테고리에 의해 소비되는 저장 용량을 추정하는 것. 이러한 추정치는 KVDB에 대한 용량 사용률을 보고하는 데 유용하다.
어떤 경우에는 주어진 노드에 대한 가비지 메트릭을 직접 계산하는 것이 유리하지만 다른 경우에는 이를 추정하는 것이 유리한다. 따라서 가비지 메트릭을 계산하고 추정하는 기법이 이하에서 기재된다.
가비지 메트릭스 수집을 용이하게 하기 위해 일부 kvset 통계를 수집하거나 유지할 수 있다. 예를 들어, 이러한 통계는 kvset 세트 자체 내에서, 가령, kvset에 대한 주 키-블록 헤더에 유지된다. 다음은 유지관리될 수 있는 kvset 통계의 비-포괄적 리스트이다:
A)
키-값 쌍의 수
B)
키 툼스톤의 수
C)
키-값 쌍 및 툼스톤에 대한 모든 키를 저장하는 데 필요한 용량
D)
키-값 쌍에 대한 모든 값을 저장하는 데 필요한 용량
E)
최소, 최대, 중앙값 및 평균을 포함한 키 크기 통계
F)
최소, 최대, 중앙값 및 평균을 포함한 값 크기 통계
G)
kvset이 키 압축의 결과인 경우, 비참조 값의 카운트 및 이에 의해 소비되는 용량.
H)
임의의 키-값 쌍에 대한 최소 및 최대 TTL(Time-To-Live) 값. KVS 트리는 키-값 쌍을 저장할 때 사용자가 TTL 값을 특정할 수 있게 하며, 키-값 쌍은 수명이 초과되면 압축 작업 중에 제거될 것이다.
계산된 가비지 메트릭은 알려진 결과를 생성하기 위해 알려진 수량의 계산을 포함한다. 예를 들어, kvset 내 낡은 n 비트가 있는 것으로 알려진 경우 kvset을 키-값 압축이 이들 n 비트가 비우는 결과를 도출할 것이다. 계산된 가비지 메트릭에 대한 메트릭의 소스는 키 압축이다. 키 압축은 낡은 키-값 쌍과 툼스톤를 논리적으로 제거하고 병합 세트로부터 중복 키를 물리적으로 제거한다. 그러나 비참조 데이터는 키 압축으로 인한 kvset의 값-블록에 남아 있을 수 있다. 따라서 키 압축에 의해 새 kvset에서 어떤 값이 참조되지 않았는지 및 이들의 크기를 알 수 있다. 이들 값의 크기를 알면 다른 압축 하에서 확보될 수 있는 정확한 스토리지 카운트가 가능해진다. 따라서, 병합 세트에 대해 키 압축을 실행할 때, 각각의 결과적인 kvset에 대한 가비지 메트릭이 각자의 kvset에 기록될 수 있다. 키 압축에서 유지될 수 있는 가비지 메트릭의 예는 다음과 같다:
A)
kvset 내 비참조 값의 카운트
B)
kvset 내 비참조 값의 바이트
예를 들어, 병합 세트에서 제1 키 압축이 주어지고, 제1 키 압축과 동일한 노드에서 제2 키 압축이 주어질 때 - 제2 키 압축에 대한 병합 세트는 제1 키 압축으로부터 도출된 kvset을 포함 - , 제1 키 압축으로부터 기록된 가비지 메트릭이 제2 키 압축으로부터 기록된 유사한 가비지 메트릭에 추가될 수 있다. 예를 들어, 제1 키 압축 동작이 비참조 값의 Ucnt 카운트를 특정하는 연관된 키 압축 가비지 메트릭을 갖는 단일 kvset S를 도출하는 경우, Ucnt는 제2 키 압축 동작으로부터 도출된 키 압축 가비지 메트릭 내 비참조 값의 카운트에 포함될 수 있다.
예를 들어, 주어진 노드에 대해, 키 압축 동작에 대한 병합 세트가 노드 내 모든 kvset을 포함하는 경우, 기록된 키 압축 가비지 메트릭은 다음을 포함할 수 있다:
A)
노드 내 비참조 값의 카운트
B)
노드 내 비참조 값의 바이트
주어진 노드의 모든 kvset이 키 압축 동작의 결과인 경우, 노드에 대한 키 압축 가비지 메트릭은 노드 내 각각의 개별 kvset로부터의 유사한 키 압축 가비지 메트릭의 합계이다.
추정된 가비지 메트릭은 노드 상에서 압축을 수행하여 얻은 이익을 추정하는 값을 제공한다. 일반적으로 추정된 가비지 메트릭은 키 압축을 수행하지 않고 수집된다. 아래의 용어는 다음과 같이 사용된다:
A)
T = 주어진 노드의 kvset의 수
B)
S(j) = 주어진 노드 내 kvset, 여기서 S(1)은 가장 오래된 kvset이고 S(T)는 최신임
C)
KVcnt(S(j)) = S(j) 내 키-값 쌍의 수
D)
NKVcnt = 1 내지 T의 범위에서 j에 대한 sum(KVcnt(S(j)))
E)
Kcap(S(j)) = S(j)에 대한 모든 키를 바이트로 저장하는 데 필요한 용량
F)
NKcap = 1 내지 T의 범위에서 j에 대한 sum(Kcap(S(j)))
G)
Vcap(S(j)) = S(j)에 대한 모든 값을 바이트로 저장하는 데 필요한 용량
H)
NVcap = 1 내지 T 범위에서 j에 대한 sum(Vcap(S(j)))
I)
NKVcap = NKcap + NVcap
추정된 가비지 메트릭의 형태는 이력 가비지 메트릭(historical garbage metric)이다. 이력 가비지 수집 정보는 주어진 노드에 대한 가비지 메트릭을 추정하는 데 사용될 수 있다. 이러한 이력 가비지 수집 정보의 비제한적 예로는 다음이 있다:
A)
주어진 노드에서 가비지 수집 동작의 이전 실행에서 낡은 키-값 쌍의 일부(fraction)에 대한 단순, 누적 또는 가중 이동 평균, 또는
B)
주어진 노드와 동일한 KVDB 레벨에서의 임의의 노드에서 가비지 수집 동작의 이전 실행에서 낡은 키-값 쌍의 일부에 대한 단순, 누적 또는 가중 이동 평균.
상기의 예에서 가비지 수집 동작의 비제한적 예를 들면, 키 압축, 키-값 압축, 스필 압축, 또는 호이스트 압축이 있다. 노드가 주어지면, 이력 가비지 수집 정보 및 kvset 통계는 노드에 대한 추정된 가비지 메트릭을 생성하기 위한 정보를 제공한다.
하나의 예를 들면, 이력 가비지 메트릭을 생성하기 위해 NodeSMA(Node Simple Moving Average)이 수행될 수 있다. 여기서, NSMA(E) = 주어진 노드에서 가비지 수집 동작의 가장 최신 E번의 실행 시 낡은 키-값 쌍의 일부의 평균으로 두며, E는 구성 가능하다. 이 예에서, 주어진 노드에 대한 NodeSMA 추정 가비지 메트릭은 다음을 포함할 수 있다:
A)
NKVcnt * 노드 내 낡은 키-값 쌍의 NSMA(E) 카운트
B)
NKVcap * 노드 내 낡은 키-값 데이터의 NSMA(E) 바이트
C)
NKVcnt - 노드 내 유효 키-값 쌍의 (NKVcnt * NSMA(E)) 카운트, 또는
D)
NKVcap - 노드 내 유효한 키-값 데이터의 (NKVcap * NSMA(E)) 바이트.
이력 가비지 메트릭의 또 다른 변형이 LevelSMA(Level Simple Moving Average) 가비지 메트릭을 포함한다. 이 예시에서, LSMA(E) = 주어진 노드와 동일한 KVDB 레벨에서 임의의 노드에서 가비지 수집 동작의 최신 E번의 실행에서 낡은 키-값 쌍의 일부의 평균으로 두며, E는 구성 가능하다. 이 예에서, 주어진 노드에 대한 LevelSMA 추정 가비지 메트릭은 다음을 포함 할 수 있다:
A)
NKVcnt * 노드 내 낡은 키-값 쌍의 LSMA(E) 카운트
B)
NKVcap * 노드 내 낡은 키-값 데이터의 LSMA(E) 바이트
C)
NKVcnt - 노드 내 유효 키-값 쌍의 (NKVcnt * LSMA(E)) 카운트, 또는
D)
NKVcap - 노드 내 유효한 키-값 데이터의 (NKVcap * LSMA(E)) 바이트.
이력 가비지 메트릭의 상기 예는 포괄적인 것이 아니며, 오히려 수집되는 메트릭의 유형을 예시로 나타낸다. 그 밖의 다른 이력 가비지 메트릭의 예는 NodeCMA(Node Cumulative Moving Average) 가비지 메트릭, NodeWMA(Node Weighted Moving Average) 가비지 메트릭, LevelCMA(Level Cumulative Moving Average) 가비지 메트릭, 또는 LevelWMA(Level Weighted Moving Average) 가비지 메트릭을 포함할 수 있다.
키에 대한 kvset에 블룸 필터를 유지하는 KVDB에 추정된 가용 가비지 메트릭의 또 다른 변형은 블룸 필터 가비지 메트릭이다. 앞서 언급된 바와 같이, 주어진 kvset은 kvset이 주어진 키를 포함할 수 있는지 여부를 효율적으로 결정하기 위한 블룸 필터를 포함할 수 있으며, 여기서 kvset 내 각각의 키에 대해 kvset에 대한 블룸 필터에 하나씩의 엔트리가 존재한다. 이들 블룸 필터는 주어진 노드에 대한 가비지 메트릭을 추정하는 데 사용될 수 있다. 기법 - 가령, Papapetrou, Odysseas외의 Cardinality Estimation and Dynamic Length Adaptation for Bloom Filters, Distributed and Parallel Databases, 201에서 기재된 것 - 이 노드를 포함하는 kvset 내 블룸 필터에 의해 나타내어지는 키의 세트의 교집합의 카디널리티(cardinality)를 근사하는 데 사용될 수 있다. 이 근사된 값이 블룸 - 노드의 추정된 카디널리티라고 지칭된다.
노드가 주어지면, 노드의 블룸-추정된 카디널리티 및 kvset 통계는 노드에 대한 추정된 가비지 메트릭이 여러 방식으로 생성 될 수 있게 한다. 블룸 필터 가비지 메트릭의 예로는 BloomDelta 가비지 메트릭을 포함한다. NBEC = 주어진 노드에서 T개의 kvset의 블룸 추정 카디널리티라고 두고, 주어진 노드에서 낡은 키-값 쌍의 일부의 추정치인 Fobs = (NKVcnt - NBEC)/NKVcnt라고 둘 수 있다. 이 예에서, 주어진 노드에 대한 BloomDelta 가비지 메트릭은 다음을 포함할 수 있다:
A)
NKVcnt - 노드 내 낡은 키-값 쌍의 NBEC 카운트
B)
NKVcap * 노드 내 낡은 키-값 데이터의 Fobs 바이트
C)
노드 내 유효 키-값 쌍의 NBEC 카운트, 또는
D)
NKVcap - 노드 내 유효한 키-값 데이터의 (NKVcap * Fobs) 바이트.
둘 이상의 이러한 필터로 표현되는 키의 세트의 교집합의 카디널리티를 근사화할 수 있는, 블룸 필터와 다른 확률적 필터가 추정된 가비지 메트릭에서 블룸 필터를 대체하여 사용될 수 있다.
계산 및 추정된 가비지 메트릭이 조합되어, 또 다른 형태의 추정된 가비지 메트릭의 포함으로 인한 하이브리드 가비지 메트릭, 즉, 또 다른 형태의 추정된 가비지 메트릭을 생성할 수 있다. 예를 들어, T개의 kvset을 포함하는 노드가 주어지면, 키 압축 가비지 메트릭이 이들 kvset의 W에 대해 이용 가능하고 W<T인 경우, 노드에 대한 하이브리드 가비지 메트릭은 다음과 같이 생성될 수 있다. 키 압축 가비지 메트릭이 가용 노드에서 W개의 kvset에 대해 다음을 가정한다:
A)
KGMOcnt = W개의 kvset 내 낡은 키-값 쌍의 카운트의 추정치 + W개의 kvset 각각으로부터 비참조 값의 카운트의 합;
B)
KGMOcap = W개의 kvset에서 낡은 키-값 데이터의 바이트의 추정치 + W개의 kvset 각각으로부터의 비참조 값의 바이트의 합
C)
KGMVcnt = W개의 kvset에서 유효한 키-값 쌍의 카운트의 추정치, 및
D)
KGMVcap = W개의 kvset에서 유효한 키-값 데이터의 바이트의 추정치.
추정된 가비지 메트릭이 W개의 kvset가 노드 내 유일한 kvset이라는 가정 하에 앞서 언급된 기법 중 하나를 사용하여 생성될 수 있다.
키 압축 가비지 메트릭이 이용 가능하지 않은 노드 내 (T - W)개의 kvset에 대해, 다음을 가정한다:
A)
EGMOcnt = (T-W)개의 kvset에서 낡은 (가비지) 키-값 쌍의 카운트의 추정치;
B)
EGMOcap = (T-W)개의 kvset에서 낡은 (가비지) 키-값 데이터의 바이트의 추정치
C)
EGMVcnt = (T-W)개의 kvset에서 유효한 키-값 쌍의 카운트의 추정치, 및
D)
EGMVcap = (T-W)개의 kvset에서 유효한 키-값 데이터의 바이트의 추정치.
이들 추정된 가비지 메트릭이 (T-W)개의 kvset가 노드 내 유일한 kvset이라는 가정 하에 앞서 언급된 기법 중 하나를 사용하여 생성될 수 있다. 이들 파라미터가 주어지면, 주어진 노드에 대해 하이브리드 가비지가 다음을 포함할 수 있다:
A)
KGMOcnt + EGMOcnt 노드 내 낡은 키-값 쌍의 카운트
B)
KGMOcap + EGMOcap 노드 내 낡은 키-값 데이터의 바이트
C)
KGMVcnt + EGMVcnt 노드 내 유효 키-값 쌍의 카운트, 또는
D)
KGMVcap + EGMVcap 노드 내 유효한 키-값 데이터의 바이트.
다음 레벨이 KVDB의 서로소인 KVS 트리를 나타내기 때문에, 앞서 기재된 가비지 메트릭을 계산 또는 추정하는 접근법은 일반적으로 KVDB의 모든 다음 레벨 노드에 적용될 수 있다. 기본 레벨 노드에 대해 이들 기법은 이종 kvset에서 나타나는 모든 KVS 트리에 적용하여 - 가령, 연관된 KVS 트리와 무관하게 kvset의 모든 키-값 쌍 또는 툼스톤를 고려함으로써, 작동한다.
가비지 메트릭은 가비지 수집 동작의 오버헤드를 정당화하기에 충분한 양의 가비지를 갖는 트리-레벨 또는 노드로 가비지 수집 동작을 우선순위화하는 것을 가능하게 한다. 이러한 방식으로 가비지 수집 동작의 우선순위를 지정하면 효율성이 향상되고 연관된 쓰기-증폭이 감소된다. 또한, 트리에서 유효한 키-값 쌍의 수와 낡은 키-값 쌍의 수, 및 각각의 카테고리에 의해 소비되는 저장 용량을 추정하는 것이 트리에 대한 용량 이용율을 보고하는 데 유용하다.
도 17은 하나의 실시예에 따른 KVS 트리에서의 유지관리를 수행하기 위한 방법(1700)의 예를 도시한다. 방법(1700)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(1705)에서, 노드에 대한 kvset이 생성된다. Kvset 생성의 일부로서, kvset에 대한 kvset 메트릭의 세트가 계산된다. 예를 들어, kvset 메트릭의 세트는 kvset 내 키-값 쌍의 수를 포함한다. 하나의 예에서, kvset 메트릭의 세트는 kvset 내 툼스톤의 수를 포함한다. 예를 들어, kvset 메트릭 세트에는 키-값 쌍 및 툼스톤에 대한 모든 키 엔트리를 kvset에 저장하기 위한 저장 용량을 포함한다. 예를 들어, kvset 메트릭 세트는 kvset 내 키-값 쌍의 모든 값에 대한 저장 용량을 포함한다.
예를 들어, kvset 메트릭의 세트는 kvset에 키에 대한 키 크기 통계를 포함한다. 하나의 예에서, 키 크기 통계는 최대, 최소, 중앙값 또는 평균 중 적어도 하나를 포함한다. 예를 들어, kvset 메트릭의 세트는 kvset 내 키에 대한 값 크기 통계를 포함한다. 하나의 예에서, 값 크기 통계는 최대, 최소, 중앙값 또는 평균 중 적어도 하나를 포함한다.
예를 들어, kvset 메트릭의 세트는 kvset 내 키-값 쌍에 대한 최소 또는 최대 TTL(Time-to-live) 값을 포함한다. 인제스트 동작이 키-값 쌍이 유효할 주기를 특정할 때 TTL이 유용할 수 있다. 따라서 키-값 쌍이 만료된 후 압축 동작을 통한 교정(reclamation)에 대한 주요 타깃이다.
하나의 예에서, kvset은 압축 동작에 응답하여 생성된다. 여기서, 압축 동작은 키 압축, 키-값 압축, 스필 압축 또는 호이스트 압축 중 적어도 하나이다. 하나의 예에서, 압축 동작은 키 압축이다. 이 예에서, kvset 메트릭 세트는 키 압축의 결과로서 kvset 내 비참조 값의 메트릭을 포함할 수 있다. 하나의 예에서, 비참조 값 메트릭은 비참조 값의 카운트 또는 비참조 값에 의해 소비되는 저장 용량 중 적어도 하나를 포함한다. 본 명세서에서 사용될 때, 소비되는 저장 용량은 경우에 따라 키 엔트리 또는 값을 보유하기 위해 기저 저장 장치에 의해 사용되는 비트, 바이트, 블록 등으로 측정된다.
하나의 예에서, kvset이 압축 동작에 의해 생성된 경우, kvset 메트릭 세트는 kvset 내 낡은 키-값 쌍의 추정치를 포함할 수 있다. 본 명세서에서 사용될 때, 추정은 압축이 압축의 대상이 되는 병합 세트에서 낡은(가령, 대체된) 키-값 쌍에 대한 통찰만 얻고 따라서 외견상 현재 키-값 쌍이 압축의 일부가 아닌 더 새로운 kvset 내 엔트리에 의해 낡은 것이 되는지 여부에 대해 알지 않기 때문에 추정이다. 예를 들어, 낡은 키-값 쌍의 추정치는 kvset에 포함되지 않았던 사전-압축 kvset로부터의 키 엔트리의 수를 합산함으로써 계산될 수 있다. 따라서, 압축의 일부로서, 병합 세트와 관련하여 낡은 쌍들의 수가 알려질 것이고 생성된 kvset에서 낡은 데이터의 추정으로서 사용될 수 있다. 유사하게, kvset 내 유효한 키-값 쌍의 추정치는 kvset에 포함되었고 kvset 메트릭의 세트의 일부인 사전-압축 kvset로부터의 키 엔트리의 수를 합산함으로써 계산될 수 있다. 예를 들어, kvset 메트릭의 세트는 kvset 내 낡은 키-값 쌍의 추정 저장 크기를 포함한다. 예를 들어, kvset 내 유효한 키-값 쌍의 추정된 저장 크기를 포함하고, 유효 키-값 쌍의 추정된 저장 크기가 kvset에 포함된 사전-압축 kvset으로부터의 키 엔트리 및 대응하는 값의 저장 크기를 합산함으로써 계산된다. 키-압축이 수행되지 않으면 추정된 낡은 값이 압축에서 제거될 것이기 때문에 이들 추정은 이력 메트릭에 대해 사용될 수 있다. 그러나 노드가 압축에서 규칙적인(가령, 이력) 성능을 갖는 경우, 이 성능이 미래에도 계속될 것으로 가정될 수 있다.
예를 들어, kvset 메트릭의 세트는 kvset(가령, 주 키 블록 헤더)에 저장된다. 예를 들어, kvset 메트릭의 세트는 kvset가 아닌 노드에 저장된다. 하나의 예에서, kvset 메트릭의 서브세트는 kvset에 저장되고 kvset 메트릭의 제2 서브세트는 노드에 저장된다.
동작(1710)에서, kvset이 노드에 추가된다. 일반적으로 노드에 추가되면 kvset도 (가령, 온-디스크 저장장치에) 써진다.
동작(1715)에서, 노드는 kvset 메트릭의 세트 내 메트릭에 기초하여 압축 동작을 위해 선택된다. 따라서, kvset 메트릭 또는 이하에서 설명될 노드 메트릭 또는 둘 모두가 가비지 콜렉터 또는 유사한 유지 보수 프로세스에 의한 결정에 기여할 수 있다. 하나의 예에서, 압축 동작을 위한 노드를 선택하는 것은 복수의 노드에 대한 kvset 메트릭의 세트를 수집하는 것, kvset 메트릭의 세트에 기초하여 복수의 노드를 정렬하는 것, 및 정렬로부터의 정렬 순서에 기초하여 복수의 노드 중 서브세트를 선택하는 것을 포함한다. 이 예에서, 동작(1720)은 노드 상에서 압축 동작을 수행하는 것이 복수의 노드의 서브세트(상기 노드 포함)의 각각의 노드에 대하여 압축 동작을 수행하는 것을 포함하도록 구현될 수 있다. 예를 들어, 복수의 노드 중 서브세트의 카디널리티는 성능 값에 의해 설정된다. 하나의 예에서, 성능 값은 복원된 공간에 의해 측정될 때 압축을 수행하는 효율이다. 이는 종종 임계값으로 구현 될 수 있다. 하나의 예를 들면, 다수의 파라미터, 가령, 기저 저장 디바이스 상에 남은 미사용 저장 용량 및 압축 동작에서 재생될 용량의 추정치를 수락하는 임계 함수가 사용되어, 주어진 압축 동작을 수행할지 여부를 결정할 수 있다.
동작(1720)에서, 압축 동작이 노드에서 수행된다. 예를 들어, 압축 동작의 유형(예를 들어, 키 압축 키-값 압축, 스필 압축 또는 호이스트 압축)이 kvset 메트릭의 세트 내 메트릭에 기초하여 선택된다.
방법(1700)의 동작은 kvset을 노드에 추가하는 것에 응답하여 노드 메트릭을 수정하는 것을 포함하도록 확장될 수 있다. 하나의 예에서, 노드 메트릭은 노드를 포함하는 노드 그룹에서 수행된 이전 압축의 대상인 kvset 내 추정된 낡은 키-값 쌍의 일부의 값을 포함한다. 예를 들어, 값은 단순 평균이다. 예를 들어, 값은 이동 평균이다. 예에서, 값은 가중 평균이다. 예를 들어, 값은 노드에 대한 지정된 횟수의 가장 최근의 이전 압축의 대상인 kvset 내 추정된 낡은 키-값 쌍의 일부의 평균이다. 예를 들어, 값은 노드의 트리-레벨에서 모든 노드에 대해 지정 횟수의 가장 최신의 압축의 대상인 kvsets 내 추정된 낡은 키-값 쌍의 일부의 평균이다.
예를 들어, 노드 그룹은 노드만 포함한다. 예를 들어, 노드 그룹은 노드의 트리-레벨에 있는 모든 노드를 포함한다. 하나의 예에서, 노드 메트릭은 압축 동작으로 인한 kvset 메트릭의 세트와 노드에서 수행된 압축 동작으로부터의 이전 kvset 메트릭의 유사한 메트릭의 합산을 포함한다.
하나의 예에서, 노드 메트릭은 kvset 및 노드의 상이한 kvset에서 동일한 키의 추정된 수를 포함한다. 하나의 예에서, 키의 추정된 수는 kvset로부터 제1 키 블룸 필터를 획득하고, 상이한 kvset으로부터 제2 키 블룸 필터를 획득하며, 제1 키 블룸 필터와 제2 키 블룸 필터를 교차시켜 NBEC(node bloom filter estimated cardinality)를 생성할 수 있다. 이 예가 두 개의 kvset 간에 써지지만(예를 들어, 두 개의 kvset로부터 단 두 개의 블룸 필터의 교집합) 임의의 개수의 kvset 블룸 필터가 교집합의 일부인 블룸 필터를 갖는 모든 kvset에 공통인 키의 수의 추정치를 나타내는 NBEC에 도달하기 위해 교차될 수 있다.
하나의 예에서, 노드 메트릭은 NKVcnt 값에서 NBEC를 빼는 것을 포함하여 노드 내 낡은 키-값 쌍의 수를 추정할 수 있다. 여기서, NKVcnt 값은 블룸 필터가 교차되어 NBEC를 생성할 수 있는 노드의 각각의 kvset에서 키 값 쌍의 총 카운트이다. 하나의 예에서, 노드 메트릭은 NKVcap 값에 Fobs 값을 곱하는 것을 포함한다. 여기서, NKVcap 값은 블룸 필터가 교차되어 NBEC를 생성할 수 있는 노드의 각각의 kvset 내 키 및 값에 의해 사용되는 총 저장 용량이며, Fobs 값은 NKVcnt 값에서 NBEC를 빼고 NKVcnt에 의해 나눈 결과이며, 이때 NKVcnt 값은 블룸 필터가 교차되어 NBEC를 생성할 수 있는 노드의 각각의 kvset 내 키 값 상의 총 카운트이다.
예를 들어, 노드 메트릭은 노드에 저장된다. 여기서 노드 메트릭은 그 밖의 다른 노드로부터의 노드 메트릭과 함께 저장된다. 예를 들어, 노드 메트릭은 트리-레벨에 저장되며, 트리-레벨은 KVDB 내 KVS 트리의 하나의 레벨의 모든 노드에 공통이다.
KVDB 성능을 개선하기 위해 앞서 기재된 가비지 수집 메트릭 및 이들의 사용은 특정 상황에서 KVDB 또는 그 내부의 요소(가령, 툼스톤)의 바닐라 동작(vanilla operation)을 수정함으로써 여러 가지 방법으로 도움이 될 수 있다. 예시는 툼스톤 가속, 업데이트 툼스톤, 프리픽스 툼스톤 또는 불변 데이터 KVDB가 있다.
툼스톤는 KVS 트리 내 삭제된 키-값을 나타낸다. 툼스톤이 KVS 트리의 리프(leaf)에서 압축되고, 압축이 리프 내 가장 오래된 kvset을 포함할 경우, 이는 실제로 제거되지만, 그렇지 않은 경우, 키에 대한 낡을 가능성이 있는 값이 검색에서 반환되지 못하도록 유지된다. 자식 노드를 갖는 노드 상의 병합 세트 내 툼스톤을 도출하는 키 압축 또는 키-값 압축에서, 툼스톤 가속은 스필 압축을 위해 사용된 키 분배 방법 후 이들 자식 노드 중 일부 또는 모두 내 하나 이상의 새 kvset에 낡지 않은 툼스톤을 쓰는 것을 포함한다.
키 압축 또는 키-값 압축 동작에 대한 병합 세트가 병합 세트를 포함하는 노드에서 가장 오래된 kvset을 포함하는 경우, 가속된 툼스톤(존재하는 경우)이 상기 노드에서의 압축 동작에 의해 생성된 새 kvset에 포함될 필요가 없다. 그렇지 않고, 키 압축 또는 키-값 압축 동작에 대한 병합 세트가 병합 세트를 포함하는 노드에 가장 오래된 kvset을 포함하지 않는 경우, 가속된 툼스톤(존재하는 경우)도 상기 노드에서의 압축 동작에 의해 생성된 새 kvset에 포함된다. KVS 트리의 더 오래된 영역으로 가속된 툼스톤를 분배하는 것이, 본래 툼스톤이 자식 노드로 푸시(push)되는 것을 기다리지 않고 자식 노드에서 키-값 쌍을 제거 할 수 있게 함으로써, 가비지 수집을 촉진시킨다.
키 압축 또는 키-값 압축 동작은 툼스톤 가속을 수행할지 여부를 결정하기 위해 특정된 또는 계산된 기준을 적용할 수 있다. 이러한 툼스톤 가속 기준의 비제한적 예로는 병합 세트 내 낡지 않은 툼스톤의 수 및 알려졌을 수 있거나 추정치일 수 있는 병합 세트 내 툼스톤에 의해 논리적으로 삭제되는 키-값 데이터의 양(가령, 바이트)가 있다.
업데이트 툼스톤은 본래 인제스트 값이 툼스톤이 아니지만 가속된 툼스톤과 유사하게 작동한다. 기본적으로 새 값이 KVS 트리에 추가될 때 해당 키에 대한 모든 오래된 값이 가비지 수집될 수 있다. 가속된 툼스톤과 유사하게, 툼스톤을 트리를 따라 푸시하는 것에 의해, 낡은 값을 제거하기 위한 이들 자식 노드 상에서의 압축이 가능할 것이다.
예를 들어 KVDB에서, 인제스트 동작은 기본-레벨 노드에 새 kvset을 추가하고 이 새 kvset 내 키 K를 갖는 TID 인식 키-값 쌍이 이전 인제스트 동작에 포함됐던 키 k를 갖는 키-값 쌍을 대체하는 업데이트 키-값 쌍이라는 플래그 또는 지시자를 포함한다. 이 지시자가 정확하다는 것은 기대이지 요건이 아니다. 키 K를 갖는 업데이트 키-값 쌍이 인제스트 동작에 의해 포함하는 경우, 그리고 루트 노드가 자식 노드를 갖는 경우, 인제스트 동작은, 스필 압축을 위해 사용되는 키 분배 방법 후 키 K에 대한 키 툼스톤, 업데이트 툼스톤을 루트 노드의 자식 노드 내 새 kvset에 쓸 수 있다.
예를 들어, 대안으로, 루트 노드 내 병합 세트에 대한 키 압축 또는 키-값 압축 동작은, 키 K를 갖는 업데이트 키-값 쌍을 처리하는 것에 응답하여, KVS 트리에서 스필 압축에 대해 사용되는 키 분배 방법 후, 다시 업데이트 툼스톤으로 일컬어지는, 키 K에 대한 키 툼스톤을 루트 노드의 자식 노드 내 새 kvset에 쓸 수 있다. 예를 들어, 키 K를 갖는 주어진 업데이트 키-값 쌍에 대해, 많아야 하나의 대응하는 업데이트 툼스톤이 키 K에 대해 써진다.
KVS 트리 프리픽스 동작이 이하에서 언급되는 동안, 개념이 툼스톤에서도 사용될 수 있다. 프리픽스 동작에서, 키의 일부인 프리픽스(prefix)가 매칭에 사용된다. 일반적으로, 키의 프리픽스 부분은 스필 값을 파생하기 위해 그 전체가 사용되지만, 프리픽스 경로가 소비된 후 모든 자식 노드로 팬 아웃되는 더 깊은 트리 결정과 함께 더 작은 부분이 사용될 수 있다. 프리픽스 툼스톤은 복수의 값과 매칭되는 프리픽스의 파워를 이용해 단일 키 항목이 여러 키-값 쌍의 삭제를 나타내도록 할 수 있다.
하나의 예에서, 스필 압축은 키의 제1 서브 키의 스필 값을 기초로 하는 키 분배 방법을 사용하며, 제1 서브 키는 키 프리픽스이다. 프리픽스 툼스톤은 키 프리픽스를 포함하는 논리적 레코드이며 프리픽스로 시작하는 모든 키 및 이들의 연관 값이, 존재하는 경우, 특정 시점에서 논리적으로 삭제되었음을 나타낸다. 프리픽스 툼스톤은 둘 이상의 유효 키-값 쌍을 논리적으로 삭제할 수 있고, 반면에 키 툼스톤은 정확히 하나의 유효 키-값 상을 논리적으로 삭제할 수 있다는 점을 제외하고, 프리픽스 툼스톤은 키 툼스톤과 동일한 목적을 수행한다. 이 예에서 스필 압축은 프리픽스에 의해 특정된 제1 서브 키 값을 사용하여 프리픽스 툼스톤에 대한 스필 값을 생성하기 때문에, 모든 키-값 쌍, 키 툼스톤, 또는 동등한 제1 서브 키 값을 갖는 프리픽스 툼스톤이 동등한 스필 값을 갖기 때문에, KVDB의 레벨을 통과하는 동일한 경로를 취할 것이다. 앞서 언급된 바와 같이, TID는 이종 kvset에서 툼스톤 적용을 구별하는 역할을 한다.
하나의 예에서, 툼스톤 가속은 프리픽스 툼스톤 및 키 툼스톤에 적용될 수 있다. 프리픽스 툼스톤은 후속 가비지 수집 동작에서 많은 수의 낡은 키-값 쌍 또는 툼스톤의 물리적 제거를 야기할 수 있기 때문에, 프리픽스 툼스톤은 툼스톤 가속 기준을 적용함에 있어 키 툼스톤과 다르게 취급될 수 있다.
앞서 논의된 툼스톤 가속 기법은 더 많은 수의 kvset이 생성되게 함으로써 비효율적일 수 있다. 데이터를 쓰는 애플리케이션이 이전에 써진 데이터의 크기를 인식할 수 있기 때문에, 툼스톤은 애플리케이션으로부터 대체되는 데이터의 크기를 포함할 수 있다. 이 정보는 시스템에 의해 사용되어 앞서 언급된 툼스톤 가속을 수행(또는 업데이트 툼스톤을 생성)할지 여부를 결정할 수 있다.
일부 데이터는 불변일 수 있다. 불변 키-값 데이터의 일부 예로는 시계열 데이터, 로그 데이터, 센서 데이터, 머신-생성 데이터 및 데이터베이스 추출, 변환 및 로드(ETL) 프로세스의 출력 등이 있다. 예를 들어, KVDB 또는 그 안의 KVS 트리는 불변 키-값 데이터를 저장하도록 구성될 수 있다. 이러한 구성에서 필수는 아니지만 인제스트 동작에 의해 추가된 kvset이 툼스톤을 포함되지 않는다.
예를 들어, KVDB 또는 그 안에 포함 된 KVS 트리는 KVDB를 포함하는 저장 매체의 용량에 의해서만 제한되는 불변 데이터의 양을 저장하도록 구성될 수 있다. 이러한 구성에서, 실행되는 유일한 가비지 수집 동작이 키 압축이다. 여기서, 키 압축은 기본 레벨에서의 kvset의 수를 줄임으로써 키 검색 효율을 높이기 위해 수행된다. 스필 압축이 없으면 기본 레벨 노드가 KVDB에서 유일한 노드가 될 것이다. 예를 들어, 압축 기준은 기본 레벨 노드에서의 kvset의 수, 또는 키 검색 시간 통계, 가령, 검색에 걸리는 최소, 최대, 평균 및 평균 검색 시간을 포함할 수 있다. 이들 통계는 특정 이벤트에서, 가령, 키 압축 후, 인제스트 동작 후, 구성된 시간 간격 만료 시, 또는 구성된 키 검색 횟수 수행 후에 재설정될 수 있다. 하나의 예에서, 키 압축을 위한 병합 세트는 루트 노드에서 kvset의 일부 또는 전부를 포함할 수 있다.
하나의 예에서, KVDB 또는 그 안에 포함 된 KVS 트리는 KVDB 또는 KVS 트리로부터 키-값 쌍을 FIFO( first-in first-out) 방식으로 제거함으로써 시행될 수 있는 보유 기준( retention criterion)에 의해 제한되는 불변 데이터의 양을 저장하도록 구성될 수 있다. 이러한 보유 기준의 예로는: KVDB 또는 KVS 트리 내 키-값 쌍의 최대 카운트, KVDB 또는 KVS 트리 내 키-값 데이터의 최대 바이트, 또는 KVDB 또는 KVS 트리 내 키-값 쌍의 최대 연령이 있다.
이러한 구성에서, 실행되는 유일한 가비지 수집 동작이 키 압축이다. 여기서 키 압축은, kvset 수를 줄임으로써 키 검색 효율성을 높이고 FIFO 방식으로 키-값 쌍의 제거를 촉진시켜 보유 기준을 적용하도록 수행된다. 하나의 예에서, 압축 기준은 키 압축에 대한 병합 세트를 포함하는 둘 이상의 연속적인 kvset이 보유 증분이라고 하는 보유 기준의 구성된 일부를 충족 할 때마다 키 압축이 실행되도록 특정할 수 있다. 다음은 보유 요건의 일부 예시이다:
A)
보유 기준이 W 키-값 쌍이고 보유 증분이 0.10 * W 키-값 쌍인 경우, 둘 이상의 연속된 kvset(병합 세트)가 조합된 0.10 * 키-값 쌍의 W 카운트를 갖는 경우 키 압축이 실행,
B)
보유 기준이 키-값 데이터의 X 바이트이고 보유 증분이 0.20 * 키-값 데이터의 X 바이트인 경우, 둘 이상의 연속된 kvset(병합 세트)가 조합된 0.20 * 키-값 데이터의 X 바이트를 갖는 경우, 키 압축이 실행, 또는
C)
보유 기준이 키-값 데이터의 Y 일(day)이고 보유 증분이 0.15 * 키-값 데이터의 Y 일인 경우, 둘 이상의 연속된 kvset(병합 세트)가 조합된 0.15 * Y일의 키-값 데이터를 갖는 경우, 키 압축이 실행.
키 압축에 대한 병합 세트가 구성된 보유 증분을 정확하게 충족하도록 요구하는 것이 비실용적인 경우가 있을 수 있다. 따라서, 하나의 예에서, 보유 증분의 근사치가 사용될 수 있다.
구성된 보유 증분보다 각각 아래에 있는 kvset의 인제스트 동작의 시퀀스가 주어지면, 앞서 설명된 바와 같이, 키 압축 동작을 실행하는 것이 각각 보유 증분을 충족하거나 이에 근사되는 kvset가 노드에 존재할 수 있다. 이 결과에 대한 예외가 조합이 부유 증분 미만일 수 있는 가장 최신 kvset일 수 있다. 이러한 가능한 결과에도 불구하고, 보유 기준이 적어도 보유 증분만큼 초과될 때마다 KVDB 또는 KVS 트리 내 가장 오래된 kvset이 삭제될 수 있다. 예를 들어 보유 기준이 W개의 키-값 쌍이고, 구성된 보유 증분이 0.10 * W개의 키-값 쌍인 경우, 단일 노드의 kvset는 각각 약 0.10 * W개의 키-값 쌍을 가질 것이며, 이때 조합된 가장 최신 kvset가 0.10 * W 키-값 쌍보다 적을 수 있다는 예외가 가능하다. 결과적으로, KVDB 또는 KVS 트리가 W개의 키-값 쌍을 적어도 0.10 * W개의 키-값 쌍만큼 초과할 때마다 가장 오래된 kvset이 삭제될 수 있다.
툼스톤 가속, 업데이트 가속, 또는 프리픽스 툼스톤의 가비지 수집 촉진자(garbage collection facilitator)는 KVDB 또는 KVS 트리가 아닌 다른 키-값 저장소에 적용될 수 있다. 예를 들어, 툼스톤 가속 또는 업데이트 툼스톤은 키-값 데이터를 이가 읽히는 동일한 트리-레벨에 쓰는 하나 이상의 가비지 수집 동작을 가지며, KVDB 또는 KVS 트리에서의 키 압축 또는 키-값 압축과 유사하게 동작하는 LSM 트리 변형에 적용될 수 있다. 업데이트 툼스톤은 루트 노드의 자식 노드로 인제스트하는 것을 가능하게 하는 LSM 트리 변형에 적용될 수도 있다. 또 다른 예에서, 프리픽스 툼스톤은 레벨 당 단 하나의 노드(공통)를 갖거나 키의 일부분, 가령, 서브 키를 기초로 자식 노드를 선택하기 위한 키 분배 방법을 구현하는 LSM 트리 변형에서 사용될 수 있다. 또 다른 예에서, 툼스톤 삭제 크기가 툼스톤 가속을 이용하는 LSM 트리 변형에서 적용될 수 있다. 또한, 불변 키-값 데이터에 대한 가비지 수집을 최적화하는 기법이 KVDB 또는 KVS 트리의 키 압축과 유사하게 키-값 데이터의 값을 읽거나 쓰지 않는 가비지 수집 동작을 갖는 LSM 트리 변형에 적용될 수 있다.
이들 가비지 수집 촉진자를 구현하는 것이 KVDB, KVS 트리, 또는 그 밖의 다른 데이터 구조에서 가비지 수집의 효율성이 향상시킨다. 예를 들어, 툼스톤 가속은, 그 밖의 다른 방식으로 키 압축, 키-값 압축, 또는 이와 유사한 작업을 적용할 때 발생하는 것보다 더 빨리, 툼스톤이 트리의 하위 레벨로 써질 수 있게 하며, 이로써, 트리의 모든 레벨에서 더 빠르게 가비지를 제거할 수 있다. 키 압축 또는 이와 유사한 동작과 함께 사용되는 툼스톤 가속은 스필 압축에서 발생하는 것보다 쓰기 증폭이 훨씬 적은 이러한 결과를 달성한다. 또 다른 예에서, 프리픽스 툼스톤에 의해, 단일 툼스톤 레코드가 많은 수의 관련 키-값 쌍을 논리적으로 삭제하고, 툼스톤 업데이트는 툼스톤 가속의 이점을 업데이트 키-값 쌍으로 가져오며, 툼스톤 삭제 크기는, 툼스톤 가속 기준을 평가할 때 정확도를 개선하며, 불변 키-값 데이터에 대한 가비지 수집을 최적화하기 위한 기법은 키-값 데이터 내 값에 대한 일(1)의 쓰기-증폭을 도출한다.
도 11 도 18은 하나의 실시예에 따르는, 키 검색을 도시하는 블록도이다. 루트 노드 내 최신 kvset에서 시작하여 키가 발견되거나 리프 노드에서 가장 오래된 kvset가 키를 갖지 않을 때까지 더 오래된 kvset으로 점진적으로 이동함으로써 검색이 진행된다. 부모-자식 키 매핑의 결정적 특성으로 인해, 단 하나의 리프만 검색되며 해당 리프에서 가장 오래된 kvset는 가장 오래된 키 엔트리를 가질 것이다. 따라서 도시된 검색 경로를 따르고 키가 발견되지 않는 경우, 키는 KVDB에 없는 것이다. KVDB가 이종 kvset(가령, 노드(0,0))가 있는 기본 레벨(가령, 서브-레벨이 있거나 없는 메모리 내에서 또는 블록 매체 상에서)을 포함하기 때문에 TID 또는 그 밖의 다른 KVS 트리 식별자가 이종 kvset를 검색하고 기본 레벨서 해당 트리의 특정 다음 레벨로 전환하기 위해 키와 함께 사용된다.
키에 대한 가장 최신 키 엔트리가 발견되면 검색이 중지된다. 따라서 검색 경로는 가장 최신의 것으로부터 가장 오래된 것으로 이동하며 키에 대한 키 엔트리가 찾아지자마자 중지된다. 이 거동에 의해, 낡은 키-값 쌍이 KVDB로부터 즉시 제거될 필요가 없음으로써, kvset의 불변성이 유지될 수 있다. 대신, 더 새로운 값, 또는 삭제를 지시하는 툼스톤이 더 새로운 kvset에 배치되고 먼저 발견될 것이므로, 더 오래된 키-쌍 버전이 KVDB에 여전이 상주하는 것에 무관하게 질의에 정확한 응답이 도출될 것이다.
하나의 예에서, 키 K에 대한 검색은 현재 노드를 기본 레벨의 제1 노드로 설정함으로써 수행될 수 있다. 키 K를 갖는 키-값 쌍 또는 툼스톤이 현재 노드에서 발견되면 검색이 완료되고 연관된 값 또는 "키를 찾을 수 없음"이 각각 결과로 반환된다. 키 K를 찾을 수 없는 경우, 현재 노드는 키 K 및 스필 압축에 사용된 키 분배 방법에 의해 결정된 대로 노드의 자식으로 설정된다. 앞서 언급한 바와 같이, 이종 kvset에서 키를 비교할 때, 키와 함께 KVS 트리 식별자가 사용되어, 키가 발견되는지 여부를 결정할 수 있다. 따라서 KVS 트리 T1에서 키 'A'를 검색하면 KVDB에서 키 'A'가 있는 유일한 엔트리가 KVS 트리 T2에 있는 경우 "키를 찾을 수 없음"이 반환된다. 다음 레벨이 단일 KVS 트리에 대한 동종 kvset를 갖기 때문에 KVS 트리 홀로와 동일한 방식으로 동작하는, 키 홀로 상의 매칭이 충분하다.
이러한 자식 노드가 존재하지 않는 경우, 검색이 완료되고 "키를 찾을 수 없음"의 지시자가 결과이다. 그렇지 않으면 현재 노드의 kvset 내 키 K에 대한 검색이 수행되고 프로세스가 반복된다. 개념적으로, KVS 트리 내 키 K에 대한 검색은 키 K를 갖는 모든 키-값 쌍 또는 툼스톤이 스필 압축의 결과로서 취하는 KVS 트리를 통해 동일한 경로를 따른다.
TID 및 키를 기반으로 하는 부모 노드와 자식 노드 간 결정적 매핑으로 인해, 키 K를 갖는 키-값 쌍 또는 툼스톤이 발견되거나, KVDB 내 마지막(가령, 가장 큰 숫자의) 레벨 내 노드에 도달할 때까지 KVDB에서 레벨당 하나의 노드만 검색된다. 따라서 검색이 매우 효율적이다.
도 19는 하나의 실시예에 따르는, 키 검색을 수행하기 위한 방법(1900)의 일례를 도시한다. 방법(1900)의 동작은 전자 하드웨어, 가령, 도 21과 관련하여 이하에서 기재되는 것을 포함해 본 출원 전체에서 기재되는 것(가령, 회로)과 함께 구현된다.
동작(1905)에서, 키 및 KVS 트리 식별자를 포함하는 검색 요청이 수신된다.
동작(1910)에서, KVDB의 기본 레벨의 제1 노드가 현재 노드로서 선택된다.
동작(1915)에서, 현재 노드가 검사된다.
동작(1920)에서, 검사는 현재 노드의 가장 최신 kvset에 대한 질의로 시작한다.
결정(1925)에서, 키가 발견되지 않으면, 방법(1900)은 결정(1940)으로 진행하고 그렇지 않고 키가 발견되면 결정(1930)으로 진행한다. 검색중인 kvset이 이종 kvset 인 경우(가령, KVDB의 기본 레벨에 있는 경우) KVS 트리 식별자를 기반으로 키가 검색된다. KVS 트리 식별자를 이용하여 키 결과를 필터링하거나 키와 결합하여 매칭를 결정할 수 있다. 검색중인 kvset이 동종 kvset인 경우, KVS 트리 식별자는 키가 발견되었는지 여부를 결정하는 데 사용되지 않는다.
결정(1930)에서, 키에 대응하는 키 엔트리가 툼스톤을 포함하거나 참조하면, 방법(1900)은 결과(1960)로 진행하고 그렇지 않으면 결과(1935)로 진행한다.
결과(1935)에서, 키에 대한 가장 최신 키 엔트리에 대응하는 값이 검색 요청에 응답하여 답변으로 반환된다.
결정(1940)에서, 현재 노드에 kvset가 더 있는 경우, 방법(1900)은 동작(1945)으로 진행하고 그렇지 않으면 결정(1950)으로 진행한다.
동작(1945)에서, 방법(1900)은 현재 노드에서 다음 최신 kvset을 선택하고 키에 대해 질의하며 결정(1925)으로 진행한다.
결정(1950)에서, 현재 노드가 키에 대한 스필 함수(및 기본 레벨에서 다음 레벨 스필로의 경우 KVS 트리 식별자)와 매칭되는 어떠한 자식 노드도 갖지 않는 경우, 방법(1900)은 결과(1960)로 진행하고 그렇지 않으면 동작(1955)으로 진행한다. 따라서, 스필 함수는 앞서 기재된 바와 같이, 공통 루트 구조(예를 들어, 기본 레벨)로부터 KVS 트리 특정 다음 레벨로 이행될 때 KVS 트리 식별자 및 키 모두에 좌우된다. 그러나 기본 레벨들 사이에서, 존재하는 경우 또는 다음 레벨들 사이에서, 키가 스필 함수에 의해 홀로 사용될 수 있다.
동작(1955)에서, 키에 대한 스필 함수와 매칭되는 자식 노드(및 기본 레벨에서 다음 레벨의 이행의 경우 KVS 트리 식별자)가 현재 노드로 설정되고 방법(1900)은 단계(1915)로 진행한다.
결과(1960)에서, 검색의 부정적인 지시자, 가령, "키를 찾을 수 없음"이 검색 요청에 대한 답변으로서 반환된다.
스캔 동작은 다수의 키를 찾는다는 점에서 검색과 다르다. 전형적인 스캔 동작은 검색이 범위를 제한하기 위해 다수의 키를 특정하는 키 범위에 대한 검색을 포함할 수 있다. 일반적으로 스캔은 기준을 특정하고 기준을 충족하는 KVDB의 KVS 트리에 있는 모든 키의 결과를 예상한다.
도 20은 하나의 실시예에 따라, 키 스캔을 도시하는 블록도이다. 키 스캔, 또는 순수 스캔은 스캔 기준을 충족하는(가령, 특정된 범위 내에 속하는) 키 엔트리를 포함하는, KVDB 내 KVS 트리의 모든 노드에서 모든 kvset을 식별한다. kvsets의 키저장소가 특정 키에 대한 효율적인 검색을 가능하게 하지만, 스캔 기준을 충족하는 모든 키가 발견됨을 보장하기 위해, KVS 트리의 엔트리가 발견될 수 있는 모든 kvset가 검색된다. 따라서, KVS 트리 T2에 대해, 기본 레벨(예를 들어, 메모리 내, 디스크 상 등)의 이종 kvset이 T2에 대응하는 모든 다음 레벨 노드와 함께 검색되는데, 이때 노드(1,0)은 KVS 트리 T1에 대응하므로 생략된다. 그러나 kvset의 키-값 저장의 키-정렬 속성으로 인해 스캔은, 모든 키를 보지 않고 기준을 충족하는 키가 지정된 kvset에 있는지 여부를 신속하게 결정할 수 있다. 이는, 예를 들어 키-값 쌍이 키-정렬된 구조로 저장되지 않고, 오히려 키 해시 충돌을 해결하기 위해 키가 유지되므로, WB 트리에서 제공하는 기능보다 여전히 낫다. 따라서 스캔에 만족하기 위해 WB 트리 내 모든 키가 읽혀야 한다.
스캔을 촉진시키기 위해, 키는 키-정렬된 순서로 kvset에 저장된다. 따라서, 주어진 키는 로그 시간에 위치 할 수 있고 범위 내의 키(예를 들어, 범위에서 가장 높은 키 및 가장 낮은 키)도 신속하게 결정될 수 있다. 또한, kvset 메타 데이터가 스캔 속도를 더욱 높이기 위해 사용될 수 있다. 예를 들어, kvset이 kvset에 포함된 최소 및 최대 키 값을 유지하는 경우, 스캔은 kvset 내 어떠한 키도 특정된 범위를 충족하지 않음을 빠르게 결정할 수 있다. 마찬가지로, kvset 키의 블룸 필터를 유지하는 것이 특정 키가 주어진 kvset의 키 저장소에 없음을 빠르게 결정하는 데 사용될 수 있다. 이종 kvset는 다수의 KVS 트리로부터의 키의 포함을 해결하기 위해 추가 메타 데이터, 또는 정렬을 포함할 수 있다. 예를 들어, 키는 먼저 TID로 정렬된 다음 키로 정렬될 수 있다. 하나의 예에서, 다수의 트리에 걸친 키는 키에 대한 TID를 식별하는 메타 데이터와 함께 정렬될 수 있어서, 사용자 프로세스가 키를 필터링하는 것을 가능하게 한다. 예를 들어, TID가 제공되고 필터링 및 정렬 된 키 리스트가 반환된다.
앞서 언급된 바외에 하나의 예(도시되지 않음)에서, 스캔은 KVS 트리 식별자에 대응하는 모든 노드가 방문되는 것을 제외하고는 검색과 매우 유사하게 진행될 수 있다. 따라서, 스캔은 기준을 충족하는 모든 TID-키 조합에 대한 최신 레코드를 kvsets로부터 읽으며, 여기서 주어진 키 K에 대한 최신 레코드는 키-값 쌍 또는 키 툼스톤일 수 있다. 앞서 언급한 바와 같이, KVDB 내 주어진 노드 내에서, kvset는 가장 최신의 것부터 가장 오래된 것으로 순서화되며, 하위 레벨(L + 1)에 있는 노드의 kvset는 레벨 L의 노드에 있는 kvset보다 오래된 것이다. 기준을 충족하는 키가 발견된 후, 이들은 요청자에게 결과 세트로서 반환된다.
KVDB 내의 주어진 KVS 트리의 모든 노드의 모든 kvset의 방문이 스캔에서 발생한다는 것을 인식할 때 앞서 기재된 검색-유사 스캔이 개선될 수 있다. 따라서, 하나의 예에서, 주어진 KVS 트리의 엔트리가 발견될 수 있는 kvset들이 동시에 읽힐 수 있다. 모든 kvset의 동시 읽힘이 매우 큰 버퍼(가령, 반환된 결과의 저장 위치)를 초래할 수 있다. 그러나, 이는 주어진 kvset이 스캔 기준을 충족시키는 키를 갖는지(예를 들어, 범위 내에 있는지) 여부를 신속하게 결정하는 능력에 의해 완화될 수 있다. 따라서 모든 kvset가 방문될 수 있지만, 기준을 충족하는 키가 있는 kvset만 읽힌다. 이 예가 도 20에 도시되어 있다. 구체적으로, 판독자는 KVS 트리 T2에 대한 모든 kvsest(예를 들어, 점선 및 점선 표시된 kvset)를 동시에 방문하지만 kvset의 서브세트(점선 표시된 kvset)만 읽는다. 이 기법은 프로그램이 다음 또는 이전 키를 요청할 수 있는 반복자 스타일 시맨틱(iterator style semantics)을 지원한다. Kvsets 내 키의 정렬된 속성에 의해, 다음 키의 신속한 식별이 가능하며, 값이 프로그램에 반환되는 최신 값인 키에 충돌이 있는 경우(가령, 동일한 키에 대한 다수의 엔트리), 최신 값이 툼스톤이 아닌 경우, 이 경우 반복자는 이 키를 스킵하고 다음 키에 대한 최신 값을 제안한다.
예를 들어, 스캔은 키 범위(또는 다른 기준)를 포함하는 스캔 요청을 수신하는 단계를 포함할 수 있다. 예를 들어, 스캔은 트리로부터의 노드 세트의 각각의 kvset로부터의 범위로 지정된 키를 발견 세트로 수집함으로써 진행된다. 예를 들어, 노드 세트는 트리의 모든 노드를 포함한다. 예를 들어, 스캔은 툼스톤가 아닌 키에 대한 가장 최근 엔트리에 대응하는 키-값 쌍을 유지함으로써 발견 세트를 결과 세트로 축소시킴으로써 진행된다. 스캔은 결과 세트를 반환함으로써 완료된다.
KVS 트리의 모든 kvset(예를 들어, 모든 기본 레벨 kvset 및 KVS 트리에 대응하는 다음 레벨 kvset)이 검색되기 때문에, 도 20에 도시된 스캔은 "순수 스캔(pure scan)"또는 "전체 스캔(full scan)"으로 지칭될 수 있다. 전체 스캔의 수정은 프리픽스 스캔이다. 프리픽스 스캔은 모든 키가 특정된 프리픽스로 시작하는 KVS 트리에 대한 KVDB의 모든 키-값 쌍(존재하는 경우)을 찾는다. 프리픽스가 전체 키보다 작고 따라서 다수의 키와 매칭될 수 있지만, 키의 프리픽스 부분은 적어도 스필 값을 생성하기 위해 스필 함수(가령, 앞서 기재된 제1, 제2, 또는 제3 결정적 매핑)에 의해 사용되는 키의 부분만큼 크다. 따라서 스필 함수가 키의 제1 서브키를 사용하는 경우, 프리픽스는 제1 서브키를 포함한다(그리고 추가 서브키를 포함할 수 있다). 이 요건에 의해, KVDB 내 KVS 트리의 프리픽스의 경로에 있는 노드만 방문되기 때문에 결정적 매핑이 순수 스캔 성능보다 프리픽스 스캔 성능을 향상시킬 수 있다.
예를 들어, 스필 값은 키의 제1 서브키를 기초로 한다. 이 예에서, 특정된 프리픽스는 키의 제1 서브키에 대한 값을 포함한다. 이 예에서, 프리픽스 스캔은 특정된 프리픽스로 시작하는 티를 갖는 키-값 쌍 또는 툼스톤을 포함하는 KVS 트리에 대응하는 KVDB의 모든 노드 내 모든 kvset을 식별함으로써 진행될 수 있다. 앞서 언급한 바와 같이, 이종 kvset에서, KVS 트리 식별자가 사용되어 스캔의 일부가 아닌 다른 KVS 트리로부터의 키로부터, 검색되는 KVS 트리에 대한 키를 구별할 수 있다. 순수 스캔과 달리 프리픽스 스캔은 KVDB 내 KVS 트리의 모든 노드를 방문하지 않는다. 오히려, 검사된 노드는 프리픽스를 정의하는 값의 스필 값에 의해 결정된 경로를 따라 노드에 한정될 수 있다. 예를 들어, 제1 서브키를 이용하는 대신 마지막 서브키가 스필 값에 대해 사용되어 서픽스 스캔(suffix scan)을 이행할 수 있다. 이 예에서 특정된 서픽스는 키의 마지막 서브키에 대한 값을 포함한다. 스캔의 추가 변형이 스필 값 계산에 사용된 특정 서브키를 기반으로 구현될 수 있다.
프리픽스 스캔은 검사되는 노드 수가 KVDB 레벨 당 하나의 노드로 제한되고, kvset 키 저장소 내 키가 일반적으로 프리픽스와 일치하는 키를 쉽게 식별 할 수 있는 구조에 저장되기 때문에 매우 효율적이다. 또한, 키 스캔과 관련하여 앞서 설명한 kvset 메트릭도 검색 속도를 높이는 데 도움이 될 수 있다.
프리픽스 스캔은 KVS 트리 식별자 및 키 프리픽스를 갖는 스캔 요청을 수신하는 단계를 포함할 수 있다. 여기서, 검색될 노드 세트는 키 프리픽스 및 KVS 트리 식별자에 대응하는 각각의 노드를 포함한다. 하나의 예에서, 키 프리픽스에 대한 노드 대응은 키 프리픽스로부터 파생된 스필 값의 일부분, KVS 트리 식별자에 의해 결정된 스필 값의 일부분 및 KVDB 내 주어진 노드의 레벨에 의해 결정된다.
프리픽스 스캔은 KVS 트리 식별자에 의해 특정된 키 및 노드 세트의 각각의 kvset로부터의 프리픽스를 발견 세트로 수집하여 진행된다. 프리픽스 스캔은 툼스톤이 아니고 더 최신 툼스톤에 의해 삭제되지 않은 키에 대한 가장 최신 엔트리에 대응하는 키-값 쌍을 유지함으로써 발견 세트를 결과 세트로 축소시킴으로써 진행된다. 프리픽스 스캔은 결과 세트를 반환함으로써 완료된다.
앞서 기재된 바와 같이, KVDB는 다수의 키-값 데이터 트리를 저장하기 위한 오버헤드가 작고 자원 효율적인 구조를 제공한다. KVDB 트리는 KVS 트리, LSM 트리 및 WB 트리의 단점은 제외하고 이들 구조의 장점 중 다수를 포함한다. 예를 들어, 압축으로 인한 저장 공간 또는 쓰기-증폭과 관련하여, KVDB에서, 노드의 크기는 압축을 위해 사용되는 최대 임시 저장 용량을 제한하도록 쉽게 제어될 수 있다. 또한, 키 압축은 값-블록을 읽고 쓰지 않고 노드에서 검색 효율을 증가시키기 위해 사용될 수 있으며, 이에 의해 압축으로 인한 읽기-증폭 및 쓰기-증폭이 감소될 수 있다. 전통적인 LSM 트리에서, 압축에 필요한 임시 저장 용량과 읽기-증폭 및 쓰기-증폭의 양이 압축되는 트리-레벨에서의 키-값 용량에 비례할 수 있고, 이는 LSM 트리 내 트리-레벨의 키-값 용량은 일반적으로 트리 내 각각의 트리-레벨에서 기하 급수적으로 증가하도록 구성되어 있다는 사실에 의해 악화된다.
키 검색 효율성과 관련하여, KVDB에서 키 K를 검색하는 것이 레벨당 단 하나의 노드만 검색하는 것을 포함하며, 이는 KVDB 내 전체 키 중 작은 부분만 나타낸다. 전통적인 LSM 트리에서, 키 K를 검색하는 것이 각각의 레벨의 모든 키를 검색할 것을 요구한다.
프리픽스-스캔 효율성과 관련하여, 앞서 언급한 바와 같이, KVDB는 KVDB 내 전체 키의 작은 부분만 나타내는 레벨당 단 하나의 노드만 검색함으로써 특정된 프리픽스로 시작하는 모든 키를 찾는 것을 가능하게 한다. 기존 LSM 트리에서, 특정된 프리픽스로 시작하는 모든 키를 찾는 것이 각각의 레벨에서 모든 키를 검색하는 것을 필요로 한다.
스캔 효율과 관련하여, 앞서 기재된 KVDB는, kvset 내 데이터를 활용함으로써, 주어진 범위 내 모든 키 또는 특정된 프리픽스로 시작하는 키를 찾는 것을 가능하게 한다. WB 트리에서는 키가 순서화되지 않으므로 이러한 작업을 효율적으로 구현할 수 없다. 따라서, WB 트리에서, 이들 스캔을 수행하기 위해 트리에 대한 모든 항목이 불러와지고 검사되어야 한다.
압축 성능과 관련하여, KVDB에서, 호이스트 압축을 제외하고, 키, 키-값 및 스필 압축 유지관리 기법이, 노드 내 kvset의 시간 정렬된 속성 때문에, 넌-블로킹이다. 따라서, 새 kvset을 단순히 가장 최신 위치에 배치시킴으로써, 새 kvset이 키, 키-값, 또는 스필 압축이 수행되는 노드에 추가될 수 있다. WB 트리에서 압축은 블로킹 동작이다.
멀티-차원 데이터(가령, "컬럼 패밀리")를 지원하기 위해 개별 KVS 트리 또는 여러 트리에 의해 구현되는 그 밖의 다른 구조, 가령, LSM 트리, B 트리 등에 대한 이점과 관련하여, KVDB가 트랜잭션, 인제스트 크기, 및 메모리 사용에 대한 효율을 증가시킨다. 예를 들어, KVDB 내 둘 이상의 KVS 트리 내 키-값 쌍을 저장하거나 삭제하는 트랜잭션은, 주어진 트랜잭션과 연관된 모든 키-값 쌍 또는 툼스톤을 동일한 kvset(또는 원자적으로-인제스트된 kvset의 모음)에 인제스트함으로써, 로그 선행 기입(write-ahead log)(가령, 추가 처리, I/O 및 스토리지 사용 포함)의 오버헤드 없이 원자화될 수 있다. 또한, kvset 인제스트 크기, 및 이에 따른 I/O 효율이, 인제스트된 kvset가 KVDB 내 임의의 또는 모든 KVS 트리와 연관된 키-값 쌍 또는 툼스톤을 포함할 수 있기 때문에 증가될 수 있다. 따라서 단일 KVS 트리의 인제스트가 인제스트 크기에 대한 효율성의 임계값(가령, 써지는 중인 디바이스의 블록 크기) 미만인 경우, 또 다른 KVS 트리로부터의 추가 엔트리가 간격을 채울 수 있다. 또한, kvset 버퍼링을위한 메모리의 총량, 예를 들어, 기본 레벨의 바이트 어드레싱 가능한(예를 들어, 메모리) 레벨이 KVDB 내 각각의 KVS 트리에 대한 개별 kvset 버퍼를 유지하는 것에 비해 감소 될 수 있는데, 이는 다시 말하자면, 메모리-내 기본 레벨에서의 kvset가 KVDB 내 임의의 또는 모든 KVS 트리와 연관된 키-값 쌍 또는 툼스톤을 포함할 수 있기 때문이다.
도 21은 본 명세서에서 논의된 임의의 하나 이상의 기법(예를 들어, 방법론)이 수행할 수 있는 예시적인 머신(2100)의 블록도를 도시한다. 대안적인 실시예에서, 머신(2100)은 독립형 장치로서 작동할 수 있거나 다른 머신에 연결(예를 들어, 네트워킹)될 수 있다. 네트워크 배치에서, 머신(2100)은 서버-클라이언트 네트워크 환경에서 서버 머신, 클라이언트 머신 또는 둘 다의 기능으로 동작할 수 있다. 예를 들어, 머신(2100)은 P2P(peer-to-peer)(또는 또 다른 분산형) 네트워크 환경에서 피어 머신으로서 역할 할 수 있다. 머신(2100)은 개인용 컴퓨터(PC), 태블릿 PC, 셋톱 박스(STB), 개인용 디지털 어시스턴트(PDA), 휴대 전화, 웹 기기, 네트워크 라우터, 스위치 또는 브리지, 또는 해당 머신에 의해 취해질 동작을 특정하는 명령을 (순차적으로 또는 그 밖의 다른 방식으로) 실행할 수 있는 임의의 머신일 수 있다. 또한, 단일 머신으로 도시되어 있지만, "머신"이라는 용어는 또한 본 명세서에서 논의된 방법, 가령, 클라우드 컴퓨팅, SaaS(software as a service), 그 밖의 다른 컴퓨터 클러스터 구성 중 하나 이상을 수행하기 위해 명령의 세트(또는 복수의 세트)를 개별적으로 또는 공동으로 실행하는 머신의 임의의 집합을 포함하는 것으로도 여겨질 것이다.
본 명세서에 기재된 바와 같이, 예시는 로직 또는 다수의 구성요소, 또는 메커니즘에 의해 동작될 수 있다. 회로는 하드웨어(가령, 단순 회로, 게이트, 로직 등)를 포함하는 유형의(tangible) 개체로 구현된 회로의 모음이다. 회로 구성원은 시간이 지남에 따라 그리고 기저 하드웨어 변동에 따라 유연할 수 있다. 회로는 작동시 특정된 동작을 단독으로 또는 조합하여 수행할 수 있는 구성원을 포함한다. 하나의 예에서, 회로의 하드웨어는 특정 동작을 수행하도록 불변으로 설계될 수 있다(예를 들어, 하드와이어링될 수 있다). 하나의 예에서, 회로의 하드웨어는 가변적으로 연결된 물리적 구성요소(가령, 실행 유닛, 트랜지스터, 단순 회로 등), 예를 들어, 물리적으로 변형된(가령, 불변 매스 입자의 자기적으로, 전기적으로, 이동 가능하게 배치 등) 컴퓨터 판독형 매체를 포함하여, 특정 동작의 명령을 인코딩할 수 있다. 물리적 구성요소를 연결할 때, 하드웨어 구성요소의 기본 전기 속성이 예를 들어 절연체에서 전도체로, 또는 그 반대로 변경된다. 명령에 의해, 내장 하드웨어(예를 들어, 실행 유닛 또는 로딩 메커니즘)가 작동 중에 특정 동작의 일부를 수행하도록 가변 연결을 통해 하드웨어에서 회로의 구성원을 생성할 수 있다. 따라서, 컴퓨터 판독형 매체는 디바이스가 동작 중일 때 회로의 그 밖의 다른 구성요소와 통신 가능하게 연결된다. 하나의 예에서, 물리적 구성요소 중 임의의 것이 둘 이상의 회로의 둘 이상의 구성원에서 사용될 수 있다. 예를 들어, 동작 하에서, 실행 유닛은 한 시점에서 제1 회로군의 제1 회로에서 사용될 수 있고, 다른 시점에서 제1 회로군의 제2 회로에 의해 또는 제2 회로군의 제3 회로에 의해 재사용될 수 있다.
머신(예를 들어, 컴퓨터 시스템)(2100)은 하드웨어 프로세서(2102)(예를 들어, 중앙 처리 장치(CPU), 그래픽 처리 장치(GPU), 하드웨어 프로세서 코어, 또는 이들의 임의의 조합), 주 메모리(2104) 및 정적 메모리(2106)를 포함할 수 있으며, 이들 중 일부 또는 전부가 인터링크(가령, 버스)(2108)를 통해 서로 통신할 수 있다. 머신(2100)은 디스플레이 유닛(2110), 문숫자 입력 디바이스(2112)(가령, 키보드), 및 사용자 인터페이스(UI) 항법 디바이스(2114)(가령, 마우스)를 더 포함할 수 있다. 예를 들어, 디스플레이 유닛(2110), 입력 디바이스(2112) 및 UI 항법 디바이스(2114)는 터치 스크린 디스플레이일 수 있다. 머신(2100)은 저장 장치(예를 들어, 구동 유닛)(2116), 신호 생성 디바이스(2118)(예를 들어, 스피커), 네트워크 인터페이스 디바이스(2120), 및 하나 이상의 센서(2121), 가령, GPS(global positioning system) 센서, 나침반을 더 포함할 수 있다. 머신(2100)은 출력 제어기(2128), 가령, 직렬(예를 들어, USB(universal serial bus), 병렬 또는 그 밖의 다른 유선 또는 무선(예를 들어, IR(infrared), NFC(near field communication) 등)) 연결을 포함하여, 하나 이상의 주변 디바이스(가령, 프린터, 카드 리더 등)과 통신하거나 이를 제어할 수 있다.
저장 디바이스(2116)는 본 명세서에 기재된 기법 또는 기능 중 임의의 하나 이상에 의해 구현되거나 이용되는 하나 이상의 데이터 구조 세트 또는 명령(2124)(예를 들어, 소프트웨어)가 저장되는 머신 판독형 매체(2122)를 포함할 수 있다. 명령(2124)은 또한 머신(2100)에 의해 실행되는 동안 주 메모리(2104) 내에, 정적 메모리(2106) 내에, 또는 하드웨어 프로세서(2102) 내에 완전히 또는 적어도 부분적으로 상주할 수 있다. 예를 들어, 하드웨어 프로세서(2102), 주 메모리(2104), 정적 메모리(2106) 또는 저장 디바이스(2116) 중 하나 또는 임의의 조합이 머신 판독형 매체가 될 수 있다.
머신 판독형 매체(2122)가 단일 매체로서 예시되어 있지만, "머신 판독형 매체"라는 용어는 하나 이상의 명령(2124)을 저장하도록 구성된 단일 매체 또는 복수의 매체(가령, 중앙집중형 또는 분산형 데이터베이스, 및/또는 이와 연관된 캐시 및 서버)를 포함할 수 있다.
"머신 판독형 매체"라는 용어는 머신(2100)에 의해 실행되기 위한 명령을 저장, 인코딩 또는 반송할 수 있고 머신(2100)으로 하여금 본 개시의 기법 중 임의의 하나 이상을 수행하게 하거나 이러한 명령에 의해 사용되거나 이와 연관된 데이터를 저장, 인코딩 또는 반송할 수 있는 임의의 매체를 포함할 수 있다. 머신 판독형 매체의 비-제한적 예로는 솔리드-스테이트 메모리, 광학 및 자기 매체가 있을 수 있다. 하나의 예에서, 매스 머신 판독형 매체(massed machine readable medium)는 불변(예를 들어, 휴면) 질량을 갖는 복수의 입자를 갖는 머신 판독형 매체를 포함한다. 따라서, 매스 머신 판독형 매체는 일시적 전파 신호가 아니다. 매스 머신 판독형 매체의 특정 예로는 다음이 있을 수 있다: 비휘발성 메모리, 가령, 반도체 메모리 디바이스(예를 들어, EPROM(Electrically Programmable Read-Only Memory), EEPROM(Electrically Erasable Programmable Read-Only Memory)) 및 플래시 메모리 디바이스, 자기 디스크, 가령, 내부 하드 디스크 및 이동식 디스크, 자기-광학 디스크, 및 CD-ROM 및 DVD-ROM 디스크.
명령(2124)은 다수의 전송 프로토콜(예를 들어, 프레임 릴레이, IP(internet protocol), TCP(transmission control protocol), UDP(user datagram protocol), HTTP(hypertext transfer protocol) 등) 중 어느 하나를 사용하여 네트워크 인터페이스 디바이스(2120)을 통해 전송 매체를 사용하여 통신 네트워크(2126)을 통해 더 전송되거나 수신 될 수 있다. 예시적인 통신 네트워크는 LAN(local area network), WAN(wide area network), 패킷 데이터 네트워크(예를 들어, 인터넷), 이동 전화 네트워크(예를 들어, 셀룰러 네트워크), POTS(Plain Old Telephone) 네트워크, 및 무선 데이터 네트워크(가령, Wi-Fi®로 알려진 IEEE(Institute of Electrical and Electronics Engineers) 802.11 표준 계열, WiMax®로 알려진 IEEE 802.16 표준 계열, IEEE 802.15.4 표준 계열, P2P(peer-to-peer) 네트워크 등)을 포함할 수 있다. 예를 들어, 네트워크 인터페이스 디바이스(2120)는 통신 네트워크(2126)에 연결하기 위한 하나 이상의 물리적 잭(예를 들어, 이더넷, 동축 또는 전화기 잭) 또는 하나 이상의 안테나를 포함할 수 있다. 하나의 예에서, 네트워크 인터페이스 디바이스(2120)는 SIMO(single-input multiple-output), MIMO(multiple-input multiple-output), 또는 MISO(multiple-input single-output) 기법 중 적어도 하나를 이용하여 무선으로 통신하기 위한 복수의 안테나를 포함할 수 있다. "전송 매체"라는 용어는 머신(2100)에 의한 실행을 위한 명령을 저장, 인코딩 또는 반송할 수 있는 임의의 무형(intangible) 매체를 포함하며, 그러한 소프트웨어의 통신을 용이하게 하기 위해 디지털 또는 아날로그 통신 신호 또는 그 밖의 다른 무형 매체를 포함하는 것으로 여겨져야 한다.
추가 노드 및 예시
예시 1은 적어도 하나의 머신 판독형 매체 상의 KVS 트리 데이터베이스로서, 상기 KVS 트리 데이터베이스는: 노드에 이종 키-값 세트(kvset)를 갖는 기본 레벨 - 상기 이종 kvset는 제1 KVS 트리에 대한 제1 엔트리 및 제2 KVS 트리에 대한 제2 엔트리를 포함함 - , 및 적어도 하나의 다음 레벨을 포함하는 다음 레벨 - 상기 다음 레벨은 제1 KVS 트리에 대한 제1 동종 kvset를 포함하는 제1 KVS 트리 노드, 및 제2 KVS 트리에 대한 제2 동종 kvset를 포함하는 제2 KVS 트리 노드를 포함함 - , 기본 레벨과 다음 레벨 간 엔트리의 제1 결정적 매핑, 및 다음 레벨들 간 엔트리의 제2 결정적 매핑을 포함하는 멀티-레벨 트리를 포함한다.
예시 2에서, 예시 1의 주제 사항은, 제2 결정적 매핑은 다음 레벨에서의 노드에 대응하는 KVS 트리에 대해 특정된 결정적 매핑인 것을 포함한다.
예시 3에서, 예시 1-2의 주제 사항은, 제1 결정적 매핑은 엔트리에 대응하는 KVS 트리에 대한 트리 식별자를 기초로 하는 결정적 매핑인 것을 포함한다.
예시 4에서, 예시 1-3의 주제 사항은, 이종 kvset 엔트리는 트리 식별자를 포함하는 것을 포함한다.
예시 5에서, 예시 1-4의 주제 사항은 동종 kvset 엔트리는 트리 식별자를 배제하는 것을 포함한다.
예시 6에서, 예시 1-5의 주제 사항은, 기본 레벨은 적어도 하나의 머신 판독형 매체 중 제1 머신 판독형 매체에서 제1 서브레벨 및 적어도 하나의 머신 판독형 매체 중 제2 머신 판독형 매체에서 제2 서브레벨을 포함하는 것을 포함한다.
예시 7에서, 예시 6의 주제 사항은, 제2 서브레벨은 둘 이상의 노드를 포함하고, 기본 레벨은 제1 서브레벨과 제2 서브레벨 간 제3 결정적 매핑을 포함하는 것을 포함한다.
예시 8에서, 예시 7의 주제 사항은 제3 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는 것을 포함한다.
예시 9에서, 예시 6-8의 주제 사항은 제1 머신 판독형 매체는 바이트 어드레싱 가능(byte addressable)하고, 제2 머신 판독형은 블록 어드레싱 가능(block addressable)한 것을 포함한다.
예시 10은, 처리 회로를 포함하는 시스템이며, 상기 처리 회로는 제1 키 및 제1 KVS 트리에 대응하는 제1 트리 식별자를 포함하는 제1 엔트리를 수신하고, 제2 키 및 제2 KVS 트리에 대응하는 제2 트리 식별자를 포함하는 제2 엔트리를 수신하며, KVS 트리 데이터베이스의 기본 레벨 노드에서 제1 엔트리 및 제2 엔트리를 이종 키-값 쌍(kvset)에 쓰도록 구성되며, 상기 KVS 트리 데이터베이스는 적어도 하나의 기본 레벨 노드 및 적어도 하나의 다음 레벨 노드를 포함하고, 각각의 다음 레벨 노드는 단일 KVS 트리에 대응하고 단일 KVS 트리에 대한 동종 kvset을 포함한다.
예시 11에서, 예시 10의 주제 사항은, 처리 회로가 KVS 트리 데이터베이스의 노드를 압축하는 것을 포함한다.
예시 12에서, 예시 11의 주제 사항은, 트리의 노드를 압축하기 위해, 처리 회로가 키 압축을 수행하는 것을 포함한다.
예시 13에서, 예시 12의 주제 사항은, 키 압축을 수행하기 위해, 처리 회로는 노드의 복수의 kvset 에 걸쳐 매칭되는 식별자를 갖는 엔트리의 세트를 찾고, 상기 엔트리의 세트 중 가장 최신 엔트리를 노드의 새 kvset에 쓰며, 노드로부터 복수의 kvset를 제거하는 것을 포함한다.
예시 14에서, 예시 13의 주제 사항은, 노드는 기본 레벨 노드이고, 식별자는 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 15에서, 예시 13-14의 주제 사항은, 키 압축은 다음 레벨 노드 상에서 수행되고, 식별자는 엔트리에 대한 키만 기초로 하는 것을 포함한다.
예시 16에서, 예시 13-15의 주제 사항은, 노드로부터 복수의 kvset을 제거하기 위해, 처리 회로가 노드로부터 복수의 kvset에 대응하는 값을 제거하는 것을 포함한다.
예시 17에서, 예시 11-16의 주제 사항은, 트리의 노드를 압축하기 위해, 처리 회로가 노드에서 엔트리로부터 결정적 매핑을 계산하는 것 - 상기 결정적 매핑은 노드의 단일 자식 노드를 특정함 - , 및 엔트리를 단일 자식 노드에 쓰는 것을 포함하는 스필 압축을 수행하는 것을 포함한다.
예시 18에서, 예시 17의 주제 사항은, 노드는 기본 레벨 노드이고 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 19에서, 예시 17-18의 주제 사항은 노드 및 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 엔트리에 대한 키만을 기초로 하는 것을 포함한다.
예시 20에서, 예시 19의 주제 사항은, 결정적 매핑은 노드의 트리 레벨을 기초로 변하는 것을 포함한다.
예시 21에서, 예시 20의 주제 사항은 결정적 매핑은 키의 해시(hash)의 일부분이고, 상기 일부분은 트리 레벨 및 해시의 지정된 배정에 의해 특정되는 것을 포함한다.
예시 22에서, 예시 21의 주제 사항은 지정된 배정은 적어도 일부 트리 레벨에 대한 자식 노드의 최대 수를 정의한다.
예시 23에서, 예시 21-22의 주제 사항은 지정된 배정은 KVS 트리로의 최대 심도를 정의하는 것을 포함한다.
예시 24에서, 예시 11-23의 주제 사항은 트리의 노드를 압축하기 위해, 처리 회로는 부모 노드가 기본 레벨 노드이고 엔트리가 트리 식별자를 갖지 않을 때 부모 모드로 써지는 엔트리로 트리 식별자를 쓰는 것을 포함하는 호이스트 압축을 수행하는 것을 포함한다.
예시 25에서, 예시 10-24의 주제 사항은, 처리 회로가 KVS 트리 데이터베이스의 노드에서 엔트리를 검색하는 것을 포함한다.
예시 26에서, 예시 25의 주제 사항은 노드는 기본 레벨 노드이고, 엔트리는 트리 식별자 및 엔트리의 키 튜플(TIKT)에 의해 식별되는 것을 포함한다.
예시 27에서, 예시 25-26의 주제 사항은, 노드는 다음 레벨 노드이고, 엔트리는 엔트리의 키에 의해서만 식별되는 것을 포함한다.
예시 28에서, 예시 25-27의 주제 사항은, 검색에서 제1 노드에서 제2 노드로 이동하기 위해, 처리 회로는 질의 엔트리로부터의 결정적 매핑을 이용하는 것을 포함한다.
예시 29에서, 예시 28의 주제 사항은, 제1 결정적 매핑은 제1 노드 및 제2 노드가 기본 레벨 노드일 때 적용되고, 제2 결정적 매핑은 제1 노드가 기본 레벨 노드이고 제2 노드가 다음 레벨 노드일 때 적용되며, 제3 결정적 매핑은 제1 노드 및 제2 노드가 다음 레벨 노드일 때 적용되는 것을 포함한다.
예시 30에서, 예시 29의 주제 사항은, 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하는 것을 포함한다.
예시 31에서, 예시 29-30의 주제 사항은, 제1 결정적 매핑 및 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는 것을 포함한다.
예시 32는 KVS 트리 데이터베이스를 구현하기 위한 방법이며, 상기 방법은 제1 키 및 제1 KVS 트리에 대응하는 제1 트리 식별자를 포함하는 제1 엔트리를 수신하는 단계, 제2 키 및 제2 KVS 트리에 대응하는 제2 트리 식별자를 포함하는 제2 엔트리를 수신하는 단계, 및 KVS 트리 데이터베이스의 기본 레벨 노드에서 제1 엔트리 및 제2 엔트리를 이종 키-값 쌍(kvset)에 쓰는 단계 - 상기 KVS 트리 데이터베이스는 적어도 하나의 기본 레벨 노드 및 적어도 하나의 다음 레벨 노드를 포함하고, 각각의 다음 레벨 노드는 단일 KVS 트리에 대응하고 단일 KVS 트리에 대한 동종 kvset을 포함함 - 를 포함한다.
예시 33에서, 예시 32의 주제 사항은, KVS 트리 데이터베이스의 노드를 압축하는 단계를 포함한다.
예시 34에서, 예시 33의 주제 사항은, 트리의 노드를 압축하는 단계는 키 압축을 수행하는 단계를 포함한다.
예시 35에서, 예시 34의 주제 사항은, 키 압축을 수행하는 단계는 노드의 복수의 kvset에 걸쳐 매칭되는 식별자를 갖는 엔트리의 세트를 찾는 단계, 상기 엔트리의 세트 중 가장 최신 엔트리를 노드에서 새 kvset에 쓰는 단계, 및 노드로부터 복수의 kvset을 제거하는 단계를 포함하는 것을 포함한다.
예시 36에서, 예시 35의 주제 사항은, 노드는 기본 레벨 노드이고, 식별자는 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 37에서, 예시 35-36의 주제 사항은, 키 압축은 다음 레벨 노드 상에서 수행되고, 식별자는 엔트리에 대한 키만 기초로 하는 것을 포함한다.
예시 38에서, 예시 35-37의 주제 사항은, 노드로부터 복수의 kvset을 제거하는 단계는 노드로부터 복수의 kvset에 대응하는 값을 제거하는 단계를 포함하는 것을 포함한다.
예시 39에서, 예시 33-38의 주제 사항은, 트리의 노드를 압축하는 단계는 노드에서 엔트리로부터 결정적 매핑을 계산하는 단계 - 상기 결정적 매핑은 노드의 단일 자식 노드를 특정함 - , 및 엔트리를 단일 자식 노드에 쓰는 단계를 포함하는 스필 압축을 수행하는 단계를 포함한다.
예시 40에서, 예시 39의 주제 사항은, 노드는 기본 레벨 노드이고 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 41에서, 예시 39-40의 주제 사항은 노드 및 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 엔트리에 대한 키만을 기초로 하는 것을 포함한다.
예시 42에서, 예시 41의 주제 사항은, 결정적 매핑은 노드의 트리 레벨을 기초로 변하는 것을 포함한다.
예시 43에서, 예시 42의 주제 사항은 결정적 매핑은 키의 해시(hash)의 일부분이고, 상기 일부분은 트리 레벨 및 해시의 지정된 배정에 의해 특정되는 것을 포함한다.
예시 44에서, 예시 43의 주제 사항은 지정된 배정은 적어도 일부 트리 레벨에 대한 자식 노드의 최대 수를 정의한다.
예시 45에서, 예시 43-44의 주제 사항은 지정된 배정은 KVS 트리로의 최대 심도를 정의하는 것을 포함한다.
예시 46에서, 예시 33-45의 주제 사항은, 트리의 노드를 압축하는 단계는 부모 노드가 기본 레벨 노드이고 엔트리가 트리 식별자를 갖지 않을 때 부모 모드로 써지는 엔트리로 트리 식별자를 쓰는 단계를 포함하는 호이스트 압축을 수행하는 단계를 포함한다.
예시 47에서, 예시 32-46의 주제 사항은 KVS 트리 데이터베이스의 노드에서 엔트리를 검색하는 단계를 포함한다.
예시 48에서, 예시 47의 주제 사항은 노드는 기본 레벨 노드이고, 엔트리는 트리 식별자 및 엔트리의 키 튜플(TIKT)에 의해 식별되는 것을 포함한다.
예시 49에서, 예시 47-48의 주제 사항은, 노드는 다음 레벨 노드이고, 엔트리는 엔트리의 키에 의해서만 식별되는 것을 포함한다.
예시 50에서, 예시 47-49의 주제 사항은, 검색에서 제1 노드에서 제2 노드로 이동하기 위해, 질의 엔트리로부터의 결정적 매핑이 이용되는 것을 포함한다.
예시 51에서, 예시 50의 주제 사항은, 제1 결정적 매핑은 제1 노드 및 제2 노드가 기본 레벨 노드일 때 적용되고, 제2 결정적 매핑은 제1 노드가 기본 레벨 노드이고 제2 노드가 다음 레벨 노드일 때 적용되며, 제3 결정적 매핑은 제1 노드 및 제2 노드가 다음 레벨 노드일 때 적용되는 것을 포함한다.
예시 52에서, 예시 51의 주제 사항은, 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하는 것을 포함한다.
예시 53에서, 예시 51-52의 주제 사항은, 제1 결정적 매핑 및 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는 것을 포함한다.
예시 54는 명령을 포함하는 머신 판독형 매체이며, 상기 명령은 머신에 의해 실행될 때, 머신으로 하여금 예시 32-53 중 임의의 방법을 수행하게 한다.
예시 55는 예시 32-53 중 임의의 방법을 수행하기 위한 수단을 포함하는 시스템이다.
예시 56은 명령을 포함하는 머신 판독형 매체로서, 상기 명령은 처리 회로에 의해 실행될 때, 처리 회로로 하여금 제1 키 및 제1 KVS 트리에 대응하는 제1 트리 식별자를 포함하는 제1 엔트리를 수신하는 것, 제2 키 및 제2 KVS 트리에 대응하는 제2 트리 식별자를 포함하는 제2 엔트리를 수신하는 것, 및 제1 엔트리 및 제2 엔트리를 KVS 트리 데이터베이스의 기본 레벨 노드 내 이종 키-값 세트(kvset)에 쓰는 것 - KVS 트리 데이터베이스는 적어도 하나의 기본 레벨 노드 및 적어도 하나의 다음 레벨 노드를 포함하고, 각각의 다음 레벨 노드는 단일 KVS 트리에 대응하며 단일 KVS 트리에 대한 동종 kvset을 포함함 - 을 포함하는 동작을 수행하게 한다.
예시 57에서, 예시 56의 주제 사항은, 동작은 KVS 트리 데이터베이스의 노드를 압축하는 것을 포함하는 것을 포함한다.
예시 58에서, 예시 57의 주제 사항은, 트리의 노드를 압축하는 단계는 키 압축을 수행하는 단계를 포함한다.
예시 59에서, 예시 58의 주제 사항은, 키 압축을 수행하는 것은 노드의 복수의 kvset에 걸쳐 매칭되는 식별자를 갖는 엔트리의 세트를 찾는 단계, 상기 엔트리의 세트 중 가장 최신 엔트리를 노드에서 새 kvset에 쓰는 것, 및 노드로부터 복수의 kvset을 제거하는 것을 포함하는 것을 포함한다.
예시 60에서, 예시 59의 주제 사항은, 노드는 기본 레벨 노드이고, 식별자는 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 61에서, 예시 59-60의 주제 사항은, 키 압축은 다음 레벨 노드 상에서 수행되고, 식별자는 엔트리에 대한 키만 기초로 하는 것을 포함한다.
예시 62에서, 예시 59-61의 주제 사항은, 노드로부터 복수의 kvset을 제거하는 것은 노드로부터 복수의 kvset에 대응하는 값을 제거하는 것을 포함하는 것을 포함한다.
예시 63에서, 예시 57-62의 주제 사항은, 트리의 노드를 압축하는 것은 노드에서 엔트리로부터 결정적 매핑을 계산하는 것 - 상기 결정적 매핑은 노드의 단일 자식 노드를 특정함 - , 및 엔트리를 단일 자식 노드에 쓰는 것을 포함하는 스필 압축을 수행하는 것을 포함한다.
예시 64에서, 예시 63의 주제 사항은, 노드는 기본 레벨 노드이고 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 65에서, 예시 63-64의 주제 사항은 노드 및 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 엔트리에 대한 키만을 기초로 하는 것을 포함한다.
예시 66에서, 예시 65의 주제 사항은, 결정적 매핑은 노드의 트리 레벨을 기초로 변하는 것을 포함한다.
예시 67에서, 예시 66의 주제 사항은 결정적 매핑은 키의 해시(hash)의 일부분이고, 상기 일부분은 트리 레벨 및 해시의 지정된 배정에 의해 특정되는 것을 포함한다.
예시 68에서, 예시 67의 주제 사항은 지정된 배정은 적어도 일부 트리 레벨에 대한 자식 노드의 최대 수를 정의한다.
예시 69에서, 예시 67-68의 주제 사항은 지정된 배정은 KVS 트리로의 최대 심도를 정의하는 것을 포함한다.
예시 70에서, 예시 57-69의 주제 사항은, 트리의 노드를 압축하는 단계는 부모 노드가 기본 레벨 노드이고 엔트리가 트리 식별자를 갖지 않을 때 부모 모드로 써지는 엔트리로 트리 식별자를 쓰는 단계를 포함하는 호이스트 압축을 수행하는 단계를 포함한다.
예시 71에서, 예시 56-70의 주제 사항은 동작은 KVS 트리 데이터베이스의 노드에서 엔트리를 검색하는 것을 포함함을 포함한다.
예시 72에서, 예시 71의 주제 사항은 노드는 기본 레벨 노드이고, 엔트리는 트리 식별자 및 엔트리의 키 튜플(TIKT)에 의해 식별되는 것을 포함한다.
예시 73에서, 예시 71-72의 주제 사항은, 노드는 다음 레벨 노드이고, 엔트리는 엔트리의 키에 의해서만 식별되는 것을 포함한다.
예시 74에서, 예시 71-73의 주제 사항은, 검색에서 제1 노드에서 제2 노드로 이동하기 위해, 질의 엔트리로부터의 결정적 매핑이 이용되는 것을 포함한다.
예시 75에서, 예시 74의 주제 사항은, 제1 결정적 매핑은 제1 노드 및 제2 노드가 기본 레벨 노드일 때 적용되고, 제2 결정적 매핑은 제1 노드가 기본 레벨 노드이고 제2 노드가 다음 레벨 노드일 때 적용되며, 제3 결정적 매핑은 제1 노드 및 제2 노드가 다음 레벨 노드일 때 적용되는 것을 포함한다.
예시 76에서, 예시 75의 주제 사항은, 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하는 것을 포함한다.
예시 77에서, 예시 75-76의 주제 사항은, 제1 결정적 매핑 및 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는 것을 포함한다.
예시 78은 시스템이며, 상기 시스템은 제1 키 및 제1 KVS 트리에 대응하는 제1 트리 식별자를 포함하는 제1 엔트리를 수신하는 수단, 제2 키 및 제2 KVS 트리에 대응하는 제2 트리 식별자를 포함하는 제2 엔트리를 수신하는 수단, 및 KVS 트리 데이터베이스의 기본 레벨 노드에서 제1 엔트리 및 제2 엔트리를 이종 키-값 쌍(kvset)에 쓰는 수단 - 상기 KVS 트리 데이터베이스는 적어도 하나의 기본 레벨 노드 및 적어도 하나의 다음 레벨 노드를 포함하고, 각각의 다음 레벨 노드는 단일 KVS 트리에 대응하고 단일 KVS 트리에 대한 동종 kvset을 포함함 - 를 포함한다.
예시 79에서, 예시 78의 주제 사항은, KVS 트리 데이터베이스의 노드를 압축하는 수단을 포함한다.
예시 80에서, 예시 79의 주제 사항은, 트리의 노드를 압축하는 수단은 키 압축을 수행하는 수단을 포함하는 것을 포함한다.
예시 81에서, 예시 80의 주제 사항은, 키 압축을 수행하는 수단은 노드의 복수의 kvset에 걸쳐 매칭되는 식별자를 갖는 엔트리의 세트를 찾는 수단, 상기 엔트리의 세트 중 가장 최신 엔트리를 노드에서 새 kvset에 쓰는 수단, 및 노드로부터 복수의 kvset을 제거하는 수단을 포함하는 것을 포함한다.
예시 82에서, 예시 81의 주제 사항은, 노드는 기본 레벨 노드이고, 식별자는 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 83에서, 예시 81-82의 주제 사항은, 키 압축은 다음 레벨 노드 상에서 수행되고, 식별자는 엔트리에 대한 키만 기초로 하는 것을 포함한다.
예시 84에서, 예시 81-83의 주제 사항은, 노드로부터 복수의 kvset을 제거하는 수단은 노드로부터 복수의 kvset에 대응하는 값을 제거하는 수단을 포함하는 것을 포함한다.
예시 85에서, 예시 79-84의 주제 사항은, 트리의 노드를 압축하는 수단은 노드에서 엔트리로부터 결정적 매핑을 계산하는 수단 - 상기 결정적 매핑은 노드의 단일 자식 노드를 특정함 - , 및 엔트리를 단일 자식 노드에 쓰는 것을 포함하는 스필 압축을 수행하는 수단을 포함한다.
예시 86에서, 예시 85의 주제 사항은, 노드는 기본 레벨 노드이고 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는 것을 포함한다.
예시 87에서, 예시 85-86의 주제 사항은 노드 및 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 엔트리에 대한 키만을 기초로 하는 것을 포함한다.
예시 88에서, 예시 87의 주제 사항은, 결정적 매핑은 노드의 트리 레벨을 기초로 변하는 것을 포함한다.
예시 89에서, 예시 88의 주제 사항은 결정적 매핑은 키의 해시(hash)의 일부분이고, 상기 일부분은 트리 레벨 및 해시의 지정된 배정에 의해 특정되는 것을 포함한다.
예시 90에서, 예시 89의 주제 사항은 지정된 배정은 적어도 일부 트리 레벨에 대한 자식 노드의 최대 수를 정의한다.
예시 91에서, 예시 89-90의 주제 사항은 지정된 배정은 KVS 트리로의 최대 심도를 정의하는 것을 포함한다.
예시 92에서, 예시 79-91의 주제 사항은, 트리의 노드를 압축하는 수단은 부모 노드가 기본 레벨 노드이고 엔트리가 트리 식별자를 갖지 않을 때 부모 모드로 써지는 엔트리로 트리 식별자를 쓰는 수단을 포함하는 호이스트 압축을 수행하는 수단을 포함한다.
예시 93에서, 예시 78-92의 주제 사항은 동작은 KVS 트리 데이터베이스의 노드에서 엔트리를 검색하는 것을 포함함을 포함한다.
예시 94에서, 예시 93의 주제 사항은 노드는 기본 레벨 노드이고, 엔트리는 트리 식별자 및 엔트리의 키 튜플(TIKT)에 의해 식별되는 것을 포함한다.
예시 95에서, 예시 93-94의 주제 사항은, 노드는 다음 레벨 노드이고, 엔트리는 엔트리의 키에 의해서만 식별되는 것을 포함한다.
예시 96에서, 예시 93-95의 주제 사항은, 검색에서 제1 노드에서 제2 노드로 이동하기 위해, 질의 엔트리로부터의 결정적 매핑이 이용되는 것을 포함한다.
예시 97에서, 예시 96의 주제 사항은, 제1 결정적 매핑은 제1 노드 및 제2 노드가 기본 레벨 노드일 때 적용되고, 제2 결정적 매핑은 제1 노드가 기본 레벨 노드이고 제2 노드가 다음 레벨 노드일 때 적용되며, 제3 결정적 매핑은 제1 노드 및 제2 노드가 다음 레벨 노드일 때 적용되는 것을 포함한다.
예시 98에서, 예시 97의 주제 사항은, 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하는 것을 포함한다.
예시 99에서, 예시 97-98의 주제 사항은, 제1 결정적 매핑 및 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는 것을 포함한다.
예시 100은 명령을 포함하는 적어도 하나의 머신 판독형 매체이며, 상기 명령은 처리 회로에 의해 실행될 때, 처리 회로로 하여금 예시 1-99 중 임의의 것의 구현 동작을 수행하게 한다.
예시 101은 예시 1-99 중 임의의 것을 구현하기 위한 수단을 포함하는 장치이다.
예시 102은 예시 1-99 중 임의의 것을 구현하기 위한 시스템이다.
예시 103은 예시 1-99 중 임의의 것을 구현하기 위한 방법이다.
상기의 상세한 설명은 상세한 설명의 일부를 형성하는, 첨부된 도면을 참조하는 것을 포함한다. 도면은 예시적으로 실시될 수 있는 특정 실시예를 도시한다. 이들 실시예는 본 명세서에서 "예"로도 지칭된다. 이러한 예는 도시되거나 설명된 것에 추가로 요소를 포함할 수 있다. 그러나, 본 발명자들은 또한 도시되거나 기재된 요소들만이 제공되는 예도 고려한다. 또한, 본 발명자들은 특정 예(또는 하나 이상의 이의 양태)와 관련하여, 또는 본 명세서에 도시되거나 기재된 그 밖의 다른 예(또는 하나 이상의 이의 양태)와 관련하여, 도시되거나 기재된 요소(또는 하나 이상의 이의 양태)의 임의의 조합 또는 순열을 사용하는 예도 고려한다.
본 명세서에서 언급되는 모든 간행물, 특허, 및 특허 문서는, 개별적으로 참조로서 포함되는 것처럼, 그 전체가 본 명세서에 참조로서 포함된다. 이 문서와 참조에 의해 포함된 문서 간에 일관성이 없는 사용이 있는 경우, 포함된 참조(들)의 사용은이 문서의 사용을 보완하는 것으로 간주되어야 하며, 양립할 수 없는 불일치의 경우, 이 문서에서의 사용이 우선시 된다.
이 문서에서, 용어 "a" 또는 "an"은 특허 문서에서 일반적으로 사용될 때 "적어도 하나" 또는 "하나 이상"의 임의의 다른 예 또는 사용과 무관하게 둘 이상의 것을 포함하는 것으로 사용된다. 본 문서에서, 용어 "또는(or)"은 달리 지시되지 않는 한, 비 배타적 또는(nonexclusive or)을 지칭하는 것으로 사용되어, "A 또는 B"가 "A이지만 B는 아닌", "B이지만 A는 아닌"및 "A 및 B"를 포함하는 것으로 사용된다. 첨부된 청구 범위에서, "포함하는(including)" 및 "여기서(in which)"라는 용어는 "포함하는(comprising)" 및 "여기서(wherein)"이라는 각각의 용어의 영어 평문에 상응하는 것으로 사용된다. 또한, 다음의 청구 범위에서, "포함하는(including)" 및 "포함하는(comprising)"이라는 용어는 개방형인데, 즉, 청구항에서 이러한 용어 뒤에 열거된 것 외에 요소를 포함하는 시스템, 디바이스, 물품 또는 프로세스가 상기 청구항의 범위 내에서 여전히 속하는 것으로 간주된다. 또한, 다음의 청구 범위에서, "제1", "제2"및 "제3" 등의 용어는 단지 라벨로서 사용되며, 이들의 목적어에 수치적 요건을 부과하도록 의도되지 않는다.
상기 기재는 예시이며 한정이 아니도록 의도된다. 예를 들어, 앞서 기재된 예(또는 이의 하나 이상의 양태)는 서로 조합하여 사용될 수 있다. 상기 기재를 검토하면 가령 해당 분야의 통상의 기술자에 의해 그 밖의 다른 실시예들이 사용될 수 있다. 요약서는 독자가 기술 개시의 본질을 신속하게 확인할 수 있게 하고 청구항의 범위 또는 의미를 해석하거나 제한하는 데 사용되지 않을 것이라는 이해와 함께 제출된다. 또한, 상기 상세한 설명에서, 다양한 특징들이 함께 그룹화되어 개시를 간소화할 수 있다. 이는 청구되지 않은 공개된 특징이 임의의 주장에 필수적임을 의도하는 것으로 해석되어서는 안 된다. 오히려, 본 발명의 주제는 특정 개시된 실시예의 모든 특징보다 적을 수 있다. 따라서, 이하의 청구 범위는 상세한 설명에 포함되며, 각 청구 범위는 그 자체가 별도의 실시예이다. 실시예의 범위는 첨부된 청구 범위를 참조하여 이러한 청구 범위가 부여되는 균등예의 전체 범위와 함께 결정되어야 한다.
Claims (42)
- 적어도 하나의 머신 판독형 매체 상의 KVS 트리 데이터베이스로서, 상기 KVS 트리 데이터베이스는:
노드에 이종 키-값 세트(kvset)를 갖는 기본 레벨 - 상기 이종 kvset는 제1 KVS 트리에 대한 제1 엔트리 및 제2 KVS 트리에 대한 제2 엔트리를 포함함 - , 및
적어도 하나의 다음 레벨을 포함하는 다음 레벨 - 상기 다음 레벨은
제1 KVS 트리에 대한 제1 동종 kvset를 포함하는 제1 KVS 트리 노드, 및
제2 KVS 트리에 대한 제2 동종 kvset를 포함하는 제2 KVS 트리 노드를 포함함 - ,
기본 레벨과 다음 레벨 간 엔트리의 제1 결정적 매핑, 및
다음 레벨들 간 엔트리의 제2 결정적 매핑
을 포함하는, 멀티-레벨 트리
를 포함하는, KVS 트리 데이터베이스. - 제1항에 있어서, 제2 결정적 매핑은 다음 레벨에서의 노드에 대응하는 KVS 트리에 대해 특정된 결정적 매핑인, KVS 트리 데이터베이스.
- 제1항에 있어서, 제1 결정적 매핑은 엔트리에 대응하는 KVS 트리에 대한 트리 식별자를 기초로 하는 결정적 매핑인, KVS 트리 데이터베이스.
- 제1항에 있어서, 이종 kvset 엔트리는 트리 식별자를 포함하는, KVS 트리 데이터베이스.
- 제1항에 있어서, 동종 kvset 엔트리는 트리 식별자를 배제하는, KVS 트리 데이터베이스.
- 제1항에 있어서, 기본 레벨은 적어도 하나의 머신 판독형 매체 중 제1 머신 판독형 매체에서 제1 서브레벨 및 적어도 하나의 머신 판독형 매체 중 제2 머신 판독형 매체에서 제2 서브레벨을 포함하는, KVS 트리 데이터베이스.
- 제6항에 있어서, 제2 서브레벨은 둘 이상의 노드를 포함하고, 기본 레벨은 제1 서브레벨과 제2 서브레벨 간 제3 결정적 매핑을 포함하는, KVS 트리 데이터베이스.
- 제7항에 있어서, 제3 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는, KVS 트리 데이터베이스.
- 제6항에 있어서, 제1 머신 판독형 매체는 바이트 어드레싱 가능(byte addressable)하고, 제2 머신 판독형은 블록 어드레싱 가능(block addressable)한, KVS 트리 데이터베이스.
- KVS 트리 데이터베이스를 구현하기 위한 방법으로서, 상기 방법은
제1 키 및 제1 KVS 트리에 대응하는 제1 트리 식별자를 포함하는 제1 엔트리를 수신하는 단계,
제2 키 및 제2 KVS 트리에 대응하는 제2 트리 식별자를 포함하는 제2 엔트리를 수신하는 단계, 및
KVS 트리 데이터베이스의 기본 레벨 노드에서 제1 엔트리 및 제2 엔트리를 이종 키-값 쌍(kvset)에 쓰는 단계 - 상기 KVS 트리 데이터베이스는 적어도 하나의 기본 레벨 노드 및 적어도 하나의 다음 레벨 노드를 포함하고, 각각의 다음 레벨 노드는 단일 KVS 트리에 대응하고 단일 KVS 트리에 대한 동종 kvset을 포함함 - 를 포함하는, 방법. - 제10항에 있어서, KVS 트리 데이터베이스의 노드를 압축하는 단계를 포함하는, 방법.
- 제11항에 있어서, 트리의 노드를 압축하는 단계는
노드에서 엔트리로부터 결정적 매핑을 계산하는 단계 - 상기 결정적 매핑은 노드의 단일 자식 노드를 특정함 - , 및
엔트리를 상기 단일 자식 노드에 쓰는 단계
를 포함하는 스필 압축(spill compaction)을 수행하는 단계를 포함하는, 방법. - 제12항에 있어서, 노드 및 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 엔트리에 대한 키만을 기초로 하는, 방법.
- 제11항에 있어서, 트리의 노드를 압축하는 단계는, 부모 노드가 기본 레벨 노드이고 엔트리가 트리 식별자를 갖지 않을 때 부모 노드로 써진 엔트리로 트리 식별자를 쓰는 단계를 포함하는 호이스트 압축(hoist compaction)을 수행하는 단계를 포함하는, 방법.
- 제10항에 있어서, KVS 트리 데이터베이스의 노드에서 엔트리를 검색하는 단계를 포함하는, 방법.
- 제15항에 있어서, 노드는 기본 레벨 노드이고, 엔트리는 트리 식별자 및 엔트리의 키 튜플(TIKT)에 의해 식별되는, 방법.
- 제15항에 있어서, 질의 엔트리로부터의 결정적 매핑이 검색에서 제1 노드에서 제2 노드로 이동하는 데 사용되는, 방법.
- 제17항에 있어서, 제1 결정적 매핑은 제1 노드 및 제2 노드가 기본 레벨 노드일 때 적용되고, 제2 결정적 매핑은 제1 노드가 기본 레벨 노드이고 제2 노드가 다음 레벨 노드일 때 적용되며, 제3 결정적 매핑은 제1 노드 및 제2 노드가 다음 레벨 노드일 때 적용되는, 방법.
- 제18항에 있어서, 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하는, 방법.
- 제18항에 있어서, 제1 결정적 매핑 및 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는, 방법.
- 명령을 포함하는 머신 판독형 매체로서, 상기 명령은 처리 회로에 의해 실행될 때, 처리 회로로 하여금
제1 키 및 제1 KVS 트리에 대응하는 제1 트리 식별자를 포함하는 제1 엔트리를 수신하는 것,
제2 키 및 제2 KVS 트리에 대응하는 제2 트리 식별자를 포함하는 제2 엔트리를 수신하는 것, 및
제1 엔트리 및 제2 엔트리를 KVS 트리 데이터베이스의 기본 레벨 노드 내 이종 키-값 세트(kvset)에 쓰는 것 - KVS 트리 데이터베이스는 적어도 하나의 기본 레벨 노드 및 적어도 하나의 다음 레벨 노드를 포함하고, 각각의 다음 레벨 노드는 단일 KVS 트리에 대응하며 단일 KVS 트리에 대한 동종 kvset을 포함함 -
을 포함하는 동작을 수행하게 하는, 머신 판독형 매체. - 제21항에 있어서, 동작은 KVS 트리 데이터베이스의 노드를 압축하는 것을 포함하는, 머신 판독형 매체.
- 제22항에 있어서, 트리의 노드를 압축하는 것은 키 압축을 수행하는 것을 포함하는, 머신 판독형 매체.
- 제23항에 있어서, 키 압축을 수행하는 것은
노드의 복수의 kvset에 걸쳐 매칭되는 식별자를 갖는 엔트리의 세트를 찾는 것,
상기 엔트리의 세트 중 가장 최신 엔트리를 노드에서 새 kvset에 쓰는 것, 및
노드로부터 복수의 kvset을 제거하는 것을 포함하는, 머신 판독형 매체. - 제24항에 있어서, 노드는 기본 레벨 노드이고, 식별자는 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는, 머신 판독형 매체.
- 제24항에 있어서, 키 압축은 다음 레벨 노드 상에서 수행되고, 식별자는 엔트리에 대한 키만 기초로 하는, 머신 판독형 매체.
- 제24항에 있어서, 노드로부터 복수의 kvset을 제거하는 것은 노드로부터 복수의 kvset에 대응하는 값을 제거하는 것을 포함하는, 머신 판독형 매체.
- 제22항에 있어서, 트리의 노드를 압축하는 것은
노드에서 엔트리로부터 결정적 매핑을 계산하는 것 - 상기 결정적 매핑은 노드의 단일 자식 노드를 특정함 - , 및
엔트리를 단일 자식 노드에 쓰는 것
을 포함하는 스필 압축을 수행하는 것을 포함하는, 머신 판독형 매체. - 제28항에 있어서, 노드는 기본 레벨 노드이고 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 트리 식별자 및 엔트리에 대한 키 튜플(TIKT)을 기초로 하는, 머신 판독형 매체.
- 제28항에 있어서, 노드 및 단일 자식 노드는 다음 레벨 노드이며, 결정적 매핑은 엔트리에 대한 키만 기초로 하는, 머신 판독형 매체.
- 제30항에 있어서, 결정적 매핑은 노드의 트리 레벨을 기초로 변하는, 머신 판독형 매체.
- 제31항에 있어서, 결정적 매핑은 키의 해시(hash)의 일부분이고, 상기 일부분은 트리 레벨 및 해시의 지정된 배정에 의해 특정되는, 머신 판독형 매체.
- 제32항에 있어서, 지정된 배정은 적어도 일부 트리 레벨에 대한 자식 노드의 최대 수를 정의하는, 머신 판독형 매체.
- 제32항에 있어서, 지정된 배정은 KVS 트리까지의 최대 심도를 정의하는, 머신 판독형 매체.
- 제22항에 있어서, 트리의 노드를 압축하는 것은, 부모 노드가 기본 레벨 노드이고 엔트리가 트리 식별자를 갖지 않을 때 부모 모드로 써지는 엔트리로 트리 식별자를 쓰는 것을 포함하는 호이스트 압축을 수행하는 것을 포함하는, 머신 판독형 매체.
- 제21항에 있어서, 동작은 KVS 트리 데이터베이스의 노드에서 엔트리를 검색하는 것을 포함하는, 머신 판독형 매체.
- 제36항에 있어서, 노드는 기본 레벨 노드이고, 엔트리는 트리 식별자 및 엔트리의 키 튜플(TIKT)에 의해 식별되는, 머신 판독형 매체.
- 제36항에 있어서, 노드는 다음 레벨 노드이고, 엔트리는 엔트리의 키에 의해서만 식별되는, 머신 판독형 매체.
- 제36항에 있어서, 질의 엔트리로부터의 결정적 매핑은 검색에서 제1 노드에서 제2 노드로 이동할 때 사용되는, 머신 판독형 매체.
- 제39항에 있어서, 제1 결정적 매핑은 제1 노드와 제2 노드가 기본 레벨 노드일 때 적용되고, 제2 결정적 매핑은 제1 노드가 기본 레벨 노드이고 제2 노드가 다음 레벨 노드일 때 적용되며, 제3 결정적 매핑은 제1 노드와 제2 노드가 다음 레벨 노드일 때 적용되는, 머신 판독형 매체.
- 제40항에 있어서, 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하는, 머신 판독형 매체.
- 제40항에 있어서, 제1 결정적 매핑 및 제2 결정적 매핑은 엔트리의 트리 식별자를 이용하지 않는, 머신 판독형 매체.
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/691,888 US10783186B2 (en) | 2017-08-31 | 2017-08-31 | Heterogenous key-value sets in tree database |
US15/691,888 | 2017-08-31 | ||
PCT/US2018/045582 WO2019045959A1 (en) | 2017-08-31 | 2018-08-07 | KVS TREE DATA BASE |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20200053512A true KR20200053512A (ko) | 2020-05-18 |
KR102462781B1 KR102462781B1 (ko) | 2022-11-04 |
Family
ID=65435211
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020207009185A KR102462781B1 (ko) | 2017-08-31 | 2018-08-07 | Kvs 트리 데이터베이스 |
Country Status (5)
Country | Link |
---|---|
US (2) | US10783186B2 (ko) |
KR (1) | KR102462781B1 (ko) |
CN (1) | CN111226205B (ko) |
TW (1) | TWI682285B (ko) |
WO (1) | WO2019045959A1 (ko) |
Families Citing this family (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11755534B2 (en) | 2017-02-14 | 2023-09-12 | Qnap Systems, Inc. | Data caching method and node based on hyper-converged infrastructure |
TWI710954B (zh) * | 2019-07-26 | 2020-11-21 | 威聯通科技股份有限公司 | 超融合基礎架構的資料快取方法與節點、機器學習框架及檔案系統代理程式 |
US10783186B2 (en) | 2017-08-31 | 2020-09-22 | Micron Technology, Inc. | Heterogenous key-value sets in tree database |
US11269915B2 (en) * | 2017-10-05 | 2022-03-08 | Zadara Storage, Inc. | Maintaining shards in KV store with dynamic key range |
CN108063756B (zh) * | 2017-11-21 | 2020-07-03 | 阿里巴巴集团控股有限公司 | 一种密钥管理方法、装置及设备 |
CN110321297A (zh) * | 2018-03-28 | 2019-10-11 | 三星电子株式会社 | 用于将虚拟流映射到物理流上的存储装置及其操作方法 |
US11243929B2 (en) * | 2018-08-08 | 2022-02-08 | Visa International Service Association | System and method for dynamic bulk data ingestion prioritization |
US11099771B2 (en) * | 2018-09-24 | 2021-08-24 | Salesforce.Com, Inc. | System and method for early removal of tombstone records in database |
CN116233838A (zh) | 2019-04-29 | 2023-06-06 | 瑞典爱立信有限公司 | 5g中的多个认证过程的处理 |
CN110362572B (zh) * | 2019-06-25 | 2022-07-01 | 浙江邦盛科技股份有限公司 | 一种基于列式存储的时序数据库系统 |
US11256719B1 (en) * | 2019-06-27 | 2022-02-22 | Amazon Technologies, Inc. | Ingestion partition auto-scaling in a time-series database |
US11256717B2 (en) * | 2019-10-21 | 2022-02-22 | Vmware, Inc. | Storage of key-value entries in a distributed storage system |
CN111399777B (zh) * | 2020-03-16 | 2023-05-16 | 平凯星辰(北京)科技有限公司 | 一种基于数据值分类的差异化键值数据存储方法 |
CN111400320B (zh) * | 2020-03-18 | 2023-06-20 | 百度在线网络技术(北京)有限公司 | 用于生成信息的方法和装置 |
US11556513B2 (en) | 2020-06-30 | 2023-01-17 | Hewlett Packard Enterprise Development Lp | Generating snapshots of a key-value index |
US20210149683A1 (en) * | 2020-12-21 | 2021-05-20 | Intel Corporation | Techniques for acceleration of a prefix-scan operation |
US20220329436A1 (en) * | 2021-04-13 | 2022-10-13 | International Business Machines Corporation | Token-based identity validation via blockchain |
CN113297136B (zh) * | 2021-05-25 | 2023-11-03 | 南京大学 | 一种面向lsm树的键值存储方法和存储系统 |
US20230017732A1 (en) | 2021-07-16 | 2023-01-19 | Samsung Electronics Co., Ltd. | Key packing for flash key value store operations |
CN113794579A (zh) * | 2021-07-26 | 2021-12-14 | 奇安信科技集团股份有限公司 | 标签创建方法、装置、设备、系统与存储介质 |
US20230054002A1 (en) * | 2021-08-18 | 2023-02-23 | Samsung Electronics Co., Ltd. | Lifecycle-aware persistent storage |
US11892992B2 (en) * | 2022-01-31 | 2024-02-06 | Salesforce, Inc. | Unique identification management |
US20240143585A1 (en) * | 2022-10-31 | 2024-05-02 | Micron Technology, Inc. | Optimizing database cursor operations in key-value stores |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160364421A1 (en) * | 2015-06-10 | 2016-12-15 | International Business Machines Corporation | Database index for constructing large scale data level of details |
Family Cites Families (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5204958A (en) | 1991-06-27 | 1993-04-20 | Digital Equipment Corporation | System and method for efficiently indexing and storing a large database with high data insertion frequency |
US7308456B2 (en) | 2002-12-19 | 2007-12-11 | International Business Machines Corporation | Method and apparatus for building one or more indexes on data concurrent with manipulation of data |
US8996563B2 (en) * | 2010-04-06 | 2015-03-31 | Tokutek, Inc. | High-performance streaming dictionary |
US8700670B2 (en) * | 2010-04-12 | 2014-04-15 | Symantec Corporation | Insert optimization for B+ tree data structure scalability |
GB201102606D0 (en) | 2011-02-15 | 2011-03-30 | Acunu Ltd | Data storage system |
US8527544B1 (en) * | 2011-08-11 | 2013-09-03 | Pure Storage Inc. | Garbage collection in a storage system |
CN102521375B (zh) * | 2011-12-19 | 2013-12-11 | 山东中创软件商用中间件股份有限公司 | 一种目录服务数据检索方法及系统 |
US9727598B2 (en) | 2012-12-19 | 2017-08-08 | Salesforce.Com, Inc. | Systems, methods, and apparatuses for fixing logical or physical corruption in databases using LSM trees |
CN104142958B (zh) * | 2013-05-10 | 2018-03-13 | 华为技术有限公司 | 一种键值对系统中数据的存储方法和相关装置 |
CN104424222B (zh) * | 2013-08-23 | 2019-09-13 | 华为技术有限公司 | 数据库索引方法及装置 |
CN103823865A (zh) * | 2014-02-25 | 2014-05-28 | 南京航空航天大学 | 一种数据库主存索引方法 |
US9411840B2 (en) | 2014-04-10 | 2016-08-09 | Facebook, Inc. | Scalable data structures |
US9836229B2 (en) * | 2014-11-18 | 2017-12-05 | Netapp, Inc. | N-way merge technique for updating volume metadata in a storage I/O stack |
US10891264B2 (en) * | 2015-04-30 | 2021-01-12 | Vmware, Inc. | Distributed, scalable key-value store |
US10303673B2 (en) * | 2015-05-11 | 2019-05-28 | Apple Inc. | Hierarchical data storage |
CN105159915B (zh) | 2015-07-16 | 2018-07-10 | 中国科学院计算技术研究所 | 可动态适应的lsm树合并方法及系统 |
US10496283B2 (en) * | 2016-01-22 | 2019-12-03 | Suraj Prabhakar WAGHULDE | Adaptive prefix tree based order partitioned data storage system |
US9990146B2 (en) * | 2016-02-03 | 2018-06-05 | Sandisk Technologies Llc | Apparatus and method of data sequencing |
US10783186B2 (en) | 2017-08-31 | 2020-09-22 | Micron Technology, Inc. | Heterogenous key-value sets in tree database |
-
2017
- 2017-08-31 US US15/691,888 patent/US10783186B2/en active Active
-
2018
- 2018-08-07 WO PCT/US2018/045582 patent/WO2019045959A1/en active Application Filing
- 2018-08-07 CN CN201880066952.XA patent/CN111226205B/zh active Active
- 2018-08-07 KR KR1020207009185A patent/KR102462781B1/ko active IP Right Grant
- 2018-08-15 TW TW107128396A patent/TWI682285B/zh active
-
2020
- 2020-09-10 US US17/017,126 patent/US11238098B2/en active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160364421A1 (en) * | 2015-06-10 | 2016-12-15 | International Business Machines Corporation | Database index for constructing large scale data level of details |
Also Published As
Publication number | Publication date |
---|---|
US10783186B2 (en) | 2020-09-22 |
TWI682285B (zh) | 2020-01-11 |
CN111226205A (zh) | 2020-06-02 |
US20190065621A1 (en) | 2019-02-28 |
US11238098B2 (en) | 2022-02-01 |
CN111226205B (zh) | 2021-08-31 |
WO2019045959A1 (en) | 2019-03-07 |
KR102462781B1 (ko) | 2022-11-04 |
US20200410005A1 (en) | 2020-12-31 |
TW201913416A (zh) | 2019-04-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102462781B1 (ko) | Kvs 트리 데이터베이스 | |
TWI702506B (zh) | 用於合併樹廢棄項目指標之系統、機器可讀媒體及機器實施之方法 | |
TWI682274B (zh) | 鍵值儲存樹 | |
KR102290835B1 (ko) | 유지관리 동작들을 위한 병합 트리 수정들 | |
TWI719281B (zh) | 用於串流選擇之系統、機器可讀媒體、及機器實施之方法 | |
US8738572B2 (en) | System and method for storing data streams in a distributed environment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
E902 | Notification of reason for refusal | ||
E701 | Decision to grant or registration of patent right | ||
GRNT | Written decision to grant |