-
Hintergrund
-
Datenreduktionstechniken können angewendet werden, um die in einem Speichersystem gespeicherte Datenmenge zu reduzieren. Ein Beispiel für eine Technik zur Datenreduzierung ist die Datendeduplizierung. Die Datendeduplizierung identifiziert doppelte Datenwerte und versucht, die Anzahl der im Speichersystem gespeicherten Instanzen doppelter Datenwerte zu reduzieren oder zu eliminieren.
-
Figurenliste
-
Einige Implementierungen der vorliegenden Offenbarung werden mit Bezug auf die folgenden Figuren beschrieben.
- ist ein Blockdiagramm eines Datenspeichersystems, das einen persistenten Fingerabdruck-Index und einen zwischengespeicherten Fingerabdruck-Index enthält, gemäß einiger Beispiele.
- ist ein Blockdiagramm eines persistenten Fingerabdruck-Index gemäß einiger Beispiele.
- ist ein Flussdiagramm eines Merge-Prozesses gemäß einiger Beispiele.
- ist ein Flussdiagramm eines Lookup-Prozesses gemäß einiger Beispiele.
- ist ein Flussdiagramm eines Wiederherstellungsprozesses gemäß einiger Beispiele.
- ist ein Flussdiagramm eines Garbage Collection-Prozesses gemäß einiger Beispiele.
- ist ein Blockdiagramm eines Speichermediums, das maschinenlesbare Anweisungen gemäß einigen Beispielen speichert.
- ist ein Blockdiagramm eines Datenspeichersystems gemäß einiger Beispiele.
- ist ein Flussdiagramm eines Prozesses gemäß einiger Beispiele.
-
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“, „eine“ oder „die“ auch die Pluralformen ein, sofern aus dem Kontext nicht eindeutig etwas anderes hervorgeht. Auch der Begriff „umfasst“, „einschließlich“, „umfasst“, „umfasst“, „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 wird die Datendeduplizierung durch die Berechnung eines Fingerabdrucks eines eingehenden Datenwerts erreicht, der in ein Datenspeichersystem gespeichert (geschrieben) werden soll. Ein „Datenspeichersystem“ kann ein Speichergerät oder eine Sammlung von Speichergeräten umfassen. Ein Datenspeichersystem kann ein Datenspeicher-Array, eine Datenspeicher-Appliance usw. umfassen.
-
Ein Datenspeichersystem kann auch einen oder mehrere Speicher-Controller enthalten, die den Zugriff auf das/die Speichergerät(e) verwalten. Ein „Datenwert“ kann sich auf jeden Teil der Daten beziehen, der im Datenspeichersystem separat identifiziert werden kann. In einigen Fällen kann sich ein Datenwert auf einen Chunk, eine Sammlung von Chunks oder einen anderen Teil von Daten beziehen.
-
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.
-
Ein „Fingerabdruck“ bezieht sich auf einen Wert, der durch Anwendung einer Funktion auf den Inhalt eines Datenwerts abgeleitet wird (wobei der „Inhalt“ die Gesamtheit oder eine Teilmenge des Inhalts des Datenwerts umfassen kann). Ein Beispiel für eine Funktion, die angewendet werden kann, ist eine Hash-Funktion, die einen Hash-Wert basierend auf dem eingehenden Datenwert 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.
-
Fingerabdrücke repräsentieren Datenwerte, die im Datenspeichersystem gespeichert sind. Vollständige Fingerabdrücke identifizieren die jeweiligen Datenwerte eindeutig (der Unterschied zwischen vollständigen Fingerabdrücken und partiellen Fingerabdrücken wird weiter unten erläutert). Ein für einen eingehenden Datenwert berechneter Fingerabdruck kann mit Fingerabdrücken verglichen werden, die in einem Fingerabdruck-Index gespeichert sind, der zur Datendeduplizierung verwendet wird. Der Fingerprint-Index ordnet Fingerabdrücke für Datenwerte den Speicherplatzindikatoren der Datenwerte zu. Ein „Speicherplatzindikator“ kann sich auf jede Information beziehen, die einen Hinweis auf den Speicherplatz eines Datenwertes in einem persistenten Speicher gibt. Der persistente Speicher kann unter Verwendung eines oder mehrerer persistenter (z. B. nichtflüchtiger) Speichergeräte implementiert werden, wie z. B. plattenbasierte Speichergeräte (z. B. Festplattenlaufwerk(e) (HDDs)), Solid-State-Geräte (SSDs), wie z. B. Flash-Speichergeräte, oder Ähnliches, oder eine Kombination davon.
-
In einigen Beispielen ordnet der Fingerabdruck-Index Fingerabdrücke sequenziellen Blocknummern (SBNs) zu. Eine SBN ist ein Beispiel für einen oben erwähnten Speicherplatzindikator. Eine SBN kann verwendet werden, um festzustellen, wo ein Datenwert physisch in einem persistenten Speicher gespeichert ist. In einigen Beispielen identifiziert die SBN jedoch nicht tatsächlich den physischen Ort, sondern die SBN kann verwendet werden, um eine physische Adresse oder einen anderen Wert abzuleiten, der einen physischen Ort identifiziert.
-
Während einer Datendeduplizierungsoperation, die für einen eingehenden Datenwert durchgeführt wird, zeigt eine Übereinstimmung zwischen einem Fingerabdruck des eingehenden Datenwerts mit einem Fingerabdruck im Fingerabdruckindex an, dass der eingehende Datenwert ein Duplikat eines bereits im Datenspeichersystem gespeicherten Datenwerts sein kann. Wenn der eingehende Datenwert ein Duplikat eines bereits gespeicherten Datenwerts ist, kann, anstatt den doppelten eingehenden Datenwert zu speichern, ein im Datenspeichersystem gespeicherter Referenzzählwert inkrementiert werden, um die Anzahl der empfangenen Instanzen des Datenwerts anzuzeigen.
-
Wenn sich das Datenspeichersystem mit Datenwerten füllt, nimmt die Größe des im persistenten Speicher gespeicherten Fingerabdruckindexes zu. Einen großen Fingerprint-Index auf dem neuesten Stand zu halten, kann kostspielig in Bezug auf die Ressourcennutzung sein.
-
Ein Datenspeichersystem kann eine Reihe verschiedener Speichertypen zum Speichern von Daten enthalten, darunter einen persistenten Speicher, einen nichtflüchtigen Direktzugriffsspeicher (NVRAM) und einen flüchtigen Speicher.
-
Ein persistenter Speicher kann mit relativ kostengünstigen Speichergeräten implementiert werden, z. B. mit plattenbasierten Speichergeräten, Solid-State-Speichergeräten usw. Der persistente Speicher kann eine relativ große Speicherkapazität haben, aber eine relativ langsame Zugriffsgeschwindigkeit aufweisen.
-
Ein NVRAM kann mit elektrisch löschbaren, programmierbaren Festwertspeichern (EEPROMs) implementiert werden. In anderen Beispielen kann ein NVRAM durch batteriegepufferte dynamische Direktzugriffsspeicher (DRAM) oder batteriegepufferte statische Direktzugriffsspeicher (SRAM) implementiert werden. Der NVRAM ist auf Seiten- oder Byte-Basis zufällig zugreifbar (sowohl lesbar als auch beschreibbar) (mit anderen Worten, eine Seite oder ein Byte des NVRAM ist individuell auf eine Anfrage hin zugreifbar, ohne eine andere Seite oder ein anderes Byte des NVRAM abzurufen). Eine Seite oder ein Byte hat eine kleinere Größe als ein physikalischer Block, der in einer anderen Art von Speichergerät verwendet wird, wie z. B. einem Festkörperspeichergerät (z. B. einem Flash-Speichergerät). Ein Solid-State-Speichergerät kann auf Blockbasis beschrieben werden; mit anderen Worten, ein Schreibvorgang auf das Solid-State-Speichergerät würde einen gesamten physischen Block schreiben und nicht nur einen Teil, der kleiner als die Größe des physischen Blocks ist. Im Allgemeinen kann ein NVRAM relativ teuer sein (z. B. teurer als ein Solid-State-Speichergerät oder ein plattenbasiertes Speichergerät), und daher kann ein im Datenspeichersystem enthaltenes NVRAM eine relativ geringe Größe haben.
-
Ein flüchtiger Speicher kann mit DRAM-Bausteinen, SRAM-Bausteinen oder einem anderen Speichertyp implementiert werden, bei dem die im Speicher gespeicherten Daten verloren gehen, wenn die Stromversorgung des Speichers unterbrochen wird. Dies steht im Gegensatz zum persistenten Speicher oder zum NVRAM, die gespeicherte Daten auch dann beibehalten können, wenn die Stromversorgung des persistenten Speichers oder des NVRAM unterbrochen wird.
-
In einigen Beispielen werden zur Verbesserung der Leistung eines Datenspeichersystems bei der Durchführung der Datendeduplizierung Aktualisierungen für eingehende Datenwerte (die Teil von Schreibvorgängen sind) zu einem B-Baum-Index hinzugefügt, der im NVRAM gespeichert sein kann. Der im NVRAM gespeicherte B-Baum-Index wird als Cache-Index betrachtet, da der B-Baum-Index in einem Speicher gespeichert wird, der eine schnellere Zugriffsgeschwindigkeit als der persistente Speicher hat. Ein solcher Cache-Index wird als „B-Tree-Cache-Index“ bezeichnet. Ein B-Baum-Cache-Index umfasst hierarchisch angeordnete Knoten. Blattknoten des B-Tree-Cache-Index enthalten Aktualisierungseinträge, die Fingerabdrücke auf Speicherplatzindikatoren (z. B. SBNs) abbilden. Zwischenknoten des B-Tree-Cache-Index werden verwendet, um einen passenden Eintrag des B-Tree-Cache-Index basierend auf einem Fingerabdruck zu finden.
-
Der B-Tree-Cache-Index kann schnell an Größe zunehmen, wenn die Menge der eingehenden Datenwerte (und damit der entsprechenden Aktualisierungseinträge) steigt. Wenn ein großer Teil des NVRAM durch den B-Tree-Cache-Index verbraucht wird, steht der NVRAM möglicherweise nicht für andere vom Datenspeichersystem ausgeführte Dienste zur Verfügung. Außerdem kann das Zusammenführen von Aktualisierungseinträgen für den B-Tree-Cache-Index aus dem NVRAM in den B-Tree-Cache-Index teuer sein, was den Verbrauch von Verarbeitungsressourcen angeht. Darüber hinaus beinhaltet das Lesen des B-Tree-Cache-Indexes eine binäre Suche in den hierarchischen Knoten des B-Tree-Cache-Indexes, was ebenfalls kostspielig sein kann, was den Verbrauch von Verarbeitungsressourcen betrifft.
-
In Übereinstimmung mit einigen Implementierungen der vorliegenden Offenlegung kann der Cache-Index für einen Fingerabdruckindex statt als B-Baum mit einer logstrukturierten Hash-Tabelle implementiert werden. Darüber hinaus kann in einigen Beispielen der als logstrukturierte Hash-Tabelle implementierte Cache-Index in einem persistenten Cache-Speicher gespeichert werden, der vom NVRAM getrennt ist. Der persistente Cache-Speicher kann mit Festkörperspeichergeräten, wie z. B. Flash-Speichergeräten, implementiert werden. Ein „persistenter Cache-Speicher“ ist ein Cache-Speicher, der die im Cache-Speicher gespeicherten Daten auch dann beibehält, wenn die Stromversorgung des Cache-Speichers unterbrochen wird. Durch das Speichern von Aktualisierungen des Cache-Indexes in einem flüchtigen Speicher anstelle des NVRAMs kann außerdem der teure und begrenzte Speicherplatz des NVRAMs für andere Prozesse eines Systems zur Verfügung gestellt werden.
-
Obwohl in einigen Beispielen auf die Implementierung des persistenten Cache-Speichers mit Festkörperspeichergerät(en) Bezug genommen wird, wird darauf hingewiesen, dass der persistente Cache-Speicher in anderen Beispielen mit anderen Arten von Speichergeräten implementiert werden kann. In alternativen Beispielen kann der als logstrukturierte Hash-Tabelle implementierte Cache-Index im NVRAM statt in einem separaten persistenten Cache-Speicher gespeichert werden. In solchen alternativen Beispielen ist der persistente Cache-Speicher der NVRAM.
-
Im Folgenden wird der Cache-Index, der als logstrukturierte Hash-Tabelle implementiert ist, als gecachter Fingerprint-Index bezeichnet. Der im persistenten Speicher gespeicherte Fingerabdruck-Index wird als persistenter Fingerabdruck-Index bezeichnet. Beachten Sie, dass der persistente Fingerabdruckindex auch in Form einer logstrukturierten Hash-Tabelle vorliegen kann.
-
In Übereinstimmung mit einigen Implementierungen der vorliegenden Offenlegung werden als Reaktion auf eingehende Datenwerte Fingerabdruck-Index-Updates für den Fingerabdruck-Index erstellt und in einer Merge-Operation mit dem persistenten Fingerabdruck-Index im persistenten Speicher zusammengeführt. Als Teil der Merge-Operation werden die Fingerabdruck-Index-Updates auch auf Blattblöcke im zwischengespeicherten Fingerabdruck-Index im permanenten Cache-Speicher gespiegelt, und außerdem wird ein indirekter Block aktualisiert, der Verweise auf die Blattblöcke im zwischengespeicherten Fingerabdruck-Index enthält, die zum Empfangen der Fingerabdruck-Index-Updates verwendet werden.
-
Ein Fingerprint-Index enthält verschiedene Arten von Blöcken, darunter Blattblöcke und indirekte Blöcke. Ein Blattblock eines Fingerprint-Indexes enthält Fingerprint-Indexeinträge, wobei jeder Fingerprint-Indexeintrag einen Fingerprint für einen Datenwert auf einen Speicherplatzindikator (z. B. SBN) des Datenwertes abbildet. Der Speicherplatzindikator kann verwendet werden, um einen Speicherplatz des vom persistenten Speicher gespeicherten Datenwerts zu bestimmen.
-
Ein indirekter Block enthält keine Fingerprint-Indexeinträge; stattdessen enthält ein indirekter Block Positionsinformationen („Referenzen“), die sich auf Positionen von Blattblöcken beziehen.
-
In einigen Beispielen speichert eine logstrukturierte Hash-Tabelle Einträge eines Fingerabdruckindex (gecachter Fingerabdruckindex oder dauerhafter Fingerabdruckindex) in einer Reihe von Blattblöcken, wobei jeder Blattblock eine Anzahl von Buckets enthält. Jeder Blattblock des Fingerabdruckindexes ist eine Einheit der logstrukturierten Hash-Tabelle und ist über einen Blockbezeichner (weiter unten besprochen) eindeutig identifizierbar. Jeder Bucket ist eine Partition eines Blattblocks und ist durch einen Bucket-Identifikator eindeutig identifizierbar (siehe unten). Ein Blattblock kann eine Anzahl von Buckets enthalten. Jeder Bucket kann wiederum mehrere Fingerprint-Indexeinträge speichern.
-
Wenn die logstrukturierte Hashtabelle größer wird, werden zusätzliche Blöcke (Blattblöcke und indirekte Blöcke) an die logstrukturierte Hashtabelle angehängt. Die Blöcke der logstrukturierten Hash-Tabelle sind nach einigen Beispielen Teil eines logstrukturierten Dateisystems (LFS). In der logstrukturierten Hash-Tabelle sind die Fingerprint-Indexeinträge des Fingerprint-Index in der Reihenfolge der Werte der Fingerprints der Fingerprint-Indexeinträge sortiert.
-
Anders als in einem B-Baum ist eine logstrukturierte Hash-Tabelle nicht als hierarchische Baumstruktur angeordnet, sondern umfasst eine Folge von Abschnitten (Buckets), die die Fingerabdruck-Indexeinträge in sortierter Reihenfolge (z. B. in auf- oder absteigender Reihenfolge der Fingerabdruckwerte) enthalten. In einigen Beispielen können die Buckets in Blattblöcken enthalten sein, die ihrerseits in Segmenten enthalten sein können. Die Blattblöcke und Buckets können variabel groß sein.
-
In einigen Beispielen beinhaltet die Suche in einer logstrukturierten Hash-Tabelle keine binäre Suche (wie es bei einem B-Baum der Fall wäre), wodurch die Suche in einem Fingerprint-Index effizienter sein kann als die Suche in einem B-Baum. Vielmehr ist eine log-strukturierte Hash-Tabelle beliebig zugreifbar, indem eine Anfrage zum Zugriff auf die log-strukturierte Hash-Tabelle einen Eintrag der logstrukturierten Hash-Tabelle abrufen kann, ohne eine binäre Suche durch hierarchische Knoten durchführen zu müssen.
-
Die Anordnung eines Fingerabdruck-Index als logstrukturierte Hash-Tabelle kann im Vergleich zu einem B-Baum-Fingerabdruck-Index den Speicherverbrauch, den Verbrauch von Netzwerkbandbreite eines Datenspeichersystems, den Verbrauch von Verarbeitungsressourcen usw. reduzieren.
-
zeigt ein Beispiel für ein Datenspeichersystem 102, das einen flüchtigen Speicher 104, einen NVRAM 150, einen persistenten Cache-Speicher 152 und einen persistenten Speicher 112 umfasst. Obwohl in eine bestimmte Anordnung von Komponenten gezeigt ist, wird darauf hingewiesen, dass das Datenspeichersystem 102 in anderen Beispielen eine andere Anordnung von Komponenten enthalten kann.
-
Das Datenspeichersystem 102 umfasst auch einen Speicher-Controller 103, der verschiedene Engines umfasst, darunter eine Deduplizierungs-Engine 118, eine Merge-Engine 109, eine Recovery-Engine 170 und eine Garbage-Collector-Engine 180. Obwohl im Beispiel von bestimmte Engines dargestellt sind, kann der Speicher-Controller 103 in anderen Beispielen weniger oder mehr Engines enthalten.
-
Jede Engine kann sich auf einen Teil einer Hardware-Verarbeitungsschaltung des Speicher-Controllers 103 beziehen oder alternativ auf maschinenlesbare Anweisungen (Software und/oder Firmware, die auf mindestens einem maschinenlesbaren Speichermedium gespeichert sind), die von der Hardware-Verarbeitungsschaltung des Speicher-Controllers 103 ausgeführt werden können. In anderen Beispielen können auch einige der Engines vom Speicher-Controller 103 getrennt sein.
-
In Übereinstimmung mit einigen Implementierungen der vorliegenden Offenbarung wird ein dauerhafter Fingerabdruckindex 110 (in Form einer logstrukturierten Hash-Tabelle) im dauerhaften Speicher 112 gespeichert, und ein zwischengespeicherter Fingerabdruckindex 154 wird im dauerhaften Cache-Speicher 152 gespeichert. Der zwischengespeicherte Fingerabdruckindex 154 hat ebenfalls die Form einer logstrukturierten Hash-Tabelle und enthält einen Teil des dauerhaften Fingerabdruckindex 110.
-
Wenn eingehende Datenwerte 114 (von Schreibanforderungen) vom Datenspeichersystem 102 empfangen werden, können Fingerprint-Index-Updates für die eingehenden Datenwerte 114 erstellt werden. Die Schreibanforderungen können von einem Anforderungsgerät (oder mehreren Anforderungsgeräten) empfangen werden, das (die) mit dem Datenspeichersystem 102 über ein Netzwerk gekoppelt ist (sind), wie z. B. ein lokales Netzwerk (LAN), ein Weitverkehrsnetz (WAN), ein Speichernetzwerk (SAN) usw. Ein Anforderungsgerät kann sich auf einen Server-Computer, einen Desktop-Computer, einen Notebook-Computer, einen Tablet-Computer, ein Smartphone oder jede andere Art von elektronischem Gerät beziehen. Nach der von der Deduplizierungs-Engine 118 durchgeführten Datendeduplizierung können die Datenwerte der Schreibanforderungen in einen Datenspeicher 156 im persistenten Speicher 112 geschrieben werden.
-
Ein „Fingerprint-Index-Update“ kann sich auf Aktualisierungsinformationen für den Fingerprint-Index für einen eingehenden Datenwert beziehen, der im Datenspeichersystem 102 gespeichert werden soll. Ein Fingerprint-Index-Update für einen eingehenden Datenwert kann beispielsweise einen für den eingehenden Datenwert berechneten Fingerabdruck (z. B. einen Hash-Wert) und einen Speicherplatzindikator (z. B. eine SBN) für den eingehenden Datenwert enthalten.
-
Die nachfolgende Diskussion bezieht sich auf SBNs, die von den Fingerabdruckindizes 110, 154 verwendet werden. Es wird darauf hingewiesen, dass Techniken oder Mechanismen gemäß einiger Beispiele auch mit anderen Arten von Speicherplatzindikatoren in den Fingerabdruckindizes 110, 154 verwendet werden können.
-
Jedes Fingerabdruckindex-Update kann in einem Puffer zwischengespeichert werden. Der flüchtige Speicher 104 umfasst einen aktiven Aktualisierungspuffer 106 und einen Synchronisationspuffer 108 (als „Sync-Puffer“ bezeichnet). Obwohl in nur ein aktiver Aktualisierungspuffer 106 und ein Synchronisierungspuffer 108 gezeigt sind, kann das Datenspeichersystem 102 in anderen Beispielen mehrere aktive Aktualisierungspuffer 106 und/oder mehrere Synchronisierungspuffer 108 enthalten.
-
Allgemeiner ausgedrückt: In anderen Beispielen kann das Datenspeichersystem 102 eine andere Anordnung haben. So kann z. B. statt eines aktiven Aktualisierungspuffers 106 und eines Synchronisationspuffers 108 nur ein Puffer verwendet werden.
-
Der aktive Aktualisierungspuffer 106 wird verwendet, um Fingerabdruck-Index-Updates 140 zu empfangen, die den eingehenden Datenwerten 114 entsprechen. Der Sync-Puffer 108 speichert auch Fingerabdruck-Index-Updates. Fingerabdruckindex-Updates im Synchronisationspuffer 108 werden von der Merge-Engine 109 mit dem persistenten Fingerabdruckindex 110 im persistenten Speicher 112 des Datenspeichersystems 102 zusammengeführt.
-
Die Rollen des aktiven Aktualisierungspuffers 106 und des Sync-Puffers 108 können sich im Laufe der Zeit ändern. Der aktive Aktualisierungspuffer 106 soll Fingerabdruck-Index-Updates 140 empfangen, während eine Zusammenführung der Fingerabdruck-Index-Updates 140 im Synchronisierungspuffer 108 mit dem persistenten Fingerabdruck-Index 110 erfolgen kann. Sobald die Zusammenführung der Fingerabdruck-Index-Updates 140 im Synchronisationspuffer 108 zum dauerhaften Fingerabdruck-Index 110 abgeschlossen ist, können die Rollen des aktiven Aktualisierungspuffers 106 und des Synchronisationspuffers 108 wechseln, wenn der aktive Aktualisierungspuffer 106 mit Fingerabdruck-Index-Updates 140 über einen Schwellenwert hinaus gefüllt ist (z. B. wenn die Anzahl der Fingerabdruck-Index-Updates 140 im aktiven Aktualisierungspuffer 106 eine Schwellenanzahl oder einen Schwellenprozentsatz der Speicherkapazität des Aktualisierungspuffers 106 überschreitet). Das Umschalten der Rollen der Puffer 106 und 108 bewirkt, dass der Puffer, der zuvor als aktiver Aktualisierungspuffer bezeichnet wurde, zum Synchronisierungspuffer wird, und der Puffer, der zuvor als Synchronisierungspuffer bezeichnet wurde, zum aktiven Aktualisierungspuffer wird.
-
Mit weiterem Bezug auf sind weitere Details für den persistenten Fingerabdruckindex 110 dargestellt, der nach einigen Beispielen als logstrukturierte Hash-Tabelle angeordnet ist. Die logstrukturierte Hash-Tabelle des gepufferten Fingerabdruckindex 154 kann eine ähnliche Anordnung haben.
-
In dem in gezeigten Beispiel umfasst die logstrukturierte Hash-Tabelle die Logsegmente 202, 204, 206, 208 und 210. Ein Log-Segment der logstrukturierten Hash-Tabelle, das den persistenten Fingerabdruckindex 110 enthält, kann in einigen Beispielen eine feste Größe haben, z. B. 32 Megabyte (MB) oder eine andere Größe. Jedes Protokollsegment kann einen Blattblock (oder mehrere Blattblöcke) und/oder einen indirekten Block (oder mehrere indirekte Blöcke) speichern. Ein Blattblock (z. B. einer der Blattblöcke 204-1 im Protokollsegment 204) speichert Fingerabdruck-Indexeinträge. Ein „Fingerabdruck-Indexeintrag“ enthält einen Fingerabdruck und eine entsprechende SBN. Ein indirekter Block (z. B. 204-2 im Logsegment 204) enthält Verweise auf Blattblöcke. Ein „Verweis“ auf einen Blattblock kann einen Hinweis auf einen Ort (z. B. eine physikalische Adresse) im permanenten Speicher 112 enthalten, an dem der Blattblock gespeichert ist.
-
In einigen Beispielen kann ein Leaf-Block, der Buckets mit Fingerabdruck-Indexeinträgen speichert, eine Nenngröße von 16 Kilobyte (KB) haben. Ein Leaf-Block kann bis zu 32 KB groß werden (ein Beispiel für die maximale Größe eines Leaf-Blocks), um mehr Fingerabdruck-Indexeinträge unterzubringen, wenn der Leaf-Block voll wird. In einigen Beispielen kann ein indirekter Block 5 Megabyte (MB) groß sein oder eine andere Größe haben.
-
Obwohl für Blatt- und indirekte Blöcke bestimmte Größenwerte angegeben wurden, wird darauf hingewiesen, dass Blatt- und indirekte Blöcke in anderen Beispielen auch andere Größen haben können.
-
Wenn Blattblöcke zum persistenten Fingerprint-Index 110 hinzugefügt werden und eine entsprechende Anzahl von Blockreferenzen zu einem indirekten Block hinzugefügt wird, kann der indirekte Block voll werden (d. h. mit Blockreferenzen auf Blattblöcke gefüllt werden, so dass der indirekte Block nicht mehr genügend Platz hat, um weitere Blockreferenzen aufzunehmen), ein weiterer indirekter Block kann erstellt und zu einem Protokollsegment hinzugefügt werden.
-
Wie in weiter gezeigt, wächst die log-strukturierte Hash-Tabelle, die den persistenten Fingerabdruck-Index 110 enthält, in ihrer Größe, indem zusätzliche Blöcke in der durch den Pfeil 212 angegebenen Richtung angehängt werden (z. B. können die zusätzlichen Blöcke an ein Ende der log-strukturierten Hash-Tabelle angehängt werden).
-
Die logstrukturierte Hash-Tabelle enthält außerdem Header-Informationen 214, die die Positionen der indirekten Blöcke (falls vorhanden) innerhalb jedes Log-Segments identifizieren. Blattblöcke und indirekte Blöcke können sich innerhalb desselben Protokollsegments mischen. Die Standortinformationen (in den Header-Informationen 214) für jeden indirekten Block identifizieren ein Protokollsegment (in dem der indirekte Block enthalten ist) und einen Offset innerhalb des Protokollsegments, in dem der indirekte Block enthalten ist.
-
Wie in weiter gezeigt, enthält das Protokollsegment 204 mehrere Blattblöcke 204-1. Zum Beispiel umfassen die mehreren Blattblöcke 204-1 M Blattblöcke, einschließlich Block 0, Block 1, Block 2, ..., Block M-1, wobei M ≥ 2 ist. Jeder Blattblock umfasst außerdem P Buckets, einschließlich Bucket 0, Bucket 1, ..., Bucket P-1, wobei P ≥ 2 ist.
-
Jeder Eimer enthält eine Anzahl von Fingerabdruck-Indexeinträgen, wobei jeder Fingerabdruck-Indexeintrag einen Fingerabdruck mit einem Speicherplatzindikator verknüpft. Jeder Fingerabdruck-Indexeintrag enthält ein Schlüssel-Wert-Paar, wobei der Schlüssel der Fingerabdruck und der Wert die entsprechende SBN ist.
-
Ein Blattblock enthält auch Blockkopf-Informationen 216, die Informationen über die Größe des Blattblocks, Informationen über die Anzahl der Fingerabdruck-Indexeinträge in jedem der N Bereiche des Blattblocks und andere Informationen enthalten.
-
Die Merge-Engine 109 führt eine Merge-Operation durch, um Fingerabdruck-Update-Einträge im Synchronisationspuffer 108 mit den Blattblöcken des persistenten Fingerabdruck-Index 110 zusammenzuführen. Jeder Fingerabdruck-Aktualisierungseintrag im Synchronisationspuffer 108 kann in Form eines Schlüssel-Wert-Paares vorliegen (wobei der Schlüssel ein Fingerabdruck und der Wert die entsprechende SBN ist). Die Merge-Operation führt die Schlüssel-Wert-Paare des Sync-Puffers 108 in den persistenten Fingerprint-Index 110 in sortierter Reihenfolge (z. B. aufsteigende Reihenfolge der Fingerabdrücke) der Schlüssel-Wert-Paare im Sync-Puffer 108 zusammen. Während des Zusammenführungsvorgangs kann die Merge-Engine 109 beispielsweise den Synchronisationspuffer 108 in der Reihenfolge von einem Schlüssel-Wert-Paar mit dem niedrigsten Schlüssel-(Fingerabdruck-)Wert bis zum Schlüssel-Wert-Paar mit dem höchsten Schlüssel-(Fingerabdruck-)Wert durchlaufen.
-
Als Ergebnis des Zusammenführens von Schlüssel-Wert-Paaren aus dem Synchronisationspuffer 108 in sortierter Reihenfolge in den persistenten Fingerprint-Index 110 sind die resultierenden Schlüssel-Wert-Paare im persistenten Fingerprint-Index 110 ebenfalls nach dem Schlüsselwert (Fingerprint) sortiert.
-
Wenn ein Log-Segment des persistenten Fingerprint-Index 110 vor dem Zusammenführungsvorgang bereits bestehende Schlüssel-Wert-Paare enthält, dann können die bestehenden Schlüssel-Wert-Paare aus dem Log-Segment in einen Bereitstellungsbereich (nicht dargestellt) des Speichers 104 abgerufen werden, und die zusammenzuführenden Schlüssel-Wert-Paare des Synchronisationspuffers 108 werden ebenfalls in den Bereitstellungsbereich verschoben. Die vorhandenen Schlüssel-Wert-Paare des Log-Segments werden mit den Schlüssel-Wert-Paaren des Sync-Puffers 108 in sortierter Reihenfolge der Schlüssel- (Fingerprint-) Werte zusammengeführt, und die sortierten Schlüssel-Wert-Paare werden dann aus dem Bereitstellungsbereich in das Log-Segment des persistenten Fingerprint-Index 110 geschrieben.
-
Daten-Deduplizierunq
-
Die Deduplizierungs-Engine 118 des Speicher-Controllers 103 führt eine Datendeduplizierung für die eingehenden Datenwerte 114 durch. Um die Datendeduplizierung durchzuführen, verwendet die Deduplizierungs-Engine 118 einen Fingerprint-Index und einen Ortsindex 116 (gespeichert im persistenten Speicher 112). Für jeden eingehenden Datenwert 114 versucht die Deduplizierungs-Engine 118 zunächst, einen Lookup des zwischengespeicherten Fingerprint-Index 154 durchzuführen. Wenn der entsprechende Fingerabdruck für den eingehenden Datenwert 114 im zwischengespeicherten Fingerabdruck-Index 154 vorhanden ist, dann kann der Eintrag des zwischengespeicherten Fingerabdruck-Index 154 für die Datendeduplizierung verwendet werden. Wenn jedoch der entsprechende Fingerabdruck für den eingehenden Datenwert 114 nicht im zwischengespeicherten Fingerabdruck-Index 154 vorhanden ist, dann greift die Deduplizierungs-Engine 118 auf den entsprechenden Eintrag aus dem persistenten Fingerabdruck-Index 110 zu, um eine Datendeduplizierung durchzuführen
-
Beachten Sie, dass, obwohl der Ortsindex 116 als im permanenten Speicher 112 gespeichert dargestellt ist, in einigen Fällen Teile des Ortsindex 116 in den Speicher 104 zum schnelleren Nachschlagen abgerufen werden können.
-
In Beispielen, in denen der persistente Speicher 112 eine Speicherplatte umfasst, wird der Ortsindex 116 als „Plattenindex“ bezeichnet. Der Ortsindex 116 kann in Form eines B-Baum-Index vorliegen oder in anderen Beispielen ein anderes Format haben.
-
Wie oben erwähnt, ordnet ein Fingerabdruck-Index (z. B. der zwischengespeicherte Fingerabdruck-Index 154 oder der dauerhafte Fingerabdruck-Index 110) Fingerabdrücke SBNs zu. Genauer gesagt, der Fingerabdruck-Index ordnet partielle Fingerabdrücke den SBNs zu. Partielle Fingerabdrücke werden weiter unten besprochen.
-
In einigen Beispielen bildet der Ortsindex 116 SBNs auf entsprechende physische Orte ab, wie z. B. physische Adressen (ADDR) des persistenten Speichers 112. Genauer gesagt ordnet jeder Eintrag von mehreren Einträgen 117 (z. B. Blattknoten eines B-Baums, der den Ortsindex 116 speichert) eine SBN einem entsprechenden physischen Ort (z. B. physische Adresse, ADDR) sowie einem vollständigen Fingerabdruck, Full FP (weiter unten erklärt), zu. Wenn also ein Fingerabdruck eines eingehenden Datenwerts gegeben ist und ein Nachschlagen im Fingerabdruck-Index (zwischengespeicherter Fingerabdruck-Index 154 oder persistenter Fingerabdruck-Index 110) unter Verwendung des gegebenen Fingerabdrucks eine Übereinstimmung mit einem Eintrag des Fingerabdruck-Index ergibt, dann erzeugt diese Übereinstimmung eine SBN, die dem gegebenen Fingerabdruck entspricht. Die SBN wird dann zum Nachschlagen im Ortsindex 116 verwendet, der die SBN auf einen entsprechenden Bezeichner eines physischen Orts (z. B. eine physische Adresse) eines Datenwerts abbildet.
-
Ein partieller Fingerabdruck, der vom Fingerabdruck-Index 110 oder 154 gespeichert wird, umfasst einen Teil (d. h. weniger als die Gesamtheit) eines vollständigen Fingerabdrucks, der durch Anwendung einer Fingerabdruckfunktion auf den Inhalt eines Datenwerts berechnet wird. Zum Beispiel kann ein partieller Fingerabdruck einen partiellen Hash-Wert enthalten, der einen Teil eines vollständigen Hash-Wertes enthält (z. B. eine Teilmenge der Bits, aus denen der vollständige Hash-Wert besteht). Die Bits, aus denen der partielle Hash-Wert besteht, können die niederwertigsten Bits der Bits sein, aus denen der vollständige Hash-Wert besteht.
-
Wie in gezeigt, enthält der persistente Fingerabdruck-Index 110 mehrere Einträge 111, wobei jeder Eintrag 111 einen partiellen Fingerabdruck (Partial FP) auf eine entsprechende SBN abbildet. In ähnlicher Weise enthält der Cache-Fingerprint-Index 154 mehrere Einträge 155, wobei jeder Eintrag 155 einen partiellen Fingerabdruck (Partial FP) auf eine entsprechende SBN abbildet. Die Einträge 111, 155 der jeweiligen persistenten/zwischengespeicherten Fingerabdruckindizes 110, 154 sind in den Buckets der oben besprochenen logstrukturierten Hash-Tabellen enthalten.
-
In einigen Beispielen ist ein Nachschlagen im Fingerabdruckindex 154 oder 110 ein Nachschlagen eines partiellen Fingerabdrucks, der auf der Grundlage eines eingehenden Datenwerts 114 berechnet wurde. In solchen Beispielen ist eine Übereinstimmung des partiellen Fingerabdrucks im Fingerabdruck-Index nicht schlüssig in Bezug darauf, ob ein duplizierter Datenwert bereits im Datenspeicher156 gespeichert ist oder nicht. Da ein partieller Fingerabdruck vom Fingerabdruck-Index 154 oder 110 verwendet wird, können potenziell mehrere unterschiedliche Datenwerte denselben partiellen Fingerabdruck erzeugen.
-
In solchen Beispielen wird, um zu bestätigen, dass der übereinstimmende Eintrag 155 oder 111 des Fingerabdruckindexes 154 oder 110 (der mit einem teilweisen Fingerabdruck eines gegebenen eingehenden Datenwertes 114 übereinstimmt) tatsächlich einem Duplikat des gegebenen eingehenden Datenwertes 114 entspricht, die SBN des übereinstimmenden Eintrags 155 oder 111 des Fingerabdruckindexes 154 oder 110 verwendet, um den entsprechenden Eintrag 117 des Ortsindexes 116 abzurufen, wobei der abgerufene Eintrag 117 des Ortsindexes 116 die SBN auf einen physischen Ort des gegebenen eingehenden Datenwertes 114 und den vollständigen Fingerabdruck des gegebenen eingehenden Datenwertes 114 abbildet.
-
Die Deduplizierungs-Engine 118 ist in der Lage, basierend auf dem vollständigen Fingerabdruck aus dem Ortsindex 116 zu bestimmen, ob das Datenspeichersystem 102 tatsächlich ein Duplikat des gegebenen eingehenden Datenwerts 114 enthält oder nicht. Genauer gesagt, vergleicht die Deduplizierungs-Engine 118 den vollständigen Fingerabdruck, der für den gegebenen eingehenden Datenwert 114 berechnet wurde, mit dem vollständigen Fingerabdruck, der aus dem Ortsindex 116 abgerufen wurde. Wenn in solchen Beispielen die vollständigen Fingerabdrücke übereinstimmen, kann die Deduplizierungs-Engine 118 feststellen, dass ein Duplikat des gegebenen eingehenden Datenwerts 114 bereits (im Datenspeicher 156) im Datenspeichersystem 102 gespeichert ist. Als Ergebnis kann die Deduplizierungs-Engine 118 entscheiden, den gegebenen eingehenden Datenwert 114 nicht in den persistenten Speicher 112 zu schreiben, sondern kann stattdessen eine Zählung der Anzahl der Instanzen des Datenwerts (die den übereinstimmenden vollständigen Fingerabdruck teilen) aktualisieren, die empfangen wurden.
-
Wenn andererseits der für den gegebenen eingehenden Datenwert 114 berechnete vollständige Fingerabdruck nicht mit dem aus dem Ortsindex 116 abgerufenen vollständigen Fingerabdruck übereinstimmt, dann zeigt dies an, dass das Datenspeichersystem 102 kein Duplikat des gegebenen eingehenden Datenwerts 114 speichert. Infolgedessen wird der gegebene eingehende Datenwert 114 in den Datenspeicher 156 des persistenten Speichers 112 geschrieben. Darüber hinaus erzeugt die Deduplizierungs-Engine 118 ein Fingerprint-Index-Update 140 für den gegebenen eingehenden Datenwert. Beachten Sie, dass ein Fingerprint-Index-Update 140 nicht für einen eingehenden Datenwert erzeugt wird, der ein Duplikat eines bereits im permanenten Speicher 112 gespeicherten Datenwerts ist.
-
Wie in gezeigt, enthält die Deduplizierungs-Engine 118 einen Datenwert-Hasher 120. Der Datenwert-Hasher 120 kann unter Verwendung eines Teils der Hardware-Verarbeitungsschaltung der Deduplizierungs-Engine 118 implementiert werden oder alternativ maschinenlesbare Anweisungen enthalten, die von einer Hardware-Verarbeitungsschaltung des Speicher-Controllers 103 ausgeführt werden können. Obwohl der Datenwert-Hasher 120 als Teil der Deduplizierungs-Engine 118 dargestellt ist, wird darauf hingewiesen, dass in anderen Beispielen der Datenwert-Hasher 120 von der Deduplizierungs-Engine 118 getrennt sein kann.
-
Ein vom Datenwert-Hasher 120 erzeugter Fingerabdruck kann einen Hash-Wert enthalten. In anderen Beispielen kann ein anderer Typ von Fingerabdruckgenerator verwendet werden, um einen anderen Typ eines Fingerabdrucks zu erzeugen. Der Datenwert-Hasher 120 erzeugt sowohl einen vollständigen Fingerabdruck (z. B. einen vollständigen Hash-Wert), der im Ortsindex 116 zu speichern ist, als auch einen partiellen Fingerabdruck (z. B. einen partiellen Hash-Wert), der in den Fingerabdruck-Indizes 154, 110 zu speichern ist.
-
Zusammenführen von Fingerabdruck-Index-Updates
-
ist ein Flussdiagramm eines Merge-Prozesses 300, der von der Speichersteuerung 103 gemäß einigen Beispielen durchgeführt wird. Die Speichersteuerung 103 empfängt (bei 302) eingehende Datenwerte 114. Basierend auf den eingehenden Datenwerten 114 erzeugt die Speichersteuerung 103 Fingerabdruckindex-Updates 140 ( ), die (bei 304) dem aktiven Update-Puffer 106 im Speicher 104 hinzugefügt werden, gemäß einigen Beispielen. Insbesondere erzeugt der Datenwert-Hasher 120 für die eingehenden Datenwerte 114 entsprechende partielle Fingerabdrücke (sowie entsprechende vollständige Fingerabdrücke), wobei die partiellen Fingerabdrücke in den Fingerabdruck-Index-Updates 140 enthalten sind. Jedes Fingerabdruck-Index-Update 140 enthält außerdem die entsprechende SBN.
-
In Beispielen, in denen sowohl der aktive Aktualisierungspuffer 106 als auch der Synchronisierungspuffer 108 verwendet werden, kann der aktive Aktualisierungspuffer 106 zu einem bestimmten Zeitpunkt in den Synchronisierungspuffer 108 umgeschaltet werden, z. B. als Reaktion darauf, dass der aktive Aktualisierungspuffer 106 voll wird. Die Merge-Engine 109 der Speichersteuerung 103 führt (bei 306) in einer Merge-Operation die Fingerabdruck-Indexeinträge im Sync-Puffer 108 in den persistenten Fingerabdruck-Index 110 zusammen. Das Zusammenführen der Fingerabdruck-Index-Updates in den persistenten Fingerabdruck-Index 110 kann das Hinzufügen von Fingerabdruck-Index-Updates zu bestehenden Blatt-Blöcken des persistenten Fingerabdruck-Index 110 und/oder das Erstellen eines neuen Blatt-Blocks im persistenten Fingerabdruck-Index 110 zum Hinzufügen von Fingerabdruck-Index-Einträgen beinhalten. Ein neuer Blattblock wird erstellt, um Fingerabdruck-Indexeinträge hinzuzufügen, die Fingerabdruckwerte haben, die keinem bestehenden Blattblock des persistenten Fingerabdruck-Index 110 entsprechen. Beachten Sie, dass jeder bestehende Blattblock des persistenten Fingerabdruck-Index 110 Fingerabdruck-Indexeinträge speichern soll, die Fingerabdruckwerte enthalten, die von einem führenden Fingerabdruckwert bis zu einem endenden Fingerabdruckwert reichen.
-
Als Teil der Merge-Operation, die die Fingerabdruck-Index-Updates in den persistenten Fingerabdruck-Index 110 zusammenführt, spiegelt die Merge-Engine 109 die Fingerabdruck-Index-Updates in den gecachten Fingerabdruck-Index 154 im persistenten Cache-Speicher 152 (bei 308) und fügt außerdem (bei 310) einem indirekten Block 142 ( ) Ortsinformationen hinzu, die sich auf einen Blattblock (einen gecachten Blattblock des gecachten Fingerabdruck-Index 154) beziehen, in den die Fingerabdruck-Index-Updates kopiert werden. Der indirekte Block 142 ist ein „Schatten“-indirekter Block, der sich auf eine Position eines Blattblocks im zwischengespeicherten Fingerabdruckindex 154 im permanenten Cache-Speicher 152 bezieht. In Übereinstimmung mit einigen Implementierungen der vorliegenden Offenlegung werden die Standortinformationen dem indirekten Block 142 anstelle eines B-Baum-Cache-Index hinzugefügt.
-
Der indirekte Block 142 wird im Speicher 104 zwischengespeichert und kann eine zwischengespeicherte Version eines indirekten Blocks 162 im persistenten Cache-Speicher 152 sein.
-
Unter Verwendung von Techniken oder Mechanismen, bei denen Fingerprint-Index-Updates in den zwischengespeicherten Fingerprint-Index 154 gespiegelt werden und Standorte von zwischengespeicherten Blattblöcken zum indirekten Block 142 im flüchtigen Speicher 104 hinzugefügt werden, muss ein B-Tree-Cache-Index im NVRAM 150 nicht verwendet werden, so dass die Fingerprint-Index-Updates und entsprechende Standortinformationen nicht zu einem solchen B-Tree-Cache-Index hinzugefügt werden müssen.
-
Das Spiegeln der Fingerabdruck-Index-Updates in den zwischengespeicherten Fingerabdruck-Index 154 bezieht sich auf das Kopieren der Fingerabdruck-Index-Updates in bestehende Blatt-Blöcke und/oder das Erstellen eines neuen Blatt-Blocks, um Fingerabdruck-Index-Updates unterzubringen, die die am persistenten Fingerabdruck-Index 110 durchgeführten Updates spiegeln.
-
Die Ortsinformationen, die sich auf den zwischengespeicherten Blattblock beziehen, sind Ortsinformationen, die den Ort im persistenten Cache-Speicher 152 angeben, an dem der Blattblock gespeichert ist. In liegt die Ortsangabe zu einem Leaf-Block in Form einer Blockreferenz 144 vor. Eine Blockreferenz 144 kann eine physikalische Adresse eines Ortes im persistenten Cache-Speicher 152 enthalten, an dem ein Blattblock des gecachten Fingerabdruckindex 154 gespeichert ist.
-
In einigen Beispielen wird, wenn ein Fingerabdruckindex-Update, das in den zwischengespeicherten Fingerabdruckindex 154 gespiegelt wird (bei 308), dazu führt, dass ein neuer Blattblock im zwischengespeicherten Fingerabdruckindex 154 erstellt wird (was die Erstellung eines neuen Blattblocks im dauerhaften Fingerabdruckindex 110 spiegelt), die Standortinformationen (Blockreferenz 144) des neuen Blattblocks zum indirekten Block 142 hinzugefügt (bei 310).
-
Gemäß einigen Implementierungen der vorliegenden Offenbarung ist die Aktualisierung des persistenten Fingerabdruckindex 110 und des zwischengespeicherten Fingerabdruckindex 154 mit den Fingerabdruckindex-Updates eine gemeinsame Aktualisierung. Die gemeinsame Aktualisierung ermöglicht, dass der zwischengespeicherte Fingerabdruckindex 154 in einem konsistenten Zustand in Bezug auf den dauerhaften Fingerabdruckindex 110 gehalten wird. Darüber hinaus stellt die gemeinsame Aktualisierung in einigen Beispielen sicher, dass Fingerabdruck-Index-Updates, die mit dem dauerhaften Fingerabdruck-Index 110 zusammengeführt und in den zwischengespeicherten Fingerabdruck-Index 154 kopiert werden, gemeinsam übertragen werden. Die Merge-Operation, die die Fingerabdruck-Index-Updates zusammenführt, kann als eine Transaktion betrachtet werden, die entweder in ihrer Gesamtheit bestätigt wird oder abgebrochen wird, wenn die Transaktion nicht beendet werden kann. Das Festschreiben von Fingerabdruckindex-Updates einer Merge-Operation kann sich darauf beziehen, dass die Updates als erfolgreich persistent im persistenten Fingerabdruckindex 110 und im Cache-Fingerabdruckindex 154 gespeichert werden. Auf diese Weise werden Aktualisierungen sowohl des persistenten Fingerabdruckindexes 110 als auch des gecachten Fingerabdruckindexes 154 gemeinsam oder gar nicht bestätigt.
-
Indem dem indirekten Block 142 Ortsinformationen hinzugefügt werden, die sich auf Blattblöcke des zwischengespeicherten Fingerabdruckindexes 154 beziehen, in den die Fingerabdruckindex-Updates als Teil der Merge-Operation kopiert werden, müssen die Ortsinformationen, die sich auf die Blattblöcke beziehen, nicht als separater Eintrag in den NVRAM 150 hinzugefügt werden ( ). Folglich wird kein NVRAM-Speicherplatz für das Zusammenführen von Fingerabdruckindex-Updates in den persistenten Fingerabdruckindex 110 verbraucht.
-
Durch die Spiegelung der Fingerabdruck-Index-Updates der Merge-Operation in den zwischengespeicherten Fingerabdruck-Index 154 müssen auch keine separaten Update- und Sync-Puffer im Speicher 104 für den zwischengespeicherten Fingerabdruck-Index 154 vorgesehen werden. Der Verzicht auf separate Aktualisierungs- und Synchronisierungspuffer für den zwischengespeicherten Fingerabdruckindex 154 reduziert den Speicherbedarf des Speichers 104 für die Merge-Operation und auch den Verarbeitungsaufwand für die Durchführung der Fingerabdruckindexpflege.
-
Lookups für die Datendeduplizierunq
-
ist ein Flussdiagramm eines Lookup-Prozesses 400 zur Durchführung eines Lookups des zwischengespeicherten Fingerprint-Index 154 während einer Deduplizierungsoperation, die von der Deduplizierungs-Engine 118 ( ) durchgeführt wird. Die Deduplizierungsoperation wird für einen eingehenden Datenwert 114 durchgeführt, um festzustellen, ob ein Duplikat des eingehenden Datenwerts 114 bereits im persistenten Speicher 112 gespeichert ist und somit nicht erneut gespeichert werden muss oder nicht.
-
Der Nachschlageprozess 400 bestimmt (bei 402), ob sich ein entsprechender Blattblock (des zwischengespeicherten Fingerabdruckindex 154) für den eingehenden Datenwert 114 im Speicher 104 befindet. Diese Bestimmung basiert auf der Berechnung eines Blockbezeichners (für einen Blattblock) auf der Grundlage des aus dem eingehenden Datenwert 114 berechneten partiellen Fingerabdrucks.
-
In einigen Beispielen wird der Blockbezeichner eines Blattblocks gemäß Gl. 1 errechnet:
-
Die Eimerkennung wird gemäß Gl. 2 berechnet:
wobei fp den partiellen Fingerabdruckwert des eingehenden Datenwerts 114 darstellt, und S eine Bucket-Spanne darstellt, die der Abstand zwischen einem ersten Schlüssel (einem ersten Fingerabdruckwert) und einem letzten Schlüssel (einem letzten Fingerabdruckwert) in einem Bucket ist.
-
Der Blockbezeichner kann als Index in den indirekten Block 142 ( ) verwendet werden, wobei der Index auf einen Eintrag im indirekten Block 142 zeigt. Der durch den Blockbezeichner indizierte Eintrag enthält eine Blockreferenz 144 ( ), die eine Position des entsprechenden Blattblocks im zwischengespeicherten Fingerprint-Index 154 angibt.
-
Obwohl in einigen Beispielen bestimmte Gleichungen zur Berechnung der Blockkennung verwendet werden, wird darauf hingewiesen, dass die Blockkennung in anderen Beispielen auf andere Weise berechnet werden kann.
-
Die Bestimmung, ob sich der Blattblock, der dem eingehenden Datenwert 114 entspricht, im Speicher 104 befindet, kann darauf basieren, ob der Speicher 104 den Blattblock mit dem aus dem partiellen Fingerabdruck des eingehenden Datenwerts 114 berechneten Blockidentifikator enthält.
-
Wenn der entsprechende Blattblock im Speicher 104 gespeichert ist (dieser Blattblock wird als „speicherinterner Blattblock“ bezeichnet), dann kann der Nachschlageprozess 400 einen entsprechenden Eintrag für den eingehenden Datenwert 114 aus dem speicherinternen Blattblock abrufen (bei 404), um eine Datenvervielfältigung durchzuführen. Der abgerufene Eintrag enthält eine Zuordnung zwischen dem partiellen Fingerabdruck des eingehenden Datenwerts 114 und einer entsprechenden SBN, die verwendet werden kann, um einen Lookup des Ortsindex 116 ( ) durchzuführen, um den entsprechenden vollständigen Fingerabdruck abzurufen, der für die Datendeduplizierung verwendet wird, wie weiter oben erläutert.
-
Wenn sich der entsprechende Blattblock nicht im Speicher 104 befindet, greift der Lookup-Prozess 400 auf den indirekten Block 142 im Speicher 104 zu (bei 406), um die Position des entsprechenden Blattblocks zu finden. Der aus dem partiellen Fingerabdruck des eingehenden Datenwerts 114 berechnete Blockbezeichner wird als Index in den indirekten Block 142 verwendet, um eine entsprechende Blockreferenz 144 abzurufen, wie oben beschrieben.
-
Die abgerufene Blockreferenz 144 wird verwendet, um den entsprechenden Blattblock zu finden, der im zwischengespeicherten Fingerabdruckindex 154 enthalten ist, der im permanenten Cache-Speicher 152 gespeichert ist. Der Lookup-Prozess 400 kopiert (bei 408) den entsprechenden Blattblock, der unter Verwendung der abgerufenen Blockreferenz 144 gefunden wurde, in den Speicher 104. Der Nachschlageprozess 400 ruft dann (bei 404) den entsprechenden Eintrag für den eingehenden Datenwert 114 aus dem speicherinternen Blattblock ab, um eine Datenduplikation durchzuführen
-
Der Zugriff auf den zwischengespeicherten Fingerprint-Index 154, der auf der Verwendung des indirekten Blocks 142 im Speicher 104 basiert, wie oben beschrieben, kann schneller durchgeführt werden, als dies beim Zugriff auf einen B-Tree-Cache-Index der Fall wäre, der eine binäre Suche des B-Tree-Cache-Index beinhalten würde, um den entsprechenden Blattblock zu finden.
-
In Beispielen, in denen es mehrere indirekte Blöcke gibt, können einige der indirekten Blöcke 162 ( ) im persistenten Cache-Speicher 152 und nicht im Speicher 104 gespeichert sein. Zum Beispiel kann der Speicher 104 verwendet werden, um eine gewisse Anzahl von indirekten Blöcken zu cachen (wobei die Anzahl 1 oder größer als 1 sein kann). Wenn der indirekte Block 142 im Speicher 104 voll wird (d. h., der indirekte Block 142 ist mit Blockreferenzen 144 gefüllt, so dass der indirekte Block 142 keine weiteren Blockreferenzen mehr aufnehmen kann), wird der indirekte Block 142 in den permanenten Cache-Speicher 152 geschrieben, und ein neuer indirekter Block wird erstellt und im Speicher 104 gespeichert.
-
In Fällen, in denen sich der entsprechende Blattblock nicht im Speicher 104 und der indirekte Block 142 ebenfalls nicht im Speicher 104 befindet, kann der Nachschlageprozess 400 auf indirekte Blockplatzinformationen 160 zugreifen, die z. B. im NVRAM 150 gespeichert sind.
-
Die indirekte Blockpositionsinformation 160 spezifiziert die Positionen der jeweiligen indirekten Blöcke 162, die im persistenten Cache-Speicher 152 gespeichert sind. Die indirekten Blockplatzinformationen 160 können Bereiche von Blockkennungen auf entsprechende indirekte Blöcke 162 abbilden. Der Blockbezeichner, der basierend auf dem partiellen Fingerabdruck für einen eingehenden Datenwert 114 erzeugt wurde, kann verwendet werden, um zu bestimmen, welcher der indirekten Blöcke 162 für den eingehenden Datenwert 114 relevant ist, und der relevante indirekte Block 162 kann aus dem persistenten Cache-Speicher 152 in den Speicher 104 abgerufen werden.
-
Wiederherstellung nach Absturz beim Zusammenführen
-
Während eines Zusammenführungsvorgangs, bei dem Fingerabdruckindex-Updates in den permanenten Fingerabdruckindex 110 zusammengeführt (und auch in den zwischengespeicherten Fingerabdruckindex 154 gespiegelt) werden, kann ein Absturz auftreten, der dazu führen kann, dass der Zusammenführungsvorgang nicht abgeschlossen wird. Ein Absturz kann während des Zusammenführungsvorgangs infolge eines Hardwarefehlers, eines Fehlers bei der Ausführung von maschinenlesbaren Anweisungen, eines Kommunikationsfehlers usw. auftreten.
-
Wie oben erwähnt, werden als Teil des Zusammenführungsvorgangs Aktualisierungen am indirekten Block 142 im Speicher 104 vorgenommen. Die Aktualisierungen des indirekten Blocks 142 werden möglicherweise nicht persistent im Datenspeichersystem 102 gespeichert. Infolgedessen kann der Inhalt des indirekten Blocks 142 im Speicher 104 bei einem Absturz verloren gehen. Wenn der indirekte Block 142 im Speicher 104 verloren geht, kann die Speichersteuerung 103 nicht feststellen, welche Blattblöcke des zwischengespeicherten Fingerabdruckindex als Ergebnis einer Merge-Operation aktualisiert wurden (aber noch nicht festgeschrieben sind)
-
Vor dem Absturz wurden Aktualisierungen des Fingerabdruckindexes, die in den persistenten Fingerabdruckindex 110 zusammengeführt und in den zwischengespeicherten Fingerabdruckindex 154 gespiegelt wurden, möglicherweise noch nicht übertragen. Um eine Wiederherstellung nach dem Absturz durchzuführen, können die im NVRAM 150 gespeicherten Informationen verwendet werden, um festzustellen, welche Abschnitte des zwischengespeicherten Fingerabdruck-Index 154 noch nicht übertragen wurden (sind).
-
Die im NVRAM 150 gespeicherten Informationen, die zur Wiederherstellung nach einem Absturz während eines Zusammenführungsvorgangs verwendet werden, umfassen Abschnittsinformationen 164. Die Abschnittsinformationen 164 enthalten Abschnittsbezeichner 166, die entsprechende Abschnitte des zwischengespeicherten Fingerabdruckindex 154 identifizieren. Ein „Abschnitt“ des zwischengespeicherten Fingerabdruckindex 154 kann größer sein als ein Blattblock - beispielsweise kann ein Abschnitt mehrere Blattblöcke umfassen. In einigen Beispielen kann ein Abschnitt die Größe eines Protokollsegments haben, wie in gezeigt (oder kann größer als ein Protokollsegment sein). In einigen Beispielen wird das Commitment von Fingerprint-Index-Updates auf der Granularität eines Abschnitts durchgeführt (d. h., der gesamte Abschnitt wird committed oder gar nicht).
-
Die Abschnittsinformationen 164 enthalten auch Statusindikatoren 168, die mit den jeweiligen Abschnittskennungen 166 verbunden sind. Der Statusindikator 168, der mit einer entsprechenden Abschnittskennung verbunden ist, zeigt an, ob der entsprechende Abschnitt des zwischengespeicherten Fingerabdruckindex 154 bestätigt wurde oder nicht. Wenn der Statusindikator 168 beispielsweise einen ersten Wert hat (z.B. „1“ oder einen anderen Wert), dann zeigt dies an, dass der entsprechende Abschnitt des zwischengespeicherten Fingerabdruckindex 154 bestätigt wurde. Wenn der Statusindikator 168 einen anderen zweiten Wert hat (z. B. „0“ oder einen anderen Wert), dann zeigt dies an, dass der entsprechende Abschnitt des zwischengespeicherten Fingerabdruckindex 154 nicht bestätigt wurde.
-
Die Größe der Abschnittsinformationen 164, die die Abschnittskennungen und die entsprechenden Statusanzeigen enthalten, ist im Vergleich zu den Abschnitten des zwischengespeicherten Fingerabdruckindex 154 relativ klein. Daher verbraucht die Speicherung der Abschnittsinformationen 164 im NVRAM 150 nicht viel Speicherplatz des NVRAM 150.
-
ist ein Flussdiagramm eines Wiederherstellungsprozesses 500, der von der Wiederherstellungs-Engine 170 der Speichersteuerung 103 durchgeführt werden kann. Der Wiederherstellungsprozess 500 wird von der Wiederherstellungs-Engine 170 in Reaktion auf einen Absturz eingeleitet. Der Absturz kann durch einen im NVRAM 150 gespeicherten Absturzindikator angezeigt werden, oder der Absturzindikator kann von einer anderen Instanz des Datenspeichersystems 102 bereitgestellt werden, wie z. B. einem Betriebssystem (OS), einem grundlegenden Eingabe-/Ausgabesystem (BIOS) und so weiter.
-
Der Wiederherstellungsprozess 500 greift (bei 502) auf die Abschnittsinformationen 164 zu, um den/die Abschnitt(e) des zwischengespeicherten Fingerabdruckindex 154 zu identifizieren, der/die noch nicht bestätigt wurde(n). Der/die entsprechende(n) Abschnitt(e) des persistenten Fingerabdruckindex 110 wäre(n) ebenfalls nicht bestätigt worden, da, wie weiter oben beschrieben, die Bestätigung von Fingerabdruckindex-Updates die Bestätigung sowohl von Updates des persistenten Fingerabdruckindex 110 als auch der gespiegelten Updates des gecachten Fingerabdruckindex 154 beinhaltet.
-
Für den (die) identifizierten Abschnitt(e) des zwischengespeicherten Fingerabdruckindex 154, der (die) noch nicht übertragen wurde(n), überträgt der Wiederherstellungsprozess 500 den (die) identifizierten Abschnitt(e) in den persistenten Fingerabdruckindex 110 und den zwischengespeicherten Fingerabdruckindex 154 (bei 504). Das Festschreiben des/der identifizierten Abschnitts/Abschnitte in den persistenten Fingerabdruck-Index 110 und den gecachten Fingerabdruck-Index 154 bezieht sich auf das Schreiben der Fingerabdruck-Indexeinträge des/der identifizierten Abschnitts/Abschnitte in den persistenten Fingerabdruck-Index 110 und den gecachten Fingerabdruck-Index 154 und das Markieren dieser geschriebenen Fingerabdruck-Indexeinträge als persistent gespeichert.
-
Ein Absturz kann zum Verlust von Fingerabdruckindex-Updates im aktiven Aktualisierungspuffer 106 und im Synchronisierungspuffer 108 führen. In einigen Beispielen werden Fingerabdruck-Indexaktualisierungen im aktiven Aktualisierungspuffer 106 und im Synchronisierungspuffer 108 nicht wiederhergestellt. Da die Fingerprint-Index-Updates im aktiven Aktualisierungspuffer 106 und im Synchronisierungspuffer 108 für die Zwecke der Datendeduplizierung verwendet werden, kann das Nicht-Wiederherstellen der Fingerprint-Index-Updates im aktiven Aktualisierungspuffer 106 und im Synchronisierungspuffer 18 dazu führen, dass die Datendeduplizierung nicht alle doppelten Instanzen von Datenwerten identifiziert, so dass einige doppelte Datenwerte im permanenten Speicher 112 gespeichert werden können. Eine weniger als ideale Datendeduplizierung kann jedoch in einigen Szenarien akzeptabel sein und hat möglicherweise keine merklichen Auswirkungen auf die Gesamtleistung des Datenspeichersystems 102.
-
Müllabfuhr
-
Garbage Collection kann durchgeführt werden, um ältere Abschnitte des zwischengespeicherten Fingerabdruck-Index 154 aus dem permanenten Cache-Speicher 152 zu entfernen, um Platz für zusätzliche Fingerabdruck-Index-Updates zu schaffen, die dem zwischengespeicherten Fingerabdruck-Index 154 hinzugefügt werden.
-
Die Garbage-Collector-Engine 180 der Speichersteuerung 103 kann eine Garbage Collection durchführen. Die Garbage-Collector-Engine 180 kann die Häufigkeit der Verwendung der jeweiligen Blattblöcke des zwischengespeicherten Fingerabdruckindex 154 verfolgen. Die Häufigkeit der Verwendung jedes Blattblocks des zwischengespeicherten Fingerabdruckindex 154 kann in Blockverwendungsinformationen 172 angegeben werden, die beispielsweise im Speicher 104 gespeichert werden können.
-
Die Blockverwendungsinformationen 172 umfassen Blattblockkennungen 174 und entsprechende Verwendungsindikatoren 176. Ein Verwendungsindikator 176 kann auf unterschiedliche Werte gesetzt werden, um jeweils unterschiedliche Verwendungshäufigkeiten des entsprechenden Blattblocks des zwischengespeicherten Fingerabdruckindex 154 anzuzeigen. Zum Beispiel kann ein erster Wert des Verwendungsindikators anzeigen, dass der entsprechende Blattblock eine erste Verwendungshäufigkeit hat, ein zweiter Wert des Verwendungsindikators kann anzeigen, dass der entsprechende Blattblock eine zweite Verwendungshäufigkeit hat, die größer ist als die erste Verwendungshäufigkeit, ein dritter Wert des Verwendungsindikators kann anzeigen, dass der entsprechende Blattblock eine dritte Verwendungshäufigkeit hat, die größer ist als die zweite Verwendungshäufigkeit, und so weiter.
-
Wenn auf Blattblöcke des zwischengespeicherten Fingerprint-Index 154 zugegriffen wird, kann der Speicher-Controller die jeweiligen Verwendungskennzeichen 176 in den Blockverwendungsinformationen 172 aktualisieren.
-
ist ein Flussdiagramm eines Garbage-Collection-Prozesses 600 gemäß einiger Beispiele. Der Garbage-Collection-Prozess 600 kann z. B. von der Garbage-Collector-Engine 180 durchgeführt werden.
-
Der Garbage-Collection-Prozess 600 kann als Reaktion darauf ausgelöst werden, dass der gecachte Fingerabdruck-Index 154 auf eine Größe angewachsen ist, die einen bestimmten Schwellenwert überschreitet, z. B. einen Schwellenprozentsatz des persistenten Cache-Speichers 152. Als Reaktion auf das auslösende Ereignis kann der Garbage-Collection-Prozess 600 entscheiden, welche(r) Blattblock(e) des gecachten Fingerabdruckindex 154 aus dem persistenten Cache-Speicher 152 zu entfernen ist/sind.
-
Der Garbage-Collection-Prozess 600 greift (bei 602) auf die Blocknutzungsinformationen 172 zu, um zu entscheiden, welche Blattblöcke weniger häufig verwendet werden als andere Blattblöcke. Basierend auf den Blocknutzungsinformationen 172 identifiziert der Garbage-Collection-Prozess 600 (bei 604) den/die Blattblock(s), der/die weniger häufig verwendet wird/werden, um ihn/sie zu entfernen. Diese Identifizierung basiert auf dem Vergleich der Werte der Verwendungsindikatoren der jeweiligen Blattblöcke des gecachten Fingerprint-Index 154. Die Anzahl der identifizierten Blattblöcke kann davon abhängig sein, wie viel Platz im persistenten Cache-Speicher 152 freigemacht werden soll.
-
Der identifizierte Blattblock bzw. die identifizierten Blattblöcke können Teil eines bestimmten Abschnitts des zwischengespeicherten Fingerabdruckindex 154 sein. Der Garbage-Collection-Prozess 600 kann (bei 606) den/die verbleibenden Blattblock(s) des gegebenen Abschnitts in einen neuen Abschnitt des zwischengespeicherten Fingerabdruckindex 154 verschieben. Der/die verbleibende(n) Blattblock(s) des gegebenen Abschnitts bezieht sich auf den/die Blattblock(s), der/die nicht der/die identifizierte(n) Blattblock(s) ist/sind, der/die weniger häufig verwendet wird/werden.
-
Der Garbage-Collection-Prozess 600 markiert (bei 608) den gegebenen Abschnitt zum Entfernen, so dass der gegebene Abschnitt bei der nächsten Gelegenheit (z. B. während einer Leerlaufzeit des Datenspeichersystems 102) aus dem persistenten Cache-Speicher 152 entfernt werden kann.
-
Weitere Beispiele
-
ist ein Blockdiagramm eines nicht-transitorischen maschinenlesbaren oder computerlesbaren Speichermediums 700, das maschinenlesbare Befehle speichert, die bei Ausführung ein System (z. B. das Datenspeichersystem 102 oder ein anderes Computersystem mit einem Computer oder mehreren Computern) veranlassen, verschiedene Aufgaben durchzuführen.
-
Die maschinenlesbaren Anweisungen enthalten Anweisungen zur Datendeduplizierung 702, um eine Datendeduplizierung unter Verwendung eines Deduplizierungs-Fingerprint-Index in einer Hash-Datenstruktur durchzuführen, die eine Vielzahl von Blöcken enthält, wobei ein Block der Vielzahl von Blöcken Fingerprints enthält, die auf der Grundlage des Inhalts der jeweiligen Datenwerte berechnet wurden. Wie hier verwendet, kann sich eine „Hash-Datenstruktur“ auf eine Datenstruktur beziehen, die Schlüssel (z.B. die partiellen Fingerabdrücke) in einer sortierten Reihenfolge speichert (z.B. aufsteigende Reihenfolge, absteigende Reihenfolge, etc.). Ein Beispiel für eine Hash-Datenstruktur ist eine logbasierte Hash-Tabelle.
-
Die maschinenlesbaren Befehle enthalten Merge-Befehle 704, um in einer Merge-Operation Aktualisierungen für den Deduplizierungs-Fingerprint-Index mit der in einem Permanentspeicher gespeicherten Hash-Datenstruktur zusammenzuführen.
-
Die maschinenlesbaren Befehle umfassen Spiegelungs- und indirekte Blockaktualisierungsbefehle 706, um als Teil der Zusammenführungsoperation die Aktualisierungen in eine zwischengespeicherte Kopie der Hash-Datenstruktur in einem Cache-Speicher zu spiegeln und in einem indirekten Block Informationen bezüglich der Positionen von Blöcken in der zwischengespeicherten Kopie der Hash-Datenstruktur zu aktualisieren.
-
In einigen Beispielen ist der Cache-Speicher ein persistenter Cache-Speicher (z. B. 152 in ).
-
In einigen Beispielen wird der indirekte Block in einem flüchtigen Speicher gespeichert (z. B. 104 in ).
-
In einigen Beispielen sollen die maschinenlesbaren Befehle ferner als Teil der Datendeduplizierung aus der zwischengespeicherten Kopie der Hash-Datenstruktur einen Block aus der Vielzahl von Blöcken unter Verwendung der Ortsinformationen in dem indirekten Block abrufen, einen Fingerabdruck für einen ankommenden Datenwert unter Verwendung des abgerufenen Blocks erhalten und den erhaltenen Fingerabdruck verwenden, um eine Datendeduplizierung des ankommenden Datenwerts durchzuführen.
-
In einigen Beispielen sollen die maschinenlesbaren Befehle eine Datendeduplizierung für einen eingehenden Datenwert durchführen, indem festgestellt wird, ob ein indirekter Block in einem flüchtigen Speicher gespeichert ist, und in Reaktion auf die Feststellung, dass der indirekte Block nicht in dem flüchtigen Speicher gespeichert ist, den indirekten Block aus dem Cache-Speicher in den flüchtigen Speicher kopieren.
-
In einigen Beispielen sollen die maschinenlesbaren Befehle als Reaktion auf einen Absturz während des Zusammenführungsvorgangs bestimmen, welcher Abschnitt der zwischengespeicherten Kopie der Hash-Datenstruktur nicht übertragen wurde, und eine Wiederherstellung des Abschnitts durchführen.
-
In einigen Beispielen sind die maschinenlesbaren Anweisungen dazu da, eine erste Teilmenge von Blöcken einer Vielzahl von Blöcken in der zwischengespeicherten Kopie der Hash-Datenstruktur zu identifizieren, die weniger als eine zweite Teilmenge von Blöcken der Vielzahl von Blöcken in der zwischengespeicherten Kopie der Hash-Datenstruktur verwendet wird, und eine Garbage Collection für die erste Teilmenge von Blöcken durchzuführen.
-
ist ein Blockdiagramm eines Datenspeichersystems 800 gemäß einiger Beispiele. Das Datenspeichersystem 800 umfasst einen persistenten Speicher 802 zum Speichern eines persistenten Fingerabdruckindex 804 mit einer Hash-Datenstruktur und einen persistenten Cache-Speicher 806 zum Speichern eines gecachten Fingerabdruckindex 808 mit einer Hash-Datenstruktur.
-
Das Datenspeichersystem 800 enthält einen Speicher-Controller 810 zur Durchführung verschiedener Aufgaben. Zu den Aufgaben gehört eine Fingerabdruckberechnungsaufgabe 812 zur Berechnung von Fingerabdrücken basierend auf eingehenden Datenwerten zur Speicherung im Datenspeichersystem 800.
-
Die Aufgaben umfassen außerdem eine Fingerabdruckindexaktualisierungs-Erzeugungsaufgabe 814, um Fingerabdruckindexaktualisierungen auf der Grundlage der berechneten Fingerabdrücke zu erzeugen. Die Aufgaben umfassen außerdem eine Zusammenführungsaufgabe 816, um eine Zusammenführungsoperation durchzuführen, um die Fingerabdruckindexaktualisierungen mit dem dauerhaften Fingerabdruckindex zusammenzuführen.
-
Die Aufgaben umfassen ferner eine Fingerabdruckindexaktualisierungs-Spiegelungsaufgabe und eine indirekte Blockaktualisierungsaufgabe 818, um als Teil der Zusammenführungsoperation die Fingerabdruckindexaktualisierungen in den zwischengespeicherten Fingerabdruckindex zu spiegeln und einem indirekten Block Positionsinformationen von Blattblöcken des zwischengespeicherten Fingerabdruckindex hinzuzufügen, zu denen die Fingerabdruckindexaktualisierungen hinzugefügt wurden, wobei die Positionsinformationen Positionen der Blattblöcke in dem dauerhaften Cache-Speicher spezifizieren.
-
ist ein Flussdiagramm eines Prozesses 900 gemäß einiger Beispiele, der von einem Speicher-Controller (z. B. 103 in ) durchgeführt werden kann.
-
Der Prozess 900 umfasst die Berechnung (bei 902) von Fingerabdrücken auf der Grundlage eingehender Datenwerte zur Speicherung in einem Datenspeichersystem.
-
Der Prozess 900 umfasst das Durchführen (bei 904) einer Datendeduplizierung für die eingehenden Datenwerte und das Erzeugen (bei 906) von Fingerprint-Index-Updates für eine Teilmenge der eingehenden Datenwerte, wobei die Teilmenge Datenwerte enthält, die keine Duplikate von Datenwerten sind, die bereits in einem dauerhaften Speicher gespeichert sind, und die Fingerprint-Index-Updates auf der Grundlage der Fingerprints der eingehenden Datenwerte in der Teilmenge berechnet werden.
-
Der Prozess 900 beinhaltet die Durchführung (bei 908) einer Merge-Operation, um die Fingerabdruck-Index-Updates mit einem persistenten Fingerabdruck-Index zusammenzuführen, der in dem persistenten Speicher gespeichert ist, wobei der persistente Speicher eine Hash-Datenstruktur aufweist.
-
Der Prozess 900 umfasst als Teil der Zusammenführungsoperation das Spiegeln (bei 910) der Fingerabdruckindex-Aktualisierungen in einen zwischengespeicherten Fingerabdruckindex, der in einem Cache-Speicher gespeichert ist, und das Hinzufügen (bei 912) von Positionsinformationen von Blattblöcken des zwischengespeicherten Fingerabdruckindex, zu denen die Fingerabdruckindex-Aktualisierungen hinzugefügt wurden, zu einem indirekten Block, wobei die Positionsinformationen Positionen der Blattblöcke in dem Cache-Speicher spezifizieren und der zwischengespeicherte Fingerabdruckindex eine Hash-Datenstruktur aufweist.
-
Ein Speichermedium (z. B., 700 in ) kann eine beliebige oder eine Kombination der folgenden Elemente enthalten: eine Halbleiterspeichervorrichtung, wie z. B. ein dynamischer oder statischer Direktzugriffsspeicher (DRAM oder SRAM), ein löschbarer und programmierbarer Festwertspeicher (EPROM), ein elektrisch löschbarer und programmierbarer Festwertspeicher (EEPROM) und ein Flash-Speicher oder eine andere Art von nichtflüchtiger Speichervorrichtung; eine Magnetplatte, wie z. B. eine Festplatte, eine Diskette und eine Wechselplatte; ein anderes magnetisches Medium, einschließlich eines Bandes; ein optisches Medium, wie z. B. eine Compact Disk (CD) oder eine digitale Videodisk (DVD); oder eine andere Art von Speichervorrichtung. Beachten Sie, dass die oben besprochenen Anweisungen auf einem einzigen computer- oder maschinenlesbaren Speichermedium bereitgestellt werden können, oder alternativ auf mehreren computer- 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, in 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 ermöglichen. 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.