# Project Voldemort

Voldemort ist ein verteiltes Datenbankmanagementsystem, welches als persistente und fehlertolerante Schlüssel-Werte-Datenbank (Key Value Store) ausgerichtet ist und von LinkedIn als Hoch-Skalierbarkeits-Speicher eingesetzt wird. Der Name wurde dem schurkischen Lord Voldemort aus der Romanreihe Harry Potter entlehnt. Voldemorts Entwicklung ist noch nicht abgeschlossen. Der Erfinder von Voldemort und Hauptbeitragszahler des Unternehmens, LinkedIn, hat etwa im August 2018 alle seine Systeme von Voldemort migriert, und im Oktober 2018 gab es noch keinen Ersatzsponsor.

## Vorteile

Voldemort bietet eine Anzahl von Vorteilen gegenüber anderen Datenbanken:
* Sie kombiniert einen In-Memory-Cache mit dem Speichersystem, so dass ein separater Cache überflüssig ist. Das Speichersystem selbst ist entsprechend schnell.
* Es ist möglich, die Speicherschicht zu emulieren. Das wiederum gestaltet die Entwicklung und das Testen von Komponenten sehr einfach, da gegen ein Wegwerf-In-Memory-System entwickelt und getestet werden kann. Es ist nicht notwendig einen echten Cluster oder echtes Speichersystem aufzusetzen.
* Lesen und Schreiben skaliert horizontal.
* Einfache Programmierschnittstelle: Die Programmierschnittstelle entscheidet über Daten-Replikation und Daten-Verteilung und bietet Platz für eine Vielzahl von anwendungsspezifischen Strategien.
* Eine transparente Daten-Partitionierung gestattet die Cluster-Erweiterung ohne die Neuverteilung der gesamten Daten.

## Nachteile

Voldemort bietet eine Anzahl von Nachteilen gegenüber anderen Datenbanken:
* Beziehungen zwischen den Daten sind nicht abbildbar
* Es existiert keine Abfragesprache, daher müssen Keys bekannt sein, um einen Value zu ermitteln
* Es gibt keine Transaktionen und damit auch keine ACID-Eigenschaften
* Das Projekt befindet sich noch in einer frühen Entwicklungsphase, der Einsatz in produktiven Systemen sollte daher gut abgewägt werden

## Eigenschaften

Die verteilte Datenbank Voldemort besitzt folgende Eigenschaften:
* Daten-Verteilung: Es gibt eine Unterstützung plugbarer Daten-Verteilung-Strategien, um beispielsweise eine Aufteilung über weit entfernte Rechenzentren zu ermöglichen.
* Daten-Replikation: Die Daten werden automatisch auf eine Vielzahl von Servern repliziert.
* Daten-Partitionierung: Die Daten werden automatisch partitioniert, so dass der Server nur jeweils eine Teilmenge der gesamten Daten beinhaltet.
* Gute Einfach-Knotenpunkt-Performanz: 10k-20k-Vorgänge pro Sekunde können ausgeführt werden, je nach Rechner, Netzwerk, Disk-System und Daten-Replikations-Faktor.
* Eigenständige Knotenpunkte: Jeder Knotenpunkt ist unabhängig von anderen Knotenpunkten, ohne dass eine zentrale Koordination notwendig ist. Es gibt keinen Single Point of Failure.
* Plugbare Serialisierung: Sie ermöglicht sowohl strukturierte Schlüssel und Werte einschließlich Listen und Tupel mit Namensfeldern als auch die Integration in allgemeine Serialisierungs-Frameworks. Beispiele für diese Frameworks sind Avro, Java-Serialisierung, Protokoll-Buffer und Thrift.
* Transparente Fehlfunktionen: Server-Fehlfunktionen werden transparent gehandhabt, so dass Benutzer derlei Probleme nicht bemerken.
* Versionierung: Die Daten sind versioniert, um die Datenintegrität im Falle einer Fehlfunktion zu maximieren, ohne die Verfügbarkeit des Systems einzuschränken.