DE102021108455A1 - Erzeugen von Snapshots eines Key-Value-Index - Google Patents

Erzeugen von Snapshots eines Key-Value-Index Download PDF

Info

Publication number
DE102021108455A1
DE102021108455A1 DE102021108455.5A DE102021108455A DE102021108455A1 DE 102021108455 A1 DE102021108455 A1 DE 102021108455A1 DE 102021108455 A DE102021108455 A DE 102021108455A DE 102021108455 A1 DE102021108455 A1 DE 102021108455A1
Authority
DE
Germany
Prior art keywords
generation
node
key
indirect
index
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
DE102021108455.5A
Other languages
English (en)
Other versions
DE102021108455B4 (de
Inventor
Praveen Killamsetti
Anirudha Kumar
Rajat Sharma
Ammar Govind EKBOTE
Kumar Thangavelu
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hewlett Packard Enterprise Development LP
Original Assignee
Hewlett Packard Enterprise Development LP
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hewlett Packard Enterprise Development LP filed Critical Hewlett Packard Enterprise Development LP
Publication of DE102021108455A1 publication Critical patent/DE102021108455A1/de
Application granted granted Critical
Publication of DE102021108455B4 publication Critical patent/DE102021108455B4/de
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2272Management thereof
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9027Trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1446Point-in-time backing up or restoration of persistent data
    • G06F11/1448Management of the data involved in backup or backup restore
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2291User-Defined Types; Storage management thereof
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24552Database cache management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Software Systems (AREA)
  • Computational Linguistics (AREA)
  • Quality & Reliability (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

Ein computerimplementiertes Verfahren kann umfassen: Speichern von Schlüssel-Wert-Paaren in einem Index in einem dauerhaften Speicher, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsidentifikator für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Schnappschüssen umfasst, die mit einer Vielzahl von Generationen verbunden sind; Empfangen einer Anforderung, Daten eines bestimmten Schnappschusses des Index zu lesen, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der Vielzahl von Generationen verbunden ist; in Reaktion auf die Anforderung, Durchführen einer Durchquerung, beginnend von einem bestimmten Wurzelknoten, der mit der bestimmten Generation verbunden ist; und Bereitstellen der angeforderten Daten basierend auf der Durchquerung.

Description

  • Hintergrund
  • Computergeräte können Komponenten wie einen Prozessor, einen Speicher, ein Caching-System und ein Speichergerät enthalten. Das Speichergerät kann ein Festplattenlaufwerk sein, das ein magnetisches Medium zum Speichern und Abrufen von Datenblöcken verwendet. Einige Systeme können Kopien von wichtigen Daten für Archivierungs- und Wiederherstellungszwecke speichern oder „sichern“. Wenn beispielsweise ein Speichergerät ausfällt, kann eine Sicherungskopie verwendet werden, um die Daten wiederherzustellen, die auf dem ausgefallenen System gespeichert waren. In einigen Beispielen können Sicherungen periodisch durchgeführt werden, um Kopien der Daten zu verschiedenen Zeitpunkten zu erfassen.
  • Figurenliste
  • Einige Implementierungen werden mit Bezug auf die folgenden Abbildungen beschrieben.
    • ist eine schematische Darstellung eines Beispielsystems gemäß einiger Implementierungen.
    • ist eine Illustration eines Beispiel-Schlüsselwertindexes, in Übereinstimmung mit einigen Implementierungen.
    • sind Illustrationen von Beispielknoten eines Key-Value-Index, gemäß einiger Implementierungen.
    • sind Illustrationen von Beispiel-Baumstrukturen, gemäß einigen Implementierungen.
    • sind Abbildungen von Beispielprozessen gemäß einigen Implementierungen.
    • ist eine Illustration eines Beispielprozesses gemäß einiger Implementierungen.
    • ist eine Illustration eines Beispielprozesses gemäß einiger Implementierungen.
    • ist ein Diagramm eines beispielhaften maschinenlesbaren Mediums, das Befehle in Übereinstimmung mit einigen Implementierungen speichert.
    • ist eine schematische Darstellung eines Beispiel-Rechengeräts gemäß einigen Implementierungen.
  • In den Zeichnungen bezeichnen identische Referenznummern ähnliche, aber nicht notwendigerweise identische, Elemente. Die Abbildungen sind nicht notwendigerweise maßstabsgetreu, und die Größe einiger Teile kann zur besseren Veranschaulichung des gezeigten Beispiels übertrieben sein. Darüber hinaus bieten die Zeichnungen Beispiele und/oder Implementierungen, die mit der Beschreibung übereinstimmen; die Beschreibung ist jedoch nicht auf die in den Zeichnungen dargestellten Beispiele und/oder Implementierungen beschränkt.
  • Detaillierte Beschreibung
  • In der vorliegenden Offenlegung schließt die Verwendung des Begriffs „ein“, „ein“ oder „die“ auch die Pluralformen ein, sofern aus dem Kontext nicht eindeutig etwas anderes hervorgeht. Auch der Begriff „beinhaltet“, „einschließlich“, „umfasst“, „mit“, „haben“ oder „mit“, wenn er in dieser Offenbarung verwendet wird, spezifiziert das Vorhandensein der angegebenen Elemente, schließt aber das Vorhandensein oder die Zugabe anderer Elemente nicht aus.
  • In einigen Beispielen verwenden Speichersysteme Indizes, um Beziehungen oder Zuordnungen zwischen Schlüsseln und Werten (hier auch als „Schlüssel-Wert-Paare“ bezeichnet) anzuzeigen. Ein Beispiel für die Verwendung eines Schlüssel-Wert-Index ist ein Speichersystem, das eine Datendeduplizierung auf der Grundlage von „Fingerabdrücken“ eingehender Dateneinheiten durchführt, wobei jeder Fingerabdruck eine bestimmte Dateneinheit identifiziert. Ein Fingerabdruck einer eingehenden Dateneinheit wird mit einem Fingerabdruck-Index verglichen, der ein Schlüssel-Wert-Index sein kann, in dem Fingerabdrücke die Schlüssel und die entsprechenden Datenpositionen die Werte sind. Eine Übereinstimmung zwischen dem Fingerabdruck und einem im Fingerabdruck-Index gespeicherten Fingerabdruck zeigt an, dass die eingehende Dateneinheit möglicherweise ein Duplikat einer bereits im Speichersystem gespeicherten Dateneinheit ist. Wenn die eingehende Dateneinheit ein Duplikat einer bereits gespeicherten Dateneinheit ist, kann, anstatt die doppelte eingehende Dateneinheit zu speichern, ein im Speichersystem gespeicherter Referenzzähler inkrementiert werden, um die Anzahl der empfangenen Instanzen der Dateneinheit anzuzeigen. In einigen Beispielen kann der Schlüssel-Wert-Index die Form eines Baums mit hierarchisch angeordneten Knoten haben.
  • Ein „Fingerabdruck“ bezieht sich auf einen Wert, der durch Anwendung einer Funktion auf den Inhalt der Dateneinheit abgeleitet wird (wobei der „Inhalt“ die Gesamtheit oder eine Teilmenge des Inhalts der Dateneinheit umfassen kann). Ein Beispiel für eine Funktion, die angewendet werden kann, ist eine Hash-Funktion, die einen Hash-Wert auf der Grundlage der eingehenden Dateneinheit erzeugt. Beispiele für Hash-Funktionen sind kryptografische Hash-Funktionen wie die Secure Hash Algorithm 2 (SHA-2) Hash-Funktionen, z. B. SHA-224, SHA-256, SHA-384 usw. In anderen Beispielen können auch andere Arten von Hash-Funktionen oder andere Arten von Fingerprint-Funktionen verwendet werden.
  • Ein „Speichersystem“ kann ein Speichergerät oder ein Array von Speichergeräten umfassen. Ein Speichersystem kann auch einen oder mehrere Speicher-Controller enthalten, die den Zugriff auf das/die Speichergerät(e) verwalten. Eine „Dateneinheit“ kann sich auf jeden Teil der Daten beziehen, der im Speichersystem separat identifiziert werden kann. In einigen Fällen kann sich eine Dateneinheit auf einen Chunk, eine Sammlung von Chunks oder einen anderen Teil von Daten beziehen. In einigen Beispielen kann ein Speichersystem Dateneinheiten in einem persistenten Speicher speichern. Die persistente Speicherung kann mit einem oder mehreren persistenten (z. B. nichtflüchtigen) Speichergeräten, wie z. B. plattenbasierten Speichergeräten (z. B. Festplattenlaufwerken (HDDs)), Solid-State-Geräten (SSDs), wie z. B. Flash-Speichergeräten oder Ähnlichem, oder einer Kombination davon implementiert werden.
  • Ein „Controller“ kann sich auf eine Hardware-Verarbeitungsschaltung beziehen, die eine beliebige oder eine Kombination aus einem Mikroprozessor, einem Kern eines Multi-Core-Mikroprozessors, einem Mikrocontroller, einer programmierbaren integrierten Schaltung, einem programmierbaren Gate-Array, einem digitalen Signalprozessor oder einer anderen Hardware-Verarbeitungsschaltung umfassen kann. Alternativ kann sich ein „Controller“ auf eine Kombination aus einer Hardware-Verarbeitungsschaltung und maschinenlesbaren Anweisungen (Software und/oder Firmware) beziehen, die auf der Hardware-Verarbeitungsschaltung ausführbar sind.
  • In einigen Beispielen kann ein „Snapshot“ den Zustand einer Datenstruktur (z. B. eines Key-Value-Index) zu einem bestimmten Zeitpunkt darstellen. Ein bestimmter Snapshot kann z. B. verwendet werden, um einen Key-Value-Index so wiederherzustellen oder zu analysieren, wie er zu einem bestimmten Zeitpunkt existierte. Einige Snapshots können jedoch die Speicherung mehrerer Kopien jedes Elements eines Index (z. B. eines Knotens) und die Speicherung zusätzlicher Datenstrukturen beinhalten, um zu verfolgen und zu identifizieren, welche Kopien den einzelnen Snapshots entsprechen. Dementsprechend kann eine erhebliche Menge an Verarbeitung und Festplattenbandbreite erforderlich sein, um die gespeicherten Daten zu laden, zu bestimmen, welche Elemente in einem bestimmten Snapshot enthalten sind, und die enthaltenen Elemente zu verwenden, um einen bestimmten Snapshot zu erzeugen.
  • In Übereinstimmung mit einigen Implementierungen der vorliegenden Offenlegung kann ein Schlüssel-Wert-Index als Baumstruktur gespeichert werden, in der jeder interne Knoten (hier als „indirekter“ Knoten bezeichnet) einen Puffer zum Speichern von Schlüssel-Wert-Paaren enthalten kann (auch als „Knotenpuffer“ bezeichnet). Wenn der Füllstand des Puffers einen Schwellenwert erreicht, können die Schlüssel-Wert-Paare an untergeordnete Knoten (z. B. andere indirekte Knoten oder Blattknoten) übertragen werden. In einigen Implementierungen kann jedes Schlüssel-Wert-Paar mit einem Generierungsbezeichner verknüpft sein, der die „Generation“ des Schlüssel-Wert-Paares angibt, die einem bestimmten Zeitpunkt oder Zeitraum entsprechen kann. Der Generierungsbezeichner kann beispielsweise eine Nummer eines bestimmten Schnappschusses sein (z. B. „1“ für den ersten Schnappschuss, „2“ für den zweiten Schnappschuss usw.). Außerdem kann ein indirekter Knoten Zeiger auf die untergeordneten Knoten und/oder auf Teile seines Puffers (als Pufferstücke bezeichnet) enthalten. Jeder Zeiger kann mit einem Generationsbezeichner für das Element verbunden sein, auf das er zeigt.
  • In einigen hier beschriebenen Implementierungen kann das Bereitstellen oder Lesen eines Schnappschusses die Durchführung einer Traversierung von Knoten des Indexes beinhalten, wobei die Traversierung an einem Wurzelknoten beginnt, der einer bestimmten Generation entspricht. Die Traversierung kann die Verwendung der Generationsbezeichner in Zeigern und Schlüssel-Wert-Paaren beinhalten, um die Baumstruktur des Index zu bestimmen, wie sie zum Zeitpunkt der bestimmten Generation bestand. Diese Baumstruktur kann Teilbäume aus früheren Generationen enthalten oder „ausleihen“ (z. B. einen Teilbaum, der in der bestimmten Generation nicht geändert wurde). Die Verwendung dieser Baumstruktur kann das Scannen und Laden von Daten aus verschiedenen Generationen reduzieren und somit eine relativ schnelle Erstellung eines Snapshots ermöglichen. Darüber hinaus kann die gemeinsame Nutzung von Knoten in den Baumstrukturen verschiedener Generationen die Menge an Ressourcen reduzieren, die für die Pflege der Snapshots erforderlich sind (z. B. CPU-Bandbreite, Speicher, Storage usw.). Auf diese Weise können einige Implementierungen die Leistung des Indexes verbessern. Darüber hinaus kann eine solche gemeinsame Nutzung von Teilbäumen andere Operationen optimieren, wie z. B. die Prüfsummenberechnung (z. B. inkrementelle Berechnung nur für geänderte Teile), die Replikation unter Verwendung inkrementeller Änderungen, das Löschen von Snapshots und so weiter.
  • 1. Speichersystem inklusive Key-Value-Index mit Knotenpuffern
  • zeigt ein Beispiel für ein Speichersystem 100, das gemäß einigen Implementierungen einen Speicher-Controller 110 und einen persistenten Speicher 140 umfasst. Wie dargestellt, kann der Speicher-Controller 110 eine Update-Engine 120, eine Merge-Engine 150, eine Snapshot-Engine 170, einen Speicher 130 und eine Query-Engine 160 enthalten. In einigen Beispielen kann der Speicher 130 einen Aktualisierungspuffer 135 enthalten, und der dauerhafte Speicher 140 kann einen Schlüssel-Wert-Index 145 enthalten. In einigen Implementierungen kann der Schlüsselwertindex 145 Schlüsselwertdaten enthalten, die als ein Knotenbaum organisiert sind. Eine Beispielimplementierung des Schlüsselwertindexes 145 wird im Folgenden unter Bezugnahme auf beschrieben. In einigen Beispielen kann der dauerhafte Speicher 140 ein oder mehrere nicht transitorische Speichermedien wie Festplattenlaufwerke (HDDs), Solid-State-Laufwerke (SSDs), optische Festplatten usw. oder eine Kombination davon umfassen. Der Speicher 130 kann Halbleiterspeichergeräte wie dynamische oder statische Direktzugriffsspeicher (DRAMs oder SRAMs), nichtflüchtige Dual-Inline-Speichermodule (NVDIMMs) usw. umfassen.
  • In einigen Implementierungen kann die Update-Engine 120 ein Update 105 für den Schlüsselwertindex 145 im permanenten Speicher 140 empfangen. Zum Beispiel kann jede Aktualisierung 105 ein Schlüssel-Wert-Paar sein, das dem Schlüssel-Wert-Index 145 hinzugefügt werden soll. In einigen Beispielen kann die Aktualisierungs-Engine 120 alle oder einen Teil der Aktualisierung 105 in einem Aktualisierungspuffer 135 speichern, der im Speicher 130 abgelegt ist. Außerdem kann die Merge-Engine 150 den Schlüssel-Wert-Index 145 mit Schlüssel-Wert-Paaren aktualisieren, die im Aktualisierungspuffer 135 gespeichert sind. Beachten Sie, dass, obwohl in nur ein Aktualisierungspuffer 135 dargestellt ist, die Speichersteuerung 110 in anderen Beispielen mehrere Aktualisierungspuffer 135 enthalten kann. In einigen Beispielen kann der Speicher 130 in einem oder mehreren flüchtigen Speichergeräten implementiert sein.
  • In einigen Implementierungen kann die Abfrage-Engine 160 eine Abfrage 165 empfangen, die einen gegebenen Schlüssel zu einem bestimmten Zeitpunkt spezifiziert, und kann auf den Schlüssel-Wert-Index 145 (und den Aktualisierungspuffer 135 in einigen Beispielen) zugreifen oder mit ihm interagieren, um den Wert zu bestimmen, der mit dem in der Abfrage 165 spezifizierten Schlüssel übereinstimmt. Ferner kann die Abfrage-Engine 160 den passenden Wert als Antwort auf die Abfrage 165 zurückgeben. In einigen Beispielen kann die Abfrage 165 eine vom Benutzer erstellte Abfrage sein (z. B. eine Leseanforderung für ein Datenelement).
  • In einigen Implementierungen kann die Snapshot-Engine 170 eine aktuelle Generation des Schlüsselwertindexes 145 identifizieren oder pflegen. Die aktuelle Generation kann periodisch und/oder pro Anforderung (z. B. Benutzer- oder Systembefehl) inkrementiert werden. Jeder Schnappschuss kann dem Zustand des Schlüssel-Wert-Index 145 zu dem Zeitpunkt entsprechen, an dem die Generation inkrementiert wird, und kann mit der unmittelbar vorangehenden Generation verknüpft sein. Wenn beispielsweise die aktuelle Generation von Generation 2 („G2“) auf Generation 3 („G3“) erhöht wird, wird ein Schnappschuss, der mit G2 verknüpft ist, abgeschlossen oder „eingefroren“. Anders ausgedrückt: Die im G2-Snapshot enthaltenen Schlüsselwertdaten können nicht mehr geändert werden, sobald die aktuelle Generation auf G3 hochgezählt wird. In einigen Beispielen wird ein Snapshot als abgeschlossen betrachtet, wenn alle anstehenden Aktualisierungen im Schlüsselwertindex 145 durchgeführt wurden (d. h. nach Abschluss eines Aktualisierungsprozesses durch die Merge-Engine 150).
  • In einigen Implementierungen können die Snapshot-Engine 170 und/oder die Update-Engine 120 Generierungsbezeichner mit entsprechenden Elementen des Schlüssel-Wert-Index 145 verknüpfen. In einigen Beispielen kann der Generierungsbezeichner in einem Feld angegeben werden, das in einem Element enthalten ist oder an ein Element angehängt wird. Zum Beispiel kann die Aktualisierungs-Engine 120 Generierungskennungen in Felder einfügen, die mit Schlüssel-Wert-Paaren verbunden sind, die im Schlüssel-Wert-Index 145 hinzugefügt oder aktualisiert werden. Ferner kann die Aktualisierungs-Engine 120 in einigen Beispielen Generierungskennungen in Felder einfügen, die in Zeigern der indirekten Knoten des Schlüsselwertindex 145 enthalten sind (z. B. Zeiger auf untergeordnete Knoten, Zeiger auf Pufferabschnitte usw.). In einigen Beispielen ist der Generierungsbezeichner ein Teil der in jedem Zeiger angegebenen Adresse.
  • In einigen Implementierungen kann die Snapshot-Engine 170 einen Snapshot bereitstellen oder lesen, indem sie eine Traversierung des Schlüsselwertindex 145 durchführt, die an einem Wurzelknoten beginnt, der einer bestimmten Generation entspricht. Ferner kann die Snapshot-Engine 170 die Generationskennungen verwenden, um die Baumstruktur des Schlüsselwertindexes 145 zu bestimmen, wie sie zu dem mit der bestimmten Generation verbundenen Zeitraum existierte. In einigen Beispielen kann die ermittelte Baumstruktur Unterbäume (d. h. Teilbereiche des Gesamtbaums) enthalten, die auch in früheren Generationen enthalten sind. Auf diese Weise kann die Snapshot-Engine 170 einen relativ schnellen Zugriff auf einen bestimmten Snapshot ermöglichen und die mit der Erstellung von Snapshots verbundene Leistung verbessern. Die Funktionalität der Snapshot-Engine 170 und des Key-Value-Index 145 wird weiter unten mit Bezug auf die beschrieben.
  • Wie hier verwendet, kann sich eine „Engine“ auf eine Hardware-Verarbeitungsschaltung beziehen, die eine beliebige oder eine Kombination aus einem Mikroprozessor, einem Kern eines Multi-Core-Mikroprozessors, einem Mikrocontroller, einer programmierbaren integrierten Schaltung, einem programmierbaren Gate-Array, einem digitalen Signalprozessor oder einer anderen Hardware-Verarbeitungsschaltung umfassen kann. Alternativ kann sich eine „Engine“ auf eine Kombination aus einer Hardware-Verarbeitungsschaltung und maschinenlesbaren Anweisungen (Software-Anweisungen und/oder Firmware-Anweisungen, die auf mindestens einem maschinenlesbaren Speichermedium gespeichert sind) beziehen, die auf der Hardware-Verarbeitungsschaltung ausführbar sind.
  • 2. Beispiel für einen Schlüssel-Wert-Index mit Knotenpuffern
  • zeigt eine Illustration eines Beispiel-Schlüsselwertindex 200, gemäß einigen Implementierungen. In einigen Beispielen kann der Schlüssel-Wert-Index 200 im Allgemeinen einer Beispielimplementierung des Schlüssel-Wert-Index 145 (in dargestellt) entsprechen. Ferner kann der Schlüsselwertindex 200 in einigen Beispielen von der Speichersteuerung 110 (in dargestellt) erzeugt werden. In einigen Beispielen kann der Schlüssel-Wert-Index 200 Fingerabdrücke von Dateneinheiten auf Speicherorte dieser Dateneinheiten abbilden. In anderen Beispielen kann der Schlüssel-Wert-Index 200 ein Blockindex sein, der ein Volumen oder einen Offset auf eine Kombination aus einer Erzeugungskennung und einer Speicherplatzkennung (z. B. eine fortlaufende Blocknummer) abbildet. In noch anderen Beispielen kann der Schlüssel-Wert-Index 200 ein Plattenindex sein, der verschiedene Typen von Blöcken zusammen mit anderen Informationen (z. B. einem vollständigen Fingerabdruck, einer komprimierten Größe des Blocks usw.) auf ihre Speicherplätze abbildet. Andere Kombinationen der obigen Angaben oder Variationen davon sind ebenfalls möglich.
  • Wie in dargestellt, kann der Schlüssel-Wert-Index 200 in einer Baumstruktur mit mehreren Knoten angeordnet sein. Die Knoten können in verschiedenen Ebenen organisiert sein, die Eltern-Kind-Beziehungen bilden. Beispielsweise kann eine erste Ebene 210 einen Wurzelknoten 211 enthalten, und eine zweite Ebene 220 kann indirekte Knoten 221-224 enthalten, die Kinder des Wurzelknotens 211 sind. Ferner kann eine dritte Ebene 230 indirekte Knoten 231-234 enthalten, die Kinder des indirekten Knotens 222 (in der zweiten Ebene 220) sind, und eine vierte Ebene 240 kann Blattknoten 241-244 enthalten, die Kinder des indirekten Knotens 233 (in der dritten Ebene 230) sind. In einigen Beispielen kann die Anzahl der untergeordneten Knoten, die sich auf jeden übergeordneten Knoten beziehen, durch einen Fan-Out-Parameter angegeben werden, der mit dem Schlüsselwertindex 200 verbunden ist.
  • In den vorliegenden Beispielen kann jeder Knoten eines Schlüsselwertindexes entweder ein Blattknoten oder ein indirekter Knoten sein (d. h. ein beliebiger Knoten außer einem Blattknoten, einschließlich des Wurzelknotens). In einigen Implementierungen kann jeder indirekte Knoten des Schlüsselwertindex 200 (z. B. Wurzelknoten 211, indirekte Knoten 221-224, indirekte Knoten 231-234) einen Puffer (hier auch als „Knotenpuffer“ bezeichnet und in nicht dargestellt) zum Speichern von Schlüsselwertdaten enthalten. In einigen Beispielen kann jeder Blattknoten des Schlüsselwertindex 200 Schlüsselwertdaten speichern. Eine Beispielimplementierung eines indirekten Knotens, der einen Knotenpuffer enthält, wird im Folgenden unter Bezugnahme auf beschrieben.
  • In einigen Implementierungen können die Knoten des Key-Value-Index 200 schrittweise von oben nach unten in der Baumstruktur erzeugt werden. Bei der Initialisierung des Schlüsselwertindex 200 (z. B. bei der ersten Verwendung) kann der Schlüsselwertindex 200 beispielsweise nur den Wurzelknoten 211 enthalten. In diesem Beispiel können die Schlüssel-Wert-Paare, die dem Schlüssel-Wert-Index 200 hinzugefügt werden, in einem Knotenpuffer des Wurzelknotens 211 gespeichert werden.
  • In einigen Implementierungen kann ein Verdichtungsprozess ausgelöst werden, wenn die im Knotenpuffer des Stammknotens 211 gespeicherten Schlüsselwertdaten einen Schwellenwert erreichen (z. B. eine bestimmte Anzahl gespeicherter Schlüsselwertpaare, einen bestimmten Prozentsatz der Gesamtkapazität usw.). Wie hier verwendet, kann sich „Verdichtung“ auf die Übertragung von Schlüsselwertdaten von einem übergeordneten Knoten zu einem oder mehreren untergeordneten Knoten beziehen. In einigen Beispielen können bei der ersten Verdichtung des Stammknotens 211 die indirekten Knoten 221-224 (d. h. die unmittelbaren Kinder des Stammknotens 211) erzeugt werden. Außerdem können bei jeder Verdichtung des Wurzelknotens 211 die im Knotenpuffer des Wurzelknotens 211 gespeicherten Schlüsselwertdaten an die Knotenpuffer der indirekten Knoten 221-224 übertragen werden. Wie hierin verwendet, bezieht sich „Übertragen“ von Daten auf das Verschieben der Daten zu einem Zielknoten, so dass die Daten nicht mehr in einem Quellknoten vorhanden sind. In einigen Beispielen kann jeder der indirekten Knoten 221-224 mit einem anderen Teil des Bereichs von Schlüsseln im Knotenpuffer des Stammknotens 211 verbunden sein. Dementsprechend kann in solchen Beispielen jedes der Schlüssel-Wert-Paare des Wurzelknotens 211 auf einen anderen der untergeordneten Knoten 221-224 verteilt werden, und zwar entsprechend dem Bereich, der jedem untergeordneten Knoten zugeordnet ist. Sobald die Verdichtung des Wurzelknotens 211 abgeschlossen ist, ist der Knotenpuffer des Wurzelknotens 211 leer, und danach werden alle neuen Schlüsselwertaktualisierungen, die am Wurzelknoten 211 empfangen werden, im Knotenpuffer des Wurzelknotens 211 gespeichert. In einigen Beispielen führt eine „teilweise Verdichtung“ des Wurzelknotens 211 dazu, dass der Knotenpuffer teilweise leer ist, um zumindest einige Schlüsselwertaktualisierungen aufzunehmen.
  • In einigen Implementierungen kann der oben beschriebene Verdichtungsprozess in ähnlicher Weise für jeden indirekten Knoten wiederholt werden. Wenn beispielsweise der indirekte Knoten 222 zum ersten Mal verdichtet wird (d. h. wenn der Knotenpuffer des indirekten Knotens 222 einen Schwellenwert erreicht), können die indirekten Knoten 231-234 (d. h. die unmittelbaren Kinder des indirekten Knotens 222) erzeugt werden, und die im Knotenpuffer des indirekten Knotens 222 gespeicherten Schlüsselwertdaten können an die Knotenpuffer der indirekten Knoten 231-234 übertragen werden. In einem anderen Beispiel können bei der ersten Verdichtung des indirekten Knotens 233 die Blattknoten 241-244 (d. h. die unmittelbaren Kinder des indirekten Knotens 233) erzeugt werden, und die im Knotenpuffer des indirekten Knotens 233 gespeicherten Schlüsselwertdaten können an die Blattknoten 241-244 übertragen werden.
  • In einigen Implementierungen kann der Schlüssel-Wert-Index 200 jeden Schlüssel und den entsprechenden Wert als zwei separate gespeicherte Elemente speichern. Allerdings sind die Implementierungen in dieser Hinsicht nicht beschränkt. In einigen Implementierungen kann der Schlüssel beispielsweise durch den Offset oder die Position des entsprechenden Wertes innerhalb eines Knotens oder Speicherelements impliziert oder angezeigt werden. In solchen Implementierungen kann sich ein „Schlüssel-Wert-Paar“ auf einen gespeicherten Wert beziehen, der mit einem impliziten Schlüssel verbunden ist.
  • Beachten Sie, dass andere indirekte Knoten in verschiedenen Ebenen des Schlüsselwertindex 200 untergeordnete Knoten haben können, obwohl dies in aus Gründen der Übersichtlichkeit nicht dargestellt ist. Zum Beispiel könnte der indirekte Knoten 221 mehrere untergeordnete Knoten in der dritten Ebene 230 haben, der indirekte Knoten 234 könnte mehrere untergeordnete Knoten in der vierten Ebene 240 haben, und so weiter im Laufe der Zeit im gesamten Schlüsselwertindex 200.
  • In einigen Implementierungen kann der Schlüsselwertindex 200 mehrere Wurzelknoten enthalten, die mehrere Baumstrukturen bilden (in nicht dargestellt). Die mehreren Baumstrukturen können sich Teilbereiche teilen (z. B. eine Teilmenge von Knoten) und können verschiedenen Generationen des Schlüsselwertindex 200 entsprechen. Jede dieser Baumstrukturen kann verwendet werden, um einen Schnappschuss des Zustands des Schlüsselwertindex 200 zu einem bestimmten Zeitpunkt zu erstellen. Die Erzeugung von Schnappschüssen wird weiter unten unter Bezugnahme auf .
  • 3. Beispielknoten des Key-Value-Index
  • zeigt eine Illustration eines beispielhaften indirekten Knotens 300 in Übereinstimmung mit einigen Implementierungen. Der indirekte Knoten 300 kann im Allgemeinen einer Beispielimplementierung eines der in dargestellten indirekten Knoten entsprechen (z. B. Wurzelknoten 211, indirekte Knoten 221-224 und/oder indirekte Knoten 231-234). Wie in gezeigt, kann der indirekte Knoten 300 einige oder alle Child-Zeiger 310, Fence-Zeiger 320, einen Bloom-Filter 330 und/oder einen Knotenpuffer 340 enthalten.
  • In einigen Implementierungen kann der Knotenpuffer 340 mehrere Pufferabschnitte 345A-345N (hier auch als „Pufferabschnitte 345“ bezeichnet) enthalten, um Schlüssel-Wert-Daten zu speichern (z. B. einen Fingerabdruck einer Dateneinheit und einen entsprechenden Speicherplatzindikator für diese Dateneinheit 107). Die Pufferchunks 345A-345N können in der Reihenfolge der Schlüssel angeordnet sein (z. B. in numerischer Reihenfolge, in alphabetischer Reihenfolge usw.). Beispielsweise kann der Pufferchunk 345A Schlüsselwertdaten für einen niedrigsten Bereich von Schlüsseln speichern, während der Pufferchunk 345N Schlüsselwertdaten für einen höchsten Bereich von Schlüsseln speichern kann. In einigen Beispielen kann jeder der Pufferchunks 345 gleich oder ähnlich groß sein (z. B. 32 kb, 64kb usw.). In einigen Implementierungen kann die Größe des Knotenpuffers 340 basierend auf einem Pegelverhältnis bestimmt werden. In einigen Beispielen kann das Ebenenverhältnis ein festes Verhältnis zwischen den Gesamtpuffergrößen in zwei benachbarten Ebenen eines Schlüsselwertindexes sein. Darüber hinaus kann das Pegelverhältnis auf der Grundlage von benutzerdefinierten Parametern bestimmt werden, um das Niveau der Schreibverstärkung abzustimmen, die mit dem Schlüsselwertindex verbunden ist.
  • In einigen Implementierungen können die untergeordneten Zeiger 310 auf alle Knoten zeigen oder diese anderweitig identifizieren, die unmittelbare untergeordnete Knoten des indirekten Knotens 300 sind. Beispielsweise kann der Wurzelknoten 211 unter Bezugnahme auf den (in dargestellten) Schlüsselwertindex 200 entsprechende untergeordnete Zeiger 310 enthalten, die auf jeden der indirekten Knoten 221-224 (d. h. die unmittelbaren untergeordneten Knoten des Wurzelknotens 211) zeigen. In einigen Beispielen können die untergeordneten Zeiger 310 das erste Mal erzeugt werden, wenn der indirekte Knoten 300 verdichtet wird (z. B. wenn der Knotenpuffer 340 einen vordefinierten Schwellenwert erreicht).
  • In einigen Implementierungen kann der Bloom-Filter 330 die Bestimmung ermöglichen, welche Schlüssel nicht im Knotenpuffer 340 enthalten sind und welche Schlüssel im Knotenpuffer 340 enthalten sein könnten (d. h., mit der Möglichkeit von falsch-positiven Meldungen). Anders ausgedrückt, der Bloom-Filter 330 zeigt die Schlüssel an, die nicht im Knotenpuffer 340 enthalten sind, und zeigt die Schlüssel an, die im Knotenpuffer 340 enthalten sein könnten, wobei die Möglichkeit besteht, dass er zumindest für einige Schlüssel eine falschpositive Anzeige liefert (d. h. anzeigt, dass ein Schlüssel im Knotenpuffer 340 enthalten ist, obwohl er es nicht ist). Wenn der Bloom-Filter 330 anzeigt, dass ein bestimmter Schlüssel nicht im Knotenpuffer 340 enthalten ist, ist es dementsprechend möglich, Verarbeitungszeit und/oder Bandbreite zu vermeiden, die mit dem Laden dieses Knotenpuffers 340 in den Speicher und der Suche nach diesem bestimmten Schlüssel verbunden sind, da die Verwendung des Bloom-Filters 330 genau anzeigen kann, wenn der Schlüssel nicht im Knotenpuffer 340 enthalten ist. Wenn der Bloom-Filter 330 dagegen anzeigt, dass ein bestimmter Schlüssel im Knotenpuffer 340 enthalten ist, kann der Knotenpuffer 340 dann nach diesem bestimmten Schlüssel durchsucht werden. In einigen Implementierungen können die Bloom-Filter 330 auf verschiedenen Ebenen eines Index so bemessen sein, dass die Bloom-Filter 300 in indirekten Knoten 300 auf höheren Ebenen (d. h. näher am Wurzelknoten) mit relativ geringeren Falsch-Positiv-Raten verbunden sind als die auf niedrigeren Ebenen (d. h. näher an den Blattknoten).
  • In einigen Implementierungen können beim Durchsuchen des Knotenpuffers 340 nach einem bestimmten Schlüssel die Zaunzeiger 320 verwendet werden, um einen bestimmten Pufferabschnitt 345 zu identifizieren, der wahrscheinlich Daten speichert, die dem bestimmten Schlüssel zugeordnet sind. In einigen Beispielen können die Zaunzeiger 320 die niedrigsten und/oder höchsten Schlüsselwerte jedes Pufferabschnitts 345 identifizieren. Zum Beispiel kann jeder Zaunzeiger 320 die untere Grenze der Schlüsselwerte identifizieren, die in einem entsprechenden Pufferchunk 345 enthalten sind. Daher können die Zaunzeiger 320 verwendet werden, um zu identifizieren, welcher Pufferabschnitt 345 den Schlüsselbereich enthält, in den der gesuchte Schlüssel fällt. Anstatt den gesamten Knotenpuffer 340 in den Speicher zu laden, muss dementsprechend nur der identifizierte Pufferabschnitt 345 in den Speicher geladen werden. Auf diese Weise können die Zaunzeiger 320 die Leseverstärkung in Verbindung mit dem indirekten Knoten 300 reduzieren.
  • In einigen Implementierungen können die Puffer-Blöcke 345 zusammen oder in separaten Datenblöcken gespeichert werden. Außerdem können die Pufferblöcke 345 getrennt von den übrigen Elementen des indirekten Knotens 300 (d. h. von den Kindzeigern 310, den Zaunzeigern 320 und/oder dem Bloom-Filter 330) gespeichert werden. In einigen Beispielen können die Child-Zeiger 310, die Fence-Zeiger 320 und der Bloom-Filter 330 in den Speicher geladen werden, bevor einer der Puffer-Blöcke 345 in den Speicher geladen wird. Wenn der Bloom-Filter 330 anzeigt, dass ein gesuchter Schlüssel im Knotenpuffer 340 enthalten ist, können die Zaunzeiger 320 zur Identifizierung eines einzelnen Pufferstücks 345 verwendet werden, und nur dieses identifizierte Pufferstück 345 wird dann in den Speicher geladen.
  • In einigen Implementierungen können die untergeordneten Zeiger 310 und/oder die Zaunzeiger 320 mit Generationskennungen (in nicht dargestellt) für die Elemente, auf die gezeigt wird, verbunden sein. Beispielsweise kann ein untergeordneter Zeiger 310 einen Generationsbezeichner enthalten, der eine bestimmte Generation angibt, in der der entsprechende untergeordnete Knoten (d. h. der untergeordnete Knoten, auf den dieser untergeordnete Zeiger 310 zeigt) zuletzt geändert (z. B. erzeugt oder aktualisiert) wurde. In einem anderen Beispiel kann ein Zaunzeiger 320 einen Generationsbezeichner enthalten, der eine bestimmte Generation angibt, in der das entsprechende Pufferstück 345 zuletzt geändert wurde.
  • zeigt eine Illustration eines Beispiel-Blattknotens 350, gemäß einigen Implementierungen. Der Blattknoten 350 kann im Allgemeinen einer Beispielimplementierung eines der in gezeigten Blattknoten entsprechen (z. B. Blattknoten 241-244). Wie in gezeigt, kann der Blattknoten 350 Schlüsselwertdaten 360 enthalten. In einigen Implementierungen kann jedes Schlüssel-Wert-Paar in den Schlüssel-Wert-Daten 360 mit einem Generations-Identifikator (in nicht dargestellt) verknüpft sein, der eine bestimmte Generation angibt, in der dieses Schlüssel-Wert-Paar zuletzt geändert wurde.
  • 4. Beispielbaumstrukturen für Schnappschüsse
  • zeigen beispielhafte Baumstrukturen, gemäß einigen Implementierungen. In einigen Beispielen können die in den dargestellten Baumstrukturen können in einigen Beispielen von der Snapshot-Engine 170 (in dargestellt) verwendet werden. Ferner können in einigen Beispielen die in dargestellten Baumstrukturen im Allgemeinen dem Zustand eines Schlüsselwertindexes (z. B. dem in dargestellten Schlüsselwertindex 200) zu einem bestimmten Zeitpunkt entsprechen.
  • Bezugnehmend auf ist eine erste Baumstruktur 401 zu einem ersten Zeitpunkt dargestellt. Die erste Baumstruktur 401 enthält einen Wurzelknoten 411-1, indirekte Knoten 421-1 und 425-1 sowie Blattknoten 431-1, 432-1, 433-1 und 434-1. Beachten Sie, dass in der Übersichtlichkeit halber nur zwei Kinder jedes indirekten Knotens dargestellt sind, und dass Implementierungen in dieser Hinsicht nicht beschränkt sind. Beachten Sie auch, dass jeder der indirekten Knoten (z. B. der Wurzelknoten 411-1 und die indirekten Knoten 421-1) einen Knotenpuffer, einen Bloom-Filter usw. enthalten könnte (wie in dargestellt), obwohl dies in aus Gründen der Übersichtlichkeit nicht gezeigt wird.
  • Nehmen wir an, dass den Zustand eines Schlüsselwertindexes darstellt, wie er unmittelbar vor dem Inkrementieren der aktuellen Generation von einer ersten Generation („G1“) zu einer zweiten Generation („G2“) besteht, und dass keine Aktualisierungen des Indexes anstehen (z. B. im Aktualisierungspuffer 135 in ). Dementsprechend entspricht die erste Baumstruktur 401 einem Snapshot für die erste Generation G1 und kann hier als „G1-Snapshot“ bezeichnet werden. In einigen Implementierungen kann die Snapshot-Engine 170 (in dargestellt) Daten des G1-Snapshots lesen, indem sie die erste Baumstruktur 401 in einem Schlüsselwertindex durchläuft (z. B. der in dargestellte Schlüsselwertindex 200). Der Schlüsselwertindex kann Knoten (d. h. Wurzelknoten, indirekte Knoten und Blattknoten) enthalten, die verschiedenen Generationen entsprechen. In einigen Implementierungen kann der Traversalprozess zum Lesen von Daten des G1-Snapshots mit der Identifizierung eines bestimmten Wurzelknotens (z. B. Wurzelknoten 411-1) beginnen, der mit dem Generationsidentifikator „G1“ verknüpft ist. Wie in gezeigt, kann der Wurzelknoten 411-1 in einigen Implementierungen einen G1-Generierungsbezeichner enthalten, der für den Knoten als Ganzes gilt (auch als „Generierungsbezeichner auf Knotenebene“ bezeichnet). In anderen Implementierungen kann der mit G1 assoziierte Wurzelknoten jedoch durch einen Zeiger auf den Wurzelknoten 411-1 identifiziert werden, der den G1-Generierungsbezeichner enthält (z. B. als Teil der Adresse oder des Bezeichners des Wurzelknotens 411-1).
  • Nach der Identifizierung des Wurzelknotens 411-1 kann der Traversalprozess zum Lesen des G1-Snapshots fortgesetzt werden, indem man den untergeordneten Zeigern P1 und P2 folgt, um die untergeordneten indirekten Knoten 421-1 und 425-1 zu identifizieren. Wie gezeigt, ist jeder der untergeordneten Zeiger P1 und P2 mit der G1-Generationenkennung verknüpft, wodurch angezeigt wird, dass die untergeordneten indirekten Knoten 421-1 und 425-1 jeweils mit der ersten Generation G1 verknüpft sind. Beachten Sie, dass in die G1-Generationenkennung zwar zur Veranschaulichung an die Zeiger P1 und P2 angehängt ist, Implementierungen in dieser Hinsicht jedoch nicht beschränkt sind. Beispielsweise kann jeder Zeiger ein Feld enthalten, das mit dem Generationsbezeichner gefüllt ist. In einem anderen Beispiel kann der Generationsbezeichner ein Teil des Zielbezeichners jedes Zeigers sein. Andere Beispiele sind möglich.
  • Als nächstes kann der Traversalprozess zum Lesen des G1-Snapshots fortgesetzt werden, indem die untergeordneten Zeiger P3, P4, P5 und P6 verfolgt werden, um jeweils die untergeordneten Blattknoten 431-1, 432-1, 433-1 und 434-1 zu identifizieren. Wie gezeigt, sind die untergeordneten Zeiger P3, P4, P5 und P6 mit der G1-Generationenkennung verknüpft, wodurch angezeigt wird, dass die Blattknoten 431-1, 432-1, 433-1 und 434-1 mit der ersten Generation G1 verknüpft sind. Außerdem enthalten die Blattknoten 431-1, 432-1, 433-1 und 434-1, wie gezeigt, verschiedene Schlüssel-Wert-Paare K0-K7. Wie hier verwendet, bezieht sich die Notation „K0“ auf ein Schlüssel-Wert-Paar für Schlüssel 0, die Notation „K7“ auf ein Schlüssel-Wert-Paar für Schlüssel 7 und so weiter. Jedes der Schlüssel-Wert-Paare K0-K7 ist mit der G1-Generationenkennung verbunden, wodurch angezeigt wird, dass jedes dieser Schlüssel-Wert-Paare mit der ersten Generation G1 verbunden ist. Im Beispiel von ist die erste Baumstruktur 401 eine Momentaufnahme des Schlüssel-Wert-Indexes, der der ersten Generation G1 zugeordnet ist (d. h. die „G1-Momentaufnahme“).
  • In sind die erste Baumstruktur 401 und eine zweite Baumstruktur 402 zu einem zweiten Zeitpunkt (z. B. nach dem ersten Zeitpunkt von dargestellt. Nehmen wir an, dass den Zustand des Schlüsselwertindexes darstellt, wie er während einer zweiten Generation G2, aber vor nachfolgenden Aktualisierungen, die während der zweiten Generation G2 auftreten, besteht. Anders ausgedrückt: Die zweite Baumstruktur 402 ist für die zweite Generation G2 noch nicht fertiggestellt und stellt daher keine Momentaufnahme für die zweite Generation G2 dar.
  • Im Beispiel von können die erste und zweite Baumstruktur 401 und 402 beide in einem Datenspeicher des Key-Value-Index enthalten sein (z. B. der in dargestellte persistente Speicher 140). Dementsprechend kann der Datenspeicher gleichzeitig zwei verschiedene Wurzelknoten 411-1 und 411-2 enthalten, die der ersten und zweiten Generation G1 und G2 entsprechen. In einigen Implementierungen wurde der Wurzelknoten 411-2, der der zweiten Generation G2 zugeordnet ist, erstellt, als die aktuelle Generation des Index von G1 auf G2 inkrementiert wurde.
  • Wie in gezeigt, ist der untergeordnete Zeiger P2 des zweiten Wurzelknotens 411-2 mit einem G1-Generationenbezeichner verknüpft, was anzeigt, dass der untergeordnete indirekte Knoten 425-1 mit der ersten Generation G1 verknüpft ist. Beachten Sie, dass sich der indirekte Knoten 425-1 seit der Generation G1 nicht verändert hat und daher immer noch mit einer G1-Generationenkennung verknüpft ist. Außerdem haben sich die untergeordneten Blattknoten 433-1 und 434-1 seit der Generation G1 ebenfalls nicht geändert, und daher sind die untergeordneten Zeiger P5 und P6 des indirekten Knotens 425-1 ebenfalls mit der G1-Generationenkennung verknüpft.
  • Wie in gezeigt, enthält die zweite Baumstruktur 402 keine weitere Kopie des indirekten Knotens 425-1, sondern „leiht“ sich den indirekten Knoten 425-1 aus der ersten Baumstruktur 401 (angezeigt durch einen Pfeil mit gestrichelter Linie). Dementsprechend teilen sich die erste und zweite Baumstruktur 401 und 402 einen Teilbereich, nämlich den indirekten Knoten 425-1 und seine untergeordneten Blattknoten 433-1 und 434-1. Beachten Sie, dass dieser Teilbereich der zweiten Baumstruktur 402 (die der zweiten Generation G2 zugeordnet ist) Zeiger und Schlüssel-Wert-Paare enthält, die nicht mit der Kennung der Generation G2 verbunden sind (z. B. Zeiger P5, Schlüssel-Wert-Paar K4 usw.). Dementsprechend können in einigen Implementierungen solche Elemente, die einen Bezeichner aus einer früheren Generation haben, auch in der zweiten Baumstruktur 402 enthalten sein, da sie in der Traversierung ab dem zweiten Wurzelknoten 411-2 (der mit der Generation G2 assoziiert ist) enthalten sind.
  • Wiederum bezogen auf den zweiten Wurzelknoten 411-2 ist der untergeordnete Zeiger P1 mit einer G2-Generationenkennung verknüpft, wodurch angezeigt wird, dass der untergeordnete indirekte Knoten 421-2 mit der zweiten Generation G2 verknüpft ist. Dementsprechend ist eine Änderung, die im Schlüssel-Wert-Index aufgetreten ist, dass der indirekte Knoten 421-1 durch einen anderen indirekten Knoten 421-2 ersetzt wurde. Insbesondere enthält der indirekte Knoten 421-2 im Gegensatz zum indirekten Knoten 421-1 einen Satz von Zaunzeigern 422 und einen Pufferchunk 423. Insbesondere enthalten die Zaunzeiger 422 einen Zaunzeiger F0, der auf den Pufferchunk 423 zeigt und mit einer G2-Generierungskennung verknüpft ist. Außerdem enthält der Pufferchunk 423 ein Schlüssel-Wert-Paar K0', das ebenfalls mit einer G2-Generierungskennung verknüpft is. Im Beispiel von stellt das Schlüssel-Wert-Paar K0' eine Aktualisierung des Schlüssel-Wert-Paares K0 dar (enthalten im Blattknoten 431-1 der ersten Baumstruktur 401) und zeigt daher an, dass sich der mit dem Schlüssel 0 gepaarte Wert von der Generation G1 zur Generation G2 geändert hat. Beachten Sie, dass der Schlüssel-Wert-Index gleichzeitig zwei verschiedene, mit Schlüssel 0 gepaarte Werte enthält (d. h. K0 und K0'), die der ersten und zweiten Generation G1 und G2 entsprechen.
  • Wie oben beschrieben, enthält der indirekte Knoten 421-2 Elemente, die mit der Generation G2 assoziiert sind (d. h. der Zaunzeiger F0 und das Schlüssel-Wert-Paar K0' im Pufferchunk 423), und daher ist der indirekte Knoten 421-2 mit einer G2-Generationenkennung assoziiert. Es ist jedoch zu beachten, dass die Kindzeiger P3 und P4 des indirekten Knotens 421-2 auf die Blattknoten 431-1 und 432-1 der ersten Baumstruktur 401 zeigen und daher die Kindzeiger P3 und P4 mit einer G1-Generationskennung verknüpft sind. Dementsprechend teilen sich die erste und zweite Baumstruktur 401 und 402 weitere Teilbereiche, nämlich die Blattknoten 431-1 und 432-1.
  • In sind die erste Baumstruktur 401 und die zweite Baumstruktur 402 zu einem dritten Zeitpunkt (z. B. nach dem zweiten Zeitpunkt von dargestellt. Nehmen wir an, dass den Zustand des Schlüsselwertindexes darstellt, wie er unmittelbar vor der Inkrementierung der aktuellen Generation von der zweiten Generation G2 zu einer dritten Generation G3 besteht, und dass keine Aktualisierungen des Indexes anstehen. Dementsprechend stellt die zweite Baumstruktur 402, wie in gezeigt, einen Schnappschuss für die zweite Generation G2 dar und kann hier als „G2-Schnappschuss“ bezeichnet werden.
  • Wie in gezeigt, sind die untergeordneten Zeiger P1 und P2 des zweiten Wurzelknotens 411-2 beide mit einer G2-Generationenkennung verbunden, was anzeigt, dass die untergeordneten indirekten Knoten 421-2 und 425-2 beide mit der zweiten Generation G2 verbunden sind. Beachten Sie, dass der indirekte Knoten 425-2 einen Satz von Zaunzeigern 426 und einen Pufferchunk 427 enthält. Insbesondere enthalten die Zaunzeiger 426 einen Zaunzeiger F4, der auf den Pufferblock 427 zeigt und mit einer G2-Generationenkennung verknüpft ist. Außerdem enthält der Pufferchunk 427 Schlüssel-Wert-Paare K4' und K5', die mit einer G2-Generierungskennung verknüpft sind. Im Beispiel von stellen die Schlüssel-Wert-Paare K4' und K5' Aktualisierungen der Schlüssel-Wert-Paare K4 und K5 dar (die im Blattknoten 433-1 der ersten Baumstruktur 401 enthalten sind) und zeigen daher an, dass sich die mit den Schlüsseln 4 und 5 gepaarten Werte von Generation G1 zu Generation G2 geändert haben.
  • Beachten Sie, dass der in dargestellte indirekte Knoten 421-2 (wie oben beschrieben) einen untergeordneten Zeiger P3 enthält, der mit einer G1-Generationenkennung verknüpft ist, einen Zaunzeiger F0, der mit einer G2-Generationenkennung verknüpft ist, und einen Pufferabschnitt 423, der ein Schlüssel-Wert-Paar K0' speichert, das mit einer G2-Generationenkennung verknüpft ist. Zu dem in dargestellten dritten Zeitpunkt ist das Schlüssel-Wert-Paar K0' jedoch nicht mehr in dem Pufferchunk 423 des indirekten Knotens 421-2 gespeichert, sondern im Blattknoten 431-2. Außerdem ist der untergeordnete Zeiger P3 mit der G2-Generationenkennung verknüpft, wodurch angezeigt wird, dass der Blattknoten 431-2 jetzt mit der zweiten Generation G2 verknüpft ist. In einigen Implementierungen kann die Übertragung des Schlüssel-Wert-Paares K0' aus dem Pufferchunk 423 zum Blattknoten 431-2 während einer Verdichtung des indirekten Knotens 421-2 erfolgen.
  • Beachten Sie auch, dass sich der Blattknoten 431-2 (einschließlich des Schlüssel-Wert-Paares K0') von dem Blattknoten 431-1 (einschließlich des Schlüssel-Wert-Paares K0) unterscheidet. Daher können sich im Beispiel von die erste und zweite Baumstruktur 401 und 402 den Blattknoten 431-1 nicht mehr teilen (wie in gezeigt). Dementsprechend wird der Blattknoten 431-1 für den G1-Snapshot und der Blattknoten 431-2 für den G2-Snapshot gespeichert).
  • Ferner haben sich, wie in gezeigt, die Blattknoten 432-1, 433-1 und 434-1 seit der Generation G1 nicht geändert. Dementsprechend sind der untergeordnete Zeiger P4 (des indirekten Knotens 421-2) und die untergeordneten Zeiger P5 und P6 (des indirekten Knotens 425-2) immer noch mit der Kennung der Generation G1 verbunden. Dementsprechend teilen sich die erste und zweite Baumstruktur 401 und 402 die Blattknoten 432-1, 433-1 und 434-1 (gekennzeichnet durch Pfeile mit gestrichelter Linie).
  • In sind nun die zweite Baumstruktur 402 und eine dritte Baumstruktur 403 zu einem vierten Zeitpunkt (z. B. nach dem dritten Zeitpunkt von ) dargestellt. Nehmen wir an, dass den Zustand des Schlüsselwertindexes darstellt, wie er während der Generation G3 besteht. Beachten Sie, dass die in dargestellte zweite Baumstruktur 402 gegenüber der in dargestellten unverändert ist. Anders ausgedrückt, die zweite Baumstruktur 402, die in gezeigte zweite Baumstruktur 402 wurde für die zweite Generation G2 fertiggestellt und stellt daher den G2-Snapshot dar.
  • Wie dargestellt, enthält die dritte Baumstruktur 403 den Wurzelknoten 411-3, der der dritten Generation G3 entspricht. Außerdem kann die dritte Baumstruktur 403 Unterabschnitte mit der ersten Baumstruktur 401 und der zweiten Baumstruktur 402 teilen (durch Pfeile mit gestrichelter Linie angezeigt). Außerdem kann die zweite Baumstruktur 402, wie zuvor mit Bezug auf besprochen, Unterabschnitte mit der ersten Baumstruktur 401 teilen.
  • Wie in gezeigt, ist der untergeordnete Zeiger P1 des dritten Wurzelknotens 411-3 mit einer G2-Generationenkennung verknüpft, wodurch angezeigt wird, dass der untergeordnete indirekte Knoten 421-2 mit der zweiten Generation G2 verknüpft ist. Dementsprechend enthält die dritte Baumstruktur 403 keine weitere Kopie des indirekten Knotens 421-2, sondern entlehnt den indirekten Knoten 421-2 aus der zweiten Baumstruktur 402. Außerdem entleiht die dritte Baumstruktur 403 auch die Blattknoten, die durch Kindzeiger des indirekten Knotens 421-2 identifiziert werden, nämlich den Blattknoten 431-2 (enthalten in der zweiten Baumstruktur 402) und den Blattknoten 432-1 (enthalten in der ersten Baumstruktur 401).
  • Beachten Sie, dass im Beispiel von die dritte Baumstruktur 403 entliehene Baumteile enthalten kann, die sich über mehrere Generationen erstrecken (z. B. die Generationen G1 und G2). In einigen Implementierungen kann ein Baum einen Teil entleihen, den der Baum der vorhergehenden Generation vom Baum einer früheren Generation entliehen hat. Zum Beispiel in teilt die zweite Baumstruktur 402 den Blattknoten 434-1 von der ersten Baumstruktur 401, und daher kann die dritte Baumstruktur 403 auch den Blattknoten 434-1 teilen. Kein Baum kann jedoch einen Teil aus einer späteren Generation entleihen (z. B. kann die erste Baumstruktur 401 keinen Teil der zweiten Baumstruktur 402 entleihen).
  • Wiederum bezogen auf den dritten Wurzelknoten 411-3 ist der untergeordnete Zeiger P2 mit einer G3-Generationenkennung verknüpft, wodurch angezeigt wird, dass der untergeordnete indirekte Knoten 425-3 mit der dritten Generation G3 verknüpft ist. Wie gezeigt, enthält der indirekte Knoten 425-3 den Satz von Zaunzeigern 428 und einen Pufferbrocken 429. Insbesondere enthalten die Zaunzeiger 428 einen Zaunzeiger F6, der auf den Pufferblock 429 zeigt und mit einer G3-Generationenkennung verknüpft ist. Außerdem enthält der Pufferchunk 429 die Schlüssel-Wert-Paare K6' und K7', die ebenfalls mit einer G3-Generierungskennung verknüpft sind.
  • Wie in gezeigt, enthalten die Zaunzeiger 428 auch einen Zaunzeiger F4, der auf den Pufferchunk 427 zeigt, der mit einer G2-Generationenkennung verbunden ist, und daher ist der Zaunzeiger F4 auch mit einer G2-Generationenkennung verbunden. Beachten Sie, dass der Zaunzeiger F4 des indirekten Knotens 425-3 (in der dritten Baumstruktur 403) auf den Pufferchunk 427 zeigt, der in dem indirekten Knoten 425-2 (in der zweiten Baumstruktur 402) enthalten ist. Dementsprechend speichert die dritte Baumstruktur 403 im Beispiel von keine Kopie des Pufferstücks 427 und leiht sich stattdessen das Pufferstück 427 (das der Generation G2 zugeordnet ist) von der zweiten Baumstruktur 402.
  • Wie oben beschrieben, enthält der indirekte Knoten 425-3 Elemente, die mit der Generation G3 assoziiert sind (d. h. Zaunzeiger F6 und Schlüssel-Wert-Paare K6' und K7' im Pufferchunk 429), und daher ist der indirekte Knoten 425-3 mit einer G3-Generationenkennung assoziiert. Es ist jedoch zu beachten, dass die Kindzeiger P5 und P6 des indirekten Knotens 425-3 auf die Blattknoten 433-1 und 434-1 der ersten Baumstruktur 401 zeigen und daher die Kindzeiger P5 und P6 mit einer G1-Generationskennung verknüpft sind.
  • In ist die zweite Baumstruktur 402 in einem Beispiel dargestellt, in dem der G1-Snapshot eliminiert wurde (z. B. nachdem er nicht mehr benötigt wurde). Dementsprechend sind alle Teile der ersten Baumstruktur 401, die nicht mit der zweiten Baumstruktur 402 gemeinsam genutzt wurden, gelöscht worden, und die Teile, die zuvor gemeinsam genutzt wurden, verbleiben in der zweiten Baumstruktur 402. Beachten Sie, dass zwar ein Beispiel zeigt, in dem der älteste Schnappschuss (d. h. G1) gelöscht wird, Implementierungen in dieser Hinsicht jedoch nicht beschränkt sind. Beispielsweise kann ein Schnappschuss, der chronologisch zwischen zwei anderen Schnappschüssen liegt, gelöscht werden, und nur die nicht freigegebenen Teile des gelöschten Schnappschusses würden gelöscht.
  • 5A. Verfahren zum Aktualisieren des Schlüssel-Wert-Index
  • zeigt einen Beispielprozess 500 in Übereinstimmung mit einigen Implementierungen. In einigen Beispielen kann der Prozess 500 unter Verwendung eines Teils oder der gesamten Speichersteuerung 110 (dargestellt in ) durchgeführt werden. Der Prozess 500 kann in Hardware oder einer Kombination aus Hardware und Programmierung (z. B. maschinenlesbare Anweisungen, die von einem oder mehreren Prozessoren ausgeführt werden können) implementiert werden. Die maschinenlesbaren Anweisungen können in einem nicht-transitorischen, computerlesbaren Medium gespeichert sein, z. B. in einem optischen, Halbleiter- oder magnetischen Speichergerät. Die maschinenlesbaren Anweisungen können von einem einzelnen Prozessor, mehreren Prozessoren, einer einzelnen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Zur Veranschaulichung werden Einzelheiten des Verfahrens 500 im Folgenden unter Bezugnahme auf die beschrieben, die Beispiele in Übereinstimmung mit einigen Implementierungen zeigen. Es sind jedoch auch andere Implementierungen möglich.
  • Block 510 kann den Empfang einer Schreibanforderung beinhalten, um ein Schlüssel-Wert-Paar zu einem Index hinzuzufügen. Beispielsweise kann die Aktualisierungs-Engine 120 die Aktualisierung 105 im Aktualisierungspuffer 135 speichern, und die Merge-Engine 150 kann den Schlüsselwertindex 145 mit den im Aktualisierungspuffer 135 gespeicherten Schlüsselwertpaardaten aktualisieren (siehe ). In einigen Beispielen kann der Schlüssel-Wert-Index 145 in einer Baumstruktur mit mehreren Knoten angeordnet sein. Ferner kann der Schlüssel-Wert-Index 145 in einigen Beispielen Fingerabdrücke von Dateneinheiten auf Orte dieser Dateneinheiten abbilden.
  • Block 520 kann das Speichern des Schlüssel-Wert-Paares und eines aktuellen Generationsbezeichners in einem Knotenpuffer eines indirekten Knotens des Indexes umfassen. Nehmen Sie an, dass im Beispiel von der indirekte Knoten mehr als eine Ebene über allen Blattknoten liegt. Anders ausgedrückt: Im Beispiel von sind alle untergeordneten Knoten des indirekten Knotens, der das Schlüssel-Wert-Paar speichert (in Block 520), ebenfalls indirekte Knoten. Zum Beispiel, siehe , kann die Speichersteuerung 110 und/oder die Merge-Engine 150 das empfangene Schlüssel-Wert-Paar mit dem aktuellen Generierungsbezeichner (z. B. „G2“) in Pufferpaketen 345 des Stammknotens 211 speichern. Außerdem kann die Speichersteuerung 110 Zaunzeiger 320 erzeugen oder aktualisieren, um die Pufferabschnitte 345 zu identifizieren. In einigen Implementierungen können die Zaunzeiger 320 mit der Kennung der aktuellen Generation eingefügt oder angehängt werden. Darüber hinaus kann in einigen Beispielen ein Bloom-Filter 330 des Stammknotens 211 konfiguriert werden (z. B. durch Setzen von Bitwerten), um anzuzeigen, dass das empfangene Schlüssel-Wert-Paar im Knotenpuffer 340 des Stammknotens 211 gespeichert ist.
  • Der Block 530 kann die Bestimmung beinhalten, ob der Knotenpuffer des indirekten Knotens einen vordefinierten Schwellenwert überschreitet. Wenn festgestellt wird, dass der Knotenpuffer den Schwellenwert nicht überschreitet, kann der Prozess 500 zu Block 510 zurückkehren (d. h., um ein weiteres Schlüssel-Wert-Paar zu empfangen). Zum Beispiel, siehe , kann die Speichersteuerung 110 feststellen, ob der Knotenpuffer 340 des Stammknotens 211 einen vordefinierten Füllstand überschreitet (z. B. 90 % voll, 100 % voll, eine bestimmte Anzahl von Schlüssel-Wert-Paaren usw.).
  • Wenn jedoch in Block 530 festgestellt wird, dass der Knotenpuffer den Schwellenwert überschreitet, kann der Prozess 500 in Block 540 fortgesetzt werden, was die Initialisierung von untergeordneten Knoten beinhalten kann (falls erforderlich). In einigen Implementierungen können untergeordnete Knoten initialisiert werden, wenn der indirekte Knoten nicht bereits über bestehende untergeordnete indirekte Knoten verfügt. Zum Beispiel, bezogen auf , kann der Speicher-Controller 110 feststellen, dass der Knotenpuffer 340 des Wurzelknotens 211 bis zu einem vordefinierten Pegel gefüllt ist, und als Reaktion darauf feststellen, ob der Wurzelknoten 211 unmittelbare untergeordnete Knoten hat (d. h. alle untergeordneten Knoten, die sich eine Ebene unterhalb des Wurzelknotens 211 befinden). Beachten Sie, dass, wie in gezeigt, die unmittelbaren untergeordneten Knoten des Wurzelknotens 211 indirekte Knoten und keine Blattknoten sind. Wenn die Speichersteuerung 110 feststellt, dass der Wurzelknoten 211 keine vorhandenen indirekten Kindknoten hat, kann die Speichersteuerung 110 indirekte Kindknoten des Wurzelknotens 211 initialisieren. In einigen Implementierungen kann das Initialisieren der untergeordneten indirekten Knoten das Bestimmen einer Knotenpuffergröße für die untergeordneten indirekten Knoten basierend auf einem Pegelverhältnis umfassen. In einigen Beispielen kann das Ebenenverhältnis ein berechnetes Verhältnis zwischen den Gesamtpuffergrößen in zwei benachbarten Ebenen des Schlüsselwertindex 200 sein. Daher können sich in solchen Beispielen die Gesamtpuffergrößen der indirekten Knoten 221-224 von der Größe des Knotenpuffers des Wurzelknotens 211 unterscheiden. Außerdem kann der Knotenpuffer jedes indirekten Knotens 221-224 anders (z. B. kleiner oder größer) sein als der Knotenpuffer des Wurzelknotens 211. Darüber hinaus kann in einigen Beispielen das Initialisieren der untergeordneten indirekten Knoten das Bestimmen einer Bloom-Filtergröße für die untergeordneten indirekten Knoten beinhalten. Beispielsweise kann der Speicher-Controller 110 eine Bloom-Filtergröße für untergeordnete Knoten des Wurzelknotens 211 auf der Grundlage von Falsch-Positiv-Verhältnissen bestimmen, die mit verschiedenen Ebenen des Schlüsselwertindex 200 verbunden sind.
  • Nach Block 540 kann der Prozess 500 in Block 550 fortgesetzt werden, was die Übertragung aller Schlüssel-Wert-Paare und ihrer zugehörigen Generierungskennungen vom Knotenpuffer des indirekten Knotens zu den Knotenpuffern der untergeordneten Knoten umfassen kann. Zum Beispiel, bezogen auf , kann die Speichersteuerung 110 alle Schlüssel-Wert-Paare und ihre Erzeugungskennungen vom Knotenpuffer des Stammknotens 211 zu den Knotenpuffern der untergeordneten Knoten 221-224 übertragen. Die übertragenen Schlüssel-Wert-Paare können auf die untergeordneten Knoten 221-224 entsprechend den verschiedenen Schlüsselbereichen, die den untergeordneten Knoten 221-224 zugeordnet sind, verteilt werden. In einigen Beispielen kann die Speichersteuerung 110 auch die Bloom-Filter der untergeordneten Knoten so einstellen, dass die übertragenen Schlüssel-Wert-Paare im entsprechenden Knotenpuffer gespeichert werden.
  • Block 560 kann beinhalten, dass untergeordnete Zeiger des indirekten Knotens mit der Kennung der aktuellen Generation verknüpft werden. Beispielsweise kann die Speichersteuerung 110 gemäß , kann die Speichersteuerung 110 nach der Übertragung von Schlüsselwertpaaren an die untergeordneten Knoten 221-224 einige oder alle untergeordneten Zeiger des indirekten Knotens aktualisieren, um die Kennung der aktuellen Generation einzuschließen (z. B. wenn die zugehörigen untergeordneten Knoten mit übertragenen Schlüsselwertpaaren aktualisiert wurden). Nach Block 560 kann der Prozess 500 zu Block 510 zurückkehren (d. h., um weiterhin Schreibanfragen zum Hinzufügen von Schlüsselwertpaaren zum Index zu empfangen). Beachten Sie, dass der Prozess 500 in ähnlicher Weise für verschiedene indirekte Knoten des Schlüsselwertindex 200 wiederholt werden kann (z. B. für jeden der indirekten Knoten 221-224, 231-234), und auch am selben indirekten Knoten wiederholt werden kann (z. B. für mehrere Verdichtungen).
  • 5B. Prozess zum Hinzufügen einer neuen Generation
  • zeigt einen Beispielprozess 570 in Übereinstimmung mit einigen Implementierungen. In einigen Beispielen kann der Prozess 570 unter Verwendung eines Teils oder der gesamten Speichersteuerung 110 (dargestellt in ) durchgeführt werden. Der Prozess 570 kann in Hardware oder einer Kombination aus Hardware und Programmierung (z. B. maschinenlesbare Anweisungen, die von einem oder mehreren Prozessoren ausgeführt werden können) implementiert werden. Die maschinenlesbaren Anweisungen können in einem nicht-transitorischen, computerlesbaren Medium gespeichert sein, z. B. in einem optischen, Halbleiter- oder magnetischen Speichergerät. Die maschinenlesbaren Anweisungen können von einem einzelnen Prozessor, mehreren Prozessoren, einer einzelnen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Zur Veranschaulichung können Details des Prozesses 570 im Folgenden unter Bezugnahme auf beschrieben, die Beispiele in Übereinstimmung mit einigen Implementierungen zeigen. Es sind jedoch auch andere Implementierungen möglich.
  • Block 575 kann den Empfang eines Befehls zum Hinzufügen einer neuen Generation zu einem Schlüssel-Wert-Index beinhalten. Block 580 kann das Inkrementieren des aktuellen Generationsbezeichners beinhalten. Zum Beispiel kann die Snapshot-Engine 170 (siehe und , kann die Snapshot-Engine 170 einen Benutzer- oder Systembefehl empfangen, um eine neue Generation zu dem durch die erste Baumstruktur 401 repräsentierten Schlüsselwertindex hinzuzufügen. Als Reaktion auf den Befehl kann die Snapshot-Engine 170 die aktuelle Generation von G1 zu G2 inkrementieren. In einigen Beispielen kann der Prozess des Hinzufügens der neuen Generation G2 die Finalisierung der vorherigen Generation G1 beinhalten. Ein solches Abschließen kann das Abschließen aller anstehenden Aktualisierungen der ersten Baumstruktur 401 (z. B. im Aktualisierungspuffer 135 in ) beinhalten. In einigen Beispielen kann eine solche Finalisierung auch beinhalten, dass die erste Baumstruktur 401 für die vorherige Generation G1 eingefroren ist (d. h. nicht geändert werden kann) oder dies angezeigt wird.
  • Block 585 kann das Erstellen eines neuen Wurzelknotens beinhalten, der mit der neuen Generation verbunden ist. Block 590 kann das Akkumulieren neuer Schlüssel-Wert-Paare ausgehend vom neuen Stammknoten umfassen. Beispielsweise kann die Snapshot-Engine 170 den neuen Stammknoten erzeugen. 1 und 4B, kann die Snapshot-Engine 170 den neuen Stammknoten 411-2 erzeugen, der mit der neuen Generation G2 verbunden ist. Außerdem können während des verbleibenden Zeitraums, der mit der zweiten Generation G2 verbunden ist, Aktualisierungen zum Wurzelknoten 411-2 hinzugefügt werden, wobei alle neuen Elemente mit dem G2-Bezeichner verbunden sind. Darüber hinaus können diese Aktualisierungen einen Verdichtungsprozess auslösen, wodurch der zweiten Baumstruktur 402 neue untergeordnete Knoten hinzugefügt werden (z. B. der in gezeigte indirekte Knoten 421-2). Nach Block 590 kann der Prozess 570 abgeschlossen sein.
  • Beachten Sie, dass zwar ein Beispielverfahren zum Hinzufügen einer neuen Generation zeigt, aber auch andere Varianten möglich sind. Beispielsweise können in einigen Implementierungen nach der Inkrementierung des Generationsbezeichners auf G2 alle neuen Aktualisierungen mit dem G2-Bezeichner angehängt und in einem Aktualisierungspuffer (z. B. Aktualisierungspuffer 135 in ) akkumuliert werden, ohne einer Baumstruktur (z. B. der zweiten Baumstruktur 402 in hinzugefügt zu werden. Wenn anschließend die Generierungskennung auf G3 inkrementiert wird, können die akkumulierten G2-Aktualisierungen verwendet werden, um den G2-Snapshot zu diesem Zeitpunkt zu generieren und zu finalisieren. In solchen Beispielen kann der Wurzelknoten des G2-Schnappschusses als der letzte zur Baumstruktur des G2-Schnappschusses hinzugefügte Knoten erstellt werden.
  • 6. Verfahren zum Lesen aus einem Snapshot
  • zeigt einen Beispielprozess 600 gemäß einigen Implementierungen. In einigen Beispielen kann der Prozess 600 unter Verwendung eines Teils oder der Gesamtheit des Speicher-Controllers 110 (in dargestellt) durchgeführt werden. Der Prozess 600 kann in Hardware oder einer Kombination aus Hardware und Programmierung (z. B. maschinenlesbare Anweisungen, die von einem oder mehreren Prozessoren ausgeführt werden können) implementiert werden. Die maschinenlesbaren Anweisungen können in einem nicht-transitorischen, computerlesbaren Medium gespeichert sein, z. B. in einem optischen, Halbleiter- oder magnetischen Speichergerät. Die maschinenlesbaren Anweisungen können von einem einzelnen Prozessor, mehreren Prozessoren, einer einzelnen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Zur Veranschaulichung können Details des Prozesses 600 im Folgenden unter Bezugnahme auf die beschrieben, die Beispiele in Übereinstimmung mit einigen Implementierungen zeigen. Es sind jedoch auch andere Implementierungen möglich.
  • Block 610 kann den Empfang einer Anforderung für Schlüsselwertdaten eines Schnappschusses beinhalten. Beispielsweise kann die Snapshot-Engine 170 eine Anforderung zum Lesen von Daten des Snapshots empfangen, der der Generation G1 zugeordnet ist (z. B. dargestellt durch die erste Baumstruktur 401 in den ).
  • Block 620 kann die Identifizierung des Wurzelknotens beinhalten, der mit dem angeforderten Snapshot verbunden ist. Zum Beispiel kann die Snapshot-Engine 170 gemäß und , kann die Snapshot-Engine 170 den Stammknoten 411-1 auswählen, wenn der angeforderte Snapshot mit der Generation G1 verbunden ist. In einem anderen Beispiel kann die Snapshot-Engine 170 den Stammknoten 411-2 auswählen, wenn der angeforderte Snapshot der Generation G2 zugeordnet ist.
  • Block 630 kann das Durchlaufen einer Baumstruktur, ausgehend vom identifizierten Wurzelknoten und unter Verwendung von Generierungskennungen, beinhalten. Beispielsweise kann die Snapshot-Engine 170, wie in und , kann die Snapshot-Engine 170 Daten des G2-Snapshots erhalten, indem sie eine Traversierung beginnend am Wurzelknoten 411-2 (der Generation G2 zugeordnet) durchführt und dann den untergeordneten Zeigern P1 und P2 folgt, um die untergeordneten indirekten Knoten 421-2 und 425-2 zu identifizieren. Als nächstes kann die Traversierung den untergeordneten Zeigern P3, P4, P5 und P6 folgen (die in den indirekten Knoten 421-2 und 425-2 enthalten sind), um die untergeordneten Blattknoten 431-2, 432-1, 433-1 und 434-1 zu identifizieren. Beachten Sie, dass diese Traversierung Zeiger und Schlüssel-Wert-Paare umfasst, die nicht mit dem G2-Generierungsbezeichner verbunden sind (z. B. Zeiger P5, Schlüssel-Wert-Paar K2 usw.). Dementsprechend können in einigen Implementierungen solche Elemente, die einen Bezeichner aus einer früheren Generation haben, auch in die mit der G2-Generation verbundene Traversierung einbezogen werden.
  • Block 640 kann die Bereitstellung der angeforderten Daten auf der Grundlage der Durchquerung umfassen. Zum Beispiel, siehe und , kann die Snapshot-Engine 170 die den Schlüsseln 0-7 zugeordneten Werte aus der zweiten Baumstruktur 402 lesen. In einigen Implementierungen, wenn die Traversierung auf Werte für einen bestimmten Schlüssel auf zwei oder mehr Ebenen des Baums trifft, gehört der Wert, der auf der höchsten der zwei oder mehr Ebenen gefunden wurde, zur jüngsten Generation. Anders ausgedrückt: Die Generationskennung des auf der höheren Ebene gefundenen Wertes kann größer oder gleich (aber nicht kleiner) sein als die Generationskennung des auf der niedrigeren Ebene gefundenen Wertes. Dementsprechend wird der Wert, der auf der höchsten der zwei oder mehr Ebenen gefunden wurde, als Daten des Schnappschusses verwendet, und der/die übrigen Werte werden ignoriert. Beispielsweise wird in der zweiten Baumstruktur 402, die in dargestellt ist, das Schlüssel-Wert-Paar K4' (das im Pufferchunk 427 des indirekten Knotens 425-2 enthalten und mit G2 verknüpft ist) als Schnappschusswert verwendet, während das Schlüssel-Wert-Paar K4 (das im Blattknoten 433-1 enthalten und mit G1 verknüpft ist) ignoriert wird. Nach Block 640 kann der Prozess 600 abgeschlossen werden.
  • 7. Verfahren zum Lesen aus einem Snapshot
  • zeigt einen Beispielprozess 700, gemäß einigen Implementierungen. In einigen Beispielen kann der Prozess 700 unter Verwendung eines Teils oder der gesamten Speichersteuerung 110 (dargestellt in ) durchgeführt werden. Der Prozess 700 kann in Hardware oder einer Kombination aus Hardware und Programmierung (z. B. maschinenlesbare Anweisungen, die von einem oder mehreren Prozessoren ausgeführt werden können) implementiert werden. Die maschinenlesbaren Anweisungen können in einem nicht-transitorischen, computerlesbaren Medium gespeichert sein, z. B. in einem optischen, Halbleiter- oder magnetischen Speichergerät. Die maschinenlesbaren Anweisungen können von einem einzelnen Prozessor, mehreren Prozessoren, einer einzelnen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Zur Veranschaulichung können Details des Prozesses 600 im Folgenden unter Bezugnahme auf die beschrieben, die Beispiele in Übereinstimmung mit einigen Implementierungen zeigen. Es sind jedoch auch andere Implementierungen möglich.
  • Block 710 kann das Speichern von Schlüssel-Wert-Paaren in einem Index im permanenten Speicher umfassen, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsbezeichner für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Snapshots umfasst, die mit einer Vielzahl von Generationen verbunden sind. Zum Beispiel, bezogen auf , kann die Speichersteuerung 110 und/oder die Merge-Engine 150 Schlüssel-Wert-Paare und zugehörige Generationskennungen in dem Schlüssel-Wert-Index 145 speichern. Die Schlüsselwertdaten können in Baumstrukturen gespeichert werden, die den verschiedenen Generationen entsprechen. Ferner kann jede Baumstruktur einen Wurzelknoten enthalten, der einer bestimmten Generation zugeordnet ist (z. B. Wurzelknoten 411-1, der der Generation G1 zugeordnet ist, Wurzelknoten 411-2, der der Generation G2 zugeordnet ist, Wurzelknoten 411-3, der der Generation G3 zugeordnet ist). Die indirekten Knoten des Schlüsselwertindexes können Zeiger auf Indexabschnitte wie untergeordnete Knoten und Pufferabschnitte enthalten. In enthält der indirekte Knoten 421-2 beispielsweise die Kindzeiger P3 und P4 (die die Blattknoten 431-1 bzw. 432-1 identifizieren) und den Zaunzeiger F0 (der den Pufferchunk 423 identifiziert). Die Zeiger P3, P4 und F0 sind jeweils mit einem Generationsbezeichner (z. B. G1, G2) für den identifizierten Indexabschnitt verbunden.
  • Block 720 kann den Empfang einer Anforderung zum Lesen von Daten eines bestimmten Schnappschusses des Index beinhalten, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der mehreren Generationen verbunden ist. Beispielsweise kann die Snapshot-Engine 170 (siehe ) eine Anforderung zum Lesen von Daten eines Snapshots des Schlüsselwertindex 145 empfangen. In einigen Beispielen kann der angeforderte Snapshot einer bestimmten Generation (z. B. G2) entsprechen, die dem Schlüsselwertindex 145 zugeordnet ist.
  • Block 730 kann als Reaktion auf die Anforderung die Durchführung einer Traversierung ab einem bestimmten Wurzelknoten umfassen, der mit der bestimmten Generation verbunden ist. Beispielsweise kann die Snapshot-Engine 170 gemäß den und , kann die Schnappschuss-Engine 170 den Wurzelknoten 411-2 als der Generation G2 (die mit dem angeforderten Schnappschuss verbunden ist) entsprechend identifizieren. Die Snapshot-Engine 170 kann dann den untergeordneten Zeigern P1 und P2 (im Wurzelknoten 411-2 enthalten) folgen, um die untergeordneten indirekten Knoten 421-2 und 425-2 zu identifizieren. Als nächstes kann die Snapshot-Engine 170 den untergeordneten Zeigern P3, P4, P5 und P6 (enthalten in den indirekten Knoten 421-2 und 425-2) folgen, um die untergeordneten Blattknoten 431-2, 432-1, 433-1 und 434-1 zu identifizieren.
  • Block 740 kann die Bereitstellung der angeforderten Daten auf der Grundlage der Durchquerung beinhalten. Zum Beispiel, siehe und , kann die Snapshot-Engine 170 die den Schlüsseln 0-7 zugeordneten Werte aus der zweiten Baumstruktur 402 lesen. Nach Block 740 kann der Prozess 700 abgeschlossen sein.
  • 8. Anweisungen zum Lesen aus einem Snapshot
  • zeigt ein maschinenlesbares Medium 800, das Befehle 810-840 speichert, gemäß einigen Implementierungen. Die Anweisungen 810-840 können von einem einzelnen Prozessor, mehreren Prozessoren, einer einzelnen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Das maschinenlesbare Medium 800 kann ein nicht-transitorisches Speichermedium sein, wie z. B. ein optisches, Halbleiter- oder magnetisches Speichermedium.
  • Anweisung 810 kann ausgeführt werden, um Schlüssel-Wert-Paare in einem Index im permanenten Speicher zu speichern, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsidentifikator für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Schnappschüssen umfasst, die mit einer Vielzahl von Generationen verbunden sind. Die Anweisung 820 kann ausgeführt werden, um eine Anforderung zum Lesen von Daten eines bestimmten Schnappschusses des Index zu empfangen, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der Vielzahl von Generationen verbunden ist. Anweisung 830 kann ausgeführt werden, um als Reaktion auf die Anforderung eine Traversierung ausgehend von einem bestimmten Wurzelknoten durchzuführen, der mit der bestimmten Generation verbunden ist. Die Anweisung 840 kann ausgeführt werden, um die angeforderten Daten basierend auf der Traversierung bereitzustellen.
  • 9. Gerät zum Lesen aus einem Snapshot
  • zeigt ein schematisches Diagramm eines Beispiel-Rechengeräts 900. In einigen Beispielen kann die Rechenvorrichtung 900 im Allgemeinen dem Speichersystem 100 (dargestellt in ) entsprechen. Wie dargestellt, kann die Rechenvorrichtung 900 einen Hardware-Prozessor 902 und einen maschinenlesbaren Speicher 905 mit Befehlen 910-940 enthalten. Der maschinenlesbare Speicher 905 kann ein nicht-übertragbares Medium sein. Die Anweisungen 910-940 können durch den Hardware-Prozessor 902 oder durch eine im Hardware-Prozessor 902 enthaltene Verarbeitungsmaschine ausgeführt werden.
  • Anweisung 910 kann ausgeführt werden, um Schlüssel-Wert-Paare in einem Index im permanenten Speicher zu speichern, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsidentifikator für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Schnappschüssen umfasst, die mit einer Vielzahl von Generationen verbunden sind. Die Anweisung 920 kann ausgeführt werden, um eine Anforderung zum Lesen von Daten eines bestimmten Schnappschusses des Index zu empfangen, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der Vielzahl von Generationen verbunden ist. Anweisung 930 kann ausgeführt werden, um als Reaktion auf die Anforderung eine Traversierung ausgehend von einem bestimmten Wurzelknoten durchzuführen, der mit der bestimmten Generation verbunden ist. Die Anweisung 940 kann ausgeführt werden, um die angeforderten Daten basierend auf der Traversierung bereitzustellen.
  • Beachten Sie, dass, obwohl verschiedene Beispiele zeigen, sind Implementierungen in dieser Hinsicht nicht beschränkt. In Bezug auf wird beispielsweise erwogen, dass das Speichersystem 100 zusätzliche Geräte und/oder Komponenten, weniger Komponenten, andere Komponenten, andere Anordnungen usw. enthalten kann. In einem anderen Beispiel ist es denkbar, dass die Aktualisierungs-Engine 120 und die Abfrage-Engine 160 zu einer einzigen Engine oder Einheit kombiniert werden oder in einer anderen Engine oder Software des Speichersystems 100 enthalten sein können. Andere Kombinationen und/oder Variationen sind ebenfalls möglich.
  • Daten und Anweisungen werden in entsprechenden Speichergeräten gespeichert, die als ein oder mehrere computerlesbare oder maschinenlesbare Speichermedien ausgeführt sind. Zu den Speichermedien gehören verschiedene Formen von nicht transitorischen Speichern, darunter Halbleiterspeicher wie dynamische oder statische Direktzugriffsspeicher (DRAMs oder SRAMs), löschbare und programmierbare Festwertspeicher (EPROMs), elektrisch löschbare und programmierbare Festwertspeicher (EEPROMs) und Flash-Speicher; Magnetplatten wie Fest-, Disketten- und Wechselplatten; andere magnetische Medien einschließlich Bändern; optische Medien wie Compact Disks (CDs) oder digitale Videodisks (DVDs); oder andere Arten von Speichergeräten.
  • Beachten Sie, dass die oben besprochenen Anweisungen auf einem einzigen computerlesbaren oder maschinenlesbaren Speichermedium bereitgestellt werden können oder alternativ auf mehreren computerlesbaren oder maschinenlesbaren Speichermedien, die in einem großen System mit möglicherweise mehreren Knoten verteilt sind. Ein solches computerlesbares oder maschinenlesbares Speichermedium oder solche Speichermedien werden als Teil eines Artikels (oder Herstellungsartikels) betrachtet. Ein Artikel oder Herstellungsgegenstand kann sich auf jede hergestellte Einzelkomponente oder mehrere Komponenten beziehen. Das Speichermedium oder die Speichermedien können sich entweder in der Maschine befinden, auf der die maschinenlesbaren Anweisungen ausgeführt werden, oder an einem entfernten Standort, von dem maschinenlesbare Anweisungen über ein Netzwerk zur Ausführung heruntergeladen werden können.
  • In der vorstehenden Beschreibung sind zahlreiche Details aufgeführt, um ein Verständnis des hier offengelegten Gegenstands zu vermitteln. Es können jedoch auch Implementierungen ohne einige dieser Details durchgeführt werden. Andere Implementierungen können Modifikationen und Variationen von den oben beschriebenen Details enthalten. Es ist beabsichtigt, dass die beigefügten Ansprüche solche Modifikationen und Variationen abdecken.

Claims (20)

  1. Computerimplementiertes Verfahren, umfassend: Speichern von Schlüssel-Wert-Paaren in einem Index in einem persistenten Speicher, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsbezeichner für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Schnappschüssen umfasst, die mit einer Vielzahl von Generationen verbunden sind; Empfangen einer Anforderung, Daten eines bestimmten Schnappschusses des Index zu lesen, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der Vielzahl von Generationen verbunden ist; als Antwort auf die Anfrage, Durchlaufen eines Traversals, beginnend von einem bestimmten Wurzelknoten, der mit der bestimmten Generation verbunden ist; und die angeforderten Daten basierend auf dem Traversal bereitstellen.
  2. Computerimplementiertes Verfahren nach Anspruch 1, wobei die Traversierung unter Verwendung der in den Zeigern der indirekten Knoten enthaltenen Generierungskennungen durchgeführt wird.
  3. Computerimplementiertes Verfahren nach Anspruch 1, wobei der bestimmte Schnappschuss enthält: einen ersten Satz von Schlüssel-Wert-Paaren, die mit der bestimmten Generation verbunden sind; und einen zweiten Satz von Schlüssel-Wert-Paaren, die einer anderen Generation zugeordnet sind, wobei die andere Generation älter ist als die bestimmte Generation, wobei der zweite Satz von Schlüssel-Wert-Paaren von dem bestimmten Snapshot und einem anderen Snapshot gemeinsam genutzt wird.
  4. Computerimplementiertes Verfahren nach Anspruch 1, wobei ein erster indirekter Knoten einen ersten Zeiger auf einen untergeordneten Knoten enthält, und wobei der erste Zeiger einen ersten Generationsbezeichner für den untergeordneten Knoten enthält.
  5. Computerimplementiertes Verfahren nach Anspruch 4, wobei der erste indirekte Knoten einen zweiten Zeiger auf einen in dem ersten indirekten Knoten gespeicherten Pufferchunk enthält, und wobei der zweite Zeiger einen zweiten Generationsbezeichner für den Pufferchunk enthält.
  6. Computerimplementiertes Verfahren nach Anspruch 5, wobei der Bezeichner der ersten Generation und der Bezeichner der zweiten Generation mit unterschiedlichen Generationen verbunden sind.
  7. Computerimplementiertes Verfahren nach Anspruch 5, wobei: der erste indirekte Knoten ist mit der Kennung der zweiten Generation verbunden; der erste indirekte Knoten in einer ersten Baumstruktur enthalten ist, wobei die erste Baumstruktur einen ersten Wurzelknoten aufweist, der mit dem zweiten Generationsbezeichner verbunden ist; und der erste indirekte Knoten auch in einer zweiten Baumstruktur enthalten ist, wobei die zweite Baumstruktur einen zweiten Wurzelknoten aufweist, der mit einem Bezeichner der dritten Generation verbunden ist, wobei der Bezeichner der zweiten Generation und der Bezeichner der dritten Generation mit verschiedenen Generationen verbunden sind.
  8. Computerimplementiertes Verfahren nach Anspruch 1, wobei jedes Schlüssel-Wert-Paar im Index mit einem jeweiligen Generationsbezeichner verknüpft ist.
  9. Nicht-transitorisches maschinenlesbares Medium, das Befehle speichert, die bei Ausführung einen Prozessor dazu veranlassen: Schlüssel-Wert-Paare in einem Index in einem persistenten Speicher speichern, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsbezeichner für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Schnappschüssen umfasst, die mit einer Vielzahl von Generationen verbunden sind; eine Anforderung zum Lesen von Daten eines bestimmten Schnappschusses des Indexes empfangen, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der mehreren Generationen verbunden ist; als Reaktion auf die Anforderung eine Traversierung ausgehend von einem bestimmten Wurzelknoten, der mit der bestimmten Generation assoziiert ist, durchführen; und die angeforderten Daten basierend auf dem Traversal bereitstellen.
  10. Nicht-transitorisches maschinenlesbares Medium nach Anspruch 9, wobei die Traversierung unter Verwendung der in den Zeigern der indirekten Knoten enthaltenen Erzeugungskennungen durchgeführt wird.
  11. Nicht-transitorisches maschinenlesbare Medium nach Anspruch 9, wobei der bestimmte Schnappschuss enthält: einen ersten Satz von Schlüssel-Wert-Paaren, die mit der bestimmten Generation verbunden sind; und einen zweiten Satz von Schlüssel-Wert-Paaren, die einer anderen Generation zugeordnet sind, wobei die andere Generation älter ist als die bestimmte Generation, wobei der zweite Satz von Schlüssel-Wert-Paaren von dem bestimmten Snapshot und einem anderen Snapshot gemeinsam genutzt wird.
  12. Nicht-transitorisches maschinenlesbares Medium nach Anspruch 9, wobei ein erster indirekter Knoten einen ersten Zeiger auf einen untergeordneten Knoten enthält, und wobei der erste Zeiger einen ersten Generationsbezeichner für den untergeordneten Knoten enthält.
  13. Nicht-transitorisches maschinenlesbares Medium nach Anspruch 12, wobei der erste indirekte Knoten einen zweiten Zeiger auf einen in dem ersten indirekten Knoten gespeicherten Pufferchunk enthält, und wobei der zweite Zeiger einen zweiten Generationsidentifikator für den Pufferchunk enthält.
  14. Nicht-transitorisches maschinenlesbare Medium nach Anspruch 12, wobei: der erste indirekte Knoten ist mit der Kennung der zweiten Generation verbunden; der erste indirekte Knoten in einer ersten Baumstruktur enthalten ist, wobei die erste Baumstruktur einen ersten Wurzelknoten aufweist, der mit dem zweiten Generationsbezeichner verbunden ist; und der erste indirekte Knoten in einer zweiten Baumstruktur enthalten ist, wobei die zweite Baumstruktur einen zweiten Wurzelknoten aufweist, der mit einem Bezeichner der dritten Generation verbunden ist, wobei der Bezeichner der zweiten Generation und der Bezeichner der dritten Generation mit verschiedenen Generationen verbunden sind.
  15. Speichersystem, das Folgendes umfasst: einen Prozessor, der eine Vielzahl von Verarbeitungsmaschinen umfasst; und einen maschinenlesbaren Speicher, der Befehle speichert, wobei die Befehle durch den Prozessor ausgeführt werden können, um: Schlüssel-Wert-Paare in einem Index in einem persistenten Speicher speichern, wobei indirekte Knoten des Index Zeiger enthalten, wobei jeder Zeiger einen Indexabschnitt identifiziert und einen Generationsbezeichner für den identifizierten Indexabschnitt enthält, wobei der Index eine Vielzahl von Schnappschüssen umfasst, die mit einer Vielzahl von Generationen verbunden sind; eine Anforderung zum Lesen von Daten eines bestimmten Schnappschusses des Indexes empfangen, wobei der bestimmte Schnappschuss mit einer bestimmten Generation der mehreren Generationen verbunden ist; als Reaktion auf die Anforderung eine Traversierung ausgehend von einem bestimmten Wurzelknoten, der mit der bestimmten Generation assoziiert ist, durchführen; und die angeforderten Daten basierend auf dem Traversal bereitstellen.
  16. Speichersystem nach Anspruch 15, wobei die Traversierung unter Verwendung der in den Zeigern der indirekten Knoten enthaltenen Erzeugungskennungen durchgeführt wird.
  17. Speichersystem nach Anspruch 15, wobei der bestimmte Snapshot enthält: einen ersten Satz von Schlüssel-Wert-Paaren, die mit der bestimmten Generation verbunden sind; und einen zweiten Satz von Schlüssel-Wert-Paaren, die einer anderen Generation zugeordnet sind, wobei die andere Generation älter ist als die bestimmte Generation, wobei der zweite Satz von Schlüssel-Wert-Paaren von dem bestimmten Snapshot und einem anderen Snapshot gemeinsam genutzt wird.
  18. Speichersystem nach Anspruch 15, wobei ein erster indirekter Knoten einen ersten Zeiger auf einen untergeordneten Knoten enthält, und wobei der erste Zeiger eine erste Generationskennung für den untergeordneten Knoten enthält.
  19. Speichersystem nach Anspruch 18, wobei der erste indirekte Knoten einen zweiten Zeiger auf einen in dem ersten indirekten Knoten gespeicherten Pufferchunk enthält, und wobei der zweite Zeiger einen zweiten Generationsidentifikator für den Pufferchunk enthält.
  20. Speichersystem nach Anspruch 18, wobei: der erste indirekte Knoten ist mit der Kennung der zweiten Generation verbunden; der erste indirekte Knoten in einer ersten Baumstruktur enthalten ist, wobei die erste Baumstruktur einen ersten Wurzelknoten aufweist, der mit dem zweiten Generationsbezeichner verbunden ist; und der erste indirekte Knoten in einer zweiten Baumstruktur enthalten ist, wobei die zweite Baumstruktur einen zweiten Wurzelknoten aufweist, der mit einem Bezeichner der dritten Generation verbunden ist, wobei der Bezeichner der zweiten Generation und der Bezeichner der dritten Generation mit verschiedenen Generationen verbunden sind.
DE102021108455.5A 2020-06-30 2021-04-01 Erzeugen von Snapshots eines Schlüssel-Wert-Index Active DE102021108455B4 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US16/916,645 2020-06-30
US16/916,645 US11556513B2 (en) 2020-06-30 2020-06-30 Generating snapshots of a key-value index

Publications (2)

Publication Number Publication Date
DE102021108455A1 true DE102021108455A1 (de) 2021-12-30
DE102021108455B4 DE102021108455B4 (de) 2024-05-08

Family

ID=78827078

Family Applications (1)

Application Number Title Priority Date Filing Date
DE102021108455.5A Active DE102021108455B4 (de) 2020-06-30 2021-04-01 Erzeugen von Snapshots eines Schlüssel-Wert-Index

Country Status (3)

Country Link
US (1) US11556513B2 (de)
CN (1) CN113868244B (de)
DE (1) DE102021108455B4 (de)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20220027187A1 (en) * 2020-07-24 2022-01-27 Vmware, Inc. Supporting clones with consolidated snapshots
US11853577B2 (en) 2021-09-28 2023-12-26 Hewlett Packard Enterprise Development Lp Tree structure node compaction prioritization
US20240045602A1 (en) * 2022-08-03 2024-02-08 Capital One Services, Llc Systems and methods for adaptive data partitioning within cluster systems

Family Cites Families (53)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7886126B2 (en) 2005-01-14 2011-02-08 Intel Corporation Extended paging tables to map guest physical memory addresses from virtual memory page tables to host physical memory addresses in a virtual machine system
US20070118547A1 (en) 2005-11-22 2007-05-24 Monish Gupta Efficient index versioning in multi-version databases
GB2471715A (en) 2009-07-10 2011-01-12 Hewlett Packard Development Co Determining the data chunks to be used as seed data to restore a database, from manifests of chunks stored in a de-duplicated data chunk store.
US8386745B2 (en) 2009-07-24 2013-02-26 Advanced Micro Devices, Inc. I/O memory management unit including multilevel address translation for I/O and computation offload
US8453257B2 (en) 2009-08-14 2013-05-28 International Business Machines Corporation Approach for securing distributed deduplication software
US8549249B1 (en) 2009-09-21 2013-10-01 Tilera Corporation Supporting secondary atomic operations using primary atomic operations
US8832154B1 (en) 2009-12-08 2014-09-09 Netapp, Inc. Object location service for network-based content repository
US8285918B2 (en) 2009-12-11 2012-10-09 Nimble Storage, Inc. Flash memory cache for data storage device
US8996563B2 (en) 2010-04-06 2015-03-31 Tokutek, Inc. High-performance streaming dictionary
US20110283048A1 (en) 2010-05-11 2011-11-17 Seagate Technology Llc Structured mapping system for a memory device
US9213628B2 (en) 2010-07-14 2015-12-15 Nimble Storage, Inc. Methods and systems for reducing churn in flash-based cache
WO2012052785A1 (en) 2010-10-22 2012-04-26 Acunu Limited Versioned data structure
US8627026B2 (en) 2011-08-19 2014-01-07 Hitachi, Ltd. Storage apparatus and additional data writing method
WO2013054588A1 (ja) 2011-10-11 2013-04-18 インターナショナル・ビジネス・マシーンズ・コーポレーション 情報処理装置、データストア操作方法、データ構築装置、データ構築方法、データ結合装置、データ結合方法およびプログラム
US8832050B2 (en) 2012-03-09 2014-09-09 Hewlett-Packard Development Company, L.P. Validation of distributed balanced trees
US9684601B2 (en) 2012-05-10 2017-06-20 Arm Limited Data processing apparatus having cache and translation lookaside buffer
JP2015525419A (ja) 2012-06-18 2015-09-03 アクテフィオ,インク. 高度データ管理仮想化システム
US8768977B2 (en) 2012-07-31 2014-07-01 Hewlett-Packard Development Company, L.P. Data management using writeable snapshots in multi-versioned distributed B-trees
US20150347547A1 (en) 2014-05-30 2015-12-03 Zardosht Kasheff Replication in a NoSQL System Using Fractal Tree Indexes
US20150347477A1 (en) 2014-05-30 2015-12-03 John Esmet Streaming File System
US9514054B2 (en) 2014-07-08 2016-12-06 Netapp, Inc. Method to persistent invalidation to ensure cache durability
US10042710B2 (en) 2014-09-16 2018-08-07 Actifio, Inc. System and method for multi-hop data backup
US9852076B1 (en) 2014-12-18 2017-12-26 Violin Systems Llc Caching of metadata for deduplicated LUNs
WO2016122547A1 (en) 2015-01-29 2016-08-04 Hewlett Packard Enterprise Development Lp Foster twin data structure
US9916241B2 (en) 2015-08-14 2018-03-13 Netapp, Inc. Storage controller caching using symmetric storage class memory devices
US9977746B2 (en) 2015-10-21 2018-05-22 Hewlett Packard Enterprise Development Lp Processing of incoming blocks in deduplicating storage system
CN105404596B (zh) 2015-10-30 2018-07-20 华为技术有限公司 一种数据传输方法、装置及系统
US10496283B2 (en) 2016-01-22 2019-12-03 Suraj Prabhakar WAGHULDE Adaptive prefix tree based order partitioned data storage system
US10169365B2 (en) 2016-03-02 2019-01-01 Hewlett Packard Enterprise Development Lp Multiple deduplication domains in network storage system
US10402394B2 (en) 2016-11-03 2019-09-03 Veritas Technologies Llc Systems and methods for flushing data in a virtual computing environment
US9990281B1 (en) 2016-11-29 2018-06-05 Sap Se Multi-level memory mapping
CN106708749B (zh) 2016-12-23 2019-08-23 量子云未来(北京)信息科技有限公司 一种数据查找方法
US10725988B2 (en) 2017-02-09 2020-07-28 Micron Technology, Inc. KVS tree
CN107193758A (zh) 2017-05-19 2017-09-22 记忆科技(深圳)有限公司 一种固态硬盘的映射表管理方法及固态硬盘
US10372687B1 (en) 2017-08-03 2019-08-06 EMC IP Holding Company LLC Speeding de-duplication using a temporal digest cache
US10783186B2 (en) 2017-08-31 2020-09-22 Micron Technology, Inc. Heterogenous key-value sets in tree database
US10649959B2 (en) 2017-09-27 2020-05-12 Vmware, Inc. Write-optimized nested trees
US11093450B2 (en) 2017-09-27 2021-08-17 Vmware, Inc. Auto-tuned write-optimized key-value store
US11093454B2 (en) 2017-10-31 2021-08-17 EMC IP Holding Company LLC Speeding deduplication using a most wanted digest cache
US10319445B1 (en) 2017-11-30 2019-06-11 Western Digital Technologies, Inc. Programming unprogrammed upper page during lower page programming of multi-level storage cells
WO2019144100A1 (en) 2018-01-22 2019-07-25 President And Fellows Of Harvard College Key-value stores with optimized merge policies and optimized lsm-tree structures
US11093471B2 (en) 2018-06-05 2021-08-17 Vmware, Inc. Large range lookups for Bϵ-tree
US10824610B2 (en) 2018-09-18 2020-11-03 Vmware, Inc. Balancing write amplification and space amplification in buffer trees
JP6995723B2 (ja) 2018-09-19 2022-01-17 キオクシア株式会社 メモリシステム、ストレージシステム、および制御方法
EP3627343A1 (de) * 2018-09-19 2020-03-25 censhare AG Effiziente speicherinterne multiversion-gleichzeitigkeitssteuerung für eine datenbank auf basis von trie-datenstruktur
US11061881B2 (en) 2018-11-08 2021-07-13 Vmware, Inc. Bounding cost of flushes in buffer trees
US10776276B2 (en) 2018-11-30 2020-09-15 Hewlett Packard Enterprise Development Lp Bypass storage class memory read cache based on a queue depth threshold
US10983909B2 (en) 2019-01-18 2021-04-20 Vmware, Inc. Trading off cache space and write amplification for Bε-trees
US10732881B1 (en) 2019-01-30 2020-08-04 Hewlett Packard Enterprise Development Lp Region cloning for deduplication
US11372823B2 (en) 2019-02-06 2022-06-28 President And Fellows Of Harvard College File management with log-structured merge bush
US11030107B2 (en) 2019-04-19 2021-06-08 Hewlett Packard Enterprise Development Lp Storage class memory queue depth threshold adjustment
US11226904B2 (en) 2019-04-26 2022-01-18 Hewlett Packard Enterprise Development Lp Cache data location system
US20210034584A1 (en) 2019-08-02 2021-02-04 EMC IP Holding Company LLC Inline deduplication using stream detection

Also Published As

Publication number Publication date
CN113868244B (zh) 2023-08-04
DE102021108455B4 (de) 2024-05-08
US11556513B2 (en) 2023-01-17
CN113868244A (zh) 2021-12-31
US20210406236A1 (en) 2021-12-30

Similar Documents

Publication Publication Date Title
DE102021108455B4 (de) Erzeugen von Snapshots eines Schlüssel-Wert-Index
DE112018004178B4 (de) Mehrstufige speicherung in einem verteilten dateisystem
DE112017002941B4 (de) Arbeitslastoptimierte Datendeduplizierung mittels Phantomfingerabdrücken
DE112017005868T5 (de) Verwaltung von e/a-abläufen für datenobjekte in einem speichersystem
DE112020000749T5 (de) Indexerstellung für sich entwickelnde umfangreiche Datensätze in Hybriden Transaktions- und Analysenverarbeitungssystemen mit mehreren Mastern
WO2015090668A1 (de) Posix-kompatibles dateisystem, verfahren zum erzeugen einer dateiliste und speichervorrichtung
DE202010018481U1 (de) Asynchroner verteilter Objekt-Upload für replizierte Assoziativspeichercluster
DE102009034651A1 (de) Prozess und Verfahren zur Abbildung von logischen Adressen auf physische Adressen in Festkörperplatten
DE112011100618T5 (de) Verwalten von Schreiboperationen auf einen Speicherbereich von Spuren, der zwischen Speichereinheiten verlagert wird
DE102009031923A1 (de) Verfahren zum Verwalten von Datenobjekten
DE202013012496U1 (de) Systeme für asynchrone Schemaänderungen
DE102010053282A1 (de) Modifizierter B+ Baum zum Speichern von Nand-Speicher Umleitungszuordnungen
DE102014116393A1 (de) Verfahren und System für ein sicheres Archivieren von Daten
DE102016010277A1 (de) Verfahren und systeme zum verbessern von speicher-journaling
DE112014000448T5 (de) Auszugabruf beruhend auf Ähnlichkeitssuche bei Datendeduplizierung
DE102022108673A1 (de) Ressourcenzuweisung für synthetische backups
DE102021109729A1 (de) Schätzung der nutzung der speichersystemkapazität
DE112021004990T5 (de) Caching techniken
DE112017000167T5 (de) Verteilte Datendeduplizierung in einem Prozessorraster
DE112020003437T5 (de) Hyper-scale p2p-dedupliziertes speichersystem unter verwendung einesdistributed ledger
DE112019000849T5 (de) Hostorientierter Aktualisierungsschreibvorgang
DE102021101239A1 (de) Schwellenwert des deduplizierungssystems basierend auf dem verschleiss eines speichergeräts
DE102021102442A1 (de) Katalog der mit schnappschüssen verbundenen dateien
DE102021108479B4 (de) Schlüssel-Wert-Index mit Knotenpuffern
DE102021108967A1 (de) Schlüssel-wert-index mit knotenpuffern suchen

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R081 Change of applicant/patentee

Owner name: HEWLETT PACKARD ENTERPRISE DEVELOPMENT LP, SPR, US

Free format text: FORMER OWNER: HEWLETT PACKARD ENTERPRISE DEVELOPMENT LP, HOUSTON, TX, US

R016 Response to examination communication
R018 Grant decision by examination section/examining division