13. Apr 2020
Lesedauer 9 Min.
Werte, Schlüssel und mehr im Griff
Die Multi-Model-Datenbank FoundationDB
Verwalten Sie doch einfach alles, was so daherkommt, mit einer einzigen Datenbank: FoundationDB ist genau dafür gemacht.

Wenn es um Datenbanken geht, stehen immer noch die relationalen Datenbanken im Vordergrund. Dabei werden Daten über Tabellen strukturiert, die ihrerseits über Relationen und Tabellenattribute beziehungsweise Kennungen miteinander verknüpft sind und in der Regel unter Verwendung von SQL (Structured Query Language) ausgewertet und manipuliert werden.Doch relationalen Datenbanken werden diverse Nachteile nachgesagt, wie die Segmentierung, die Verwendung von künstlichen Schlüsselattributen, der Bedarf an erweiterten und externen Programmierschnittstellen sowie das Problem, dass Objektverhalten und Objekteigenschaften nur extern mit Zusatzsoftwarte realisierbar und abbildbar sind.Außerdem kann es zu Leistungseinschränkungen bei datenintensiven Operationen, zum Beispiel der Indizierung, kommen. Zu den bekanntesten Vertretern der relationalen Datenbankmanagementsysteme gehören Microsoft SQL Server, IBM DB2, Oracle Database, MySQL, SQLite, Firebird, Ingres, MariaDB oder auch Microsoft Access.
NoSQL-Datenbanken
Um die Nachteile relationaler Datenbanken aufzuheben und dem aktuellen Bedarf neuer Datenverwaltungsmechanismen im Web Rechnung zu tragen, wurden mit NoSQL-Datenbanken Datenspeicher entwickelt, die keine oder nur einfache Schemata verwenden, geringe Konsistenzanforderungen haben, horizontal skalierbar sind, weitestgehend ohne Tabellenverknüpfungen auskommen, große Datenmengen verarbeiten und häufig (aber nicht immer) auf die ACID-Eigenschaften im Rahmen von Transaktionen verzichten (vergleiche Kasten Transaktionen nach dem ACID-Prinzip).Transaktionen nach dem ACID-Prinzip
Als Transaktion wird in der Informatik die Folge von Operationen verstanden, die eine logische Einheit bilden. Transaktionen werden grundsätzlich nach dem ACID-Prinzip durchgeführt: Atomic, Consistent, Isolated und Durable <span class="kasten-text-bildnachweis">(Bild 3)</span>.
Viele der NoSQL-Datenbanken werden als Open-Source-Datenbanken veröffentlicht und erlauben über den Quelltext tiefe Einblicke in die Umsetzungen. Generell wird zwischen verschiedenen Ausprägungen unterschieden:Dokumentenorientierte Datenbanken widmen sich der Verwaltung von Dokumenten und BLOBs (Binary Large Objects), wobei die Dokumentenverwaltung und der Dokumentenzugriff über Indentifikatoren erfolgen. Graphdatenbanken sind Datenbanken, die Daten in Form von Graphen verwalten, hinter denen sich vernetzte Informationen verbergen und die in der Regel über die Graph-Modelle Labeled-Property Graph (LPG) und Resource Description Framework (RDF) abgebildet werden. Verteilte ACID-Datenbanken nutzen, wie der Name bereits zeigt, weiterhin das ACID-Prinzip.Bei Key-Value-Datenbanken werden alle Werte durch Schlüssel eindeutig identifiziert und angesprochen. Multi-Value-Datenbanken sind mehrdimensionale Datenbanken, bei denen Wertelisten mit Attributen verknüpft werden.Objektdatenbanken verwalten hingegen Objekte nach dem Objektdatenbankmodell, spaltenorientierte Datenbanken sichern Inhalte nicht zeilen-, sondern spaltenweise, und Data-Stream-Verwaltungssysteme verwalten kontinuierliche Datenströme.Nicht-relationale NoSQL-Datenbanken eignen sich dementsprechend für Spezialaufgaben sowie im Verbund mit dem Web und sind in der Regel auf schnelle Performance und auf geringen Administrationsaufwand ausgelegt.Zu den bekanntesten NoSQL-Datenbanken zählen derzeit Apache Cassandra, Amazon DynamoDB, Redis, MongoDB und CouchDB. Eine umfassende Zusammenstellung der wichtigsten relationalen und NoSQL-Datenbanksysteme finden Sie in [1].
FoundationDB
Und dann tritt FoundationDB auf, die in keine der Gattungen passt. FoundationDB ist eine Multi-Model-Datenbank (Bild 1). Damit unterstützt sie mehrere Datenmodelle und fasst deren Daten in einer einzelnen Datenbank zusammen.
Eine Multi-Model-Datenbankunterstützt mehrere Datenmodelle, wobei die zusätzlichen Datenmodelle in FoundationDB über gesonderte Layer angebunden werden(Bild 1)
Autor
Die Entwicklung der NoSQL-Datenbank FoundationDB begann bereits im Jahr 2009 in einem kleinen Start-up-Unternehmen mit dem Namen FoundationDB LLC mit den Entwicklern und Gründern Nick Lavezzo, Dave Rosenthal und Dave Sherer. Ziel war die Entwicklung einer verteilten, horizontal skalierbaren und hochperformanten Datenbank zur Ausführung auf Clustern gewöhnlicher Hardware und zur Verwaltung von Schlüssel-Wert-Paaren und Mehrfachschlüsseln bei gleicher Unterstützung von mehrfachen Datenmodellen (Multi Model Database).FoundationDB speichert alle Daten auf mehreren Maschinen (Replikation). Als Programmiersprachen kamen C und C++ zum Einsatz. Dabei wurde großer Wert auf hohe Fehlertoleranz, eine einfache Hardware-Erweiterbarkeit, eine selbstständige Umgehung von Systemausfällen und eine Bereitstellung einer einfachen Programmierschnittstelle (API) gelegt. Ferner sollte zunächst der Key-Value-Speicher mit einer Unterstützung von ACID-Transaktionen im Vordergrund stehen. Weitere funktionale Layer sollten folgen.
Installation von Datenbankserver und Clients
Unter Windows lässt sich FoundationDB nur in der 64-Bit-Variante einrichten. Nach dem Download unter [3] und dem Start der Installation durch Doppelklick auf <em>foundationdb-6.2.10-x64.msi</em> legen Sie die zu installierenden Komponenten fest <span class="kasten-text-bildnachweis">(Bild 4)</span>. Dies sind neben dem FoundationDB Server die FoundationDB-Clients sowie die Python-Sprachbindungen.
Die erste stabile Version wurde Anfang des Jahres 2011 fertiggestellt. Die kommerzielle Markteinführung erfolgte dann am 20. August 2013. Bereits im März 2015 übernahm Apple die Firma. Kurze Zeit später wurde der Verkauf des Datenbankprodukts eingestellt, und der Download der Software war ebenfalls nicht mehr möglich.Danach dauerte es drei Jahre, bis klar wurde, was mit dem Produkt FoundationDB geschehen wird. Am 19. April 2018 machte Apple FoundationDB als Open-Source-Datenbank unter der Apache-2.0-Lizenz verfügbar. Die Offenlegung als Open Source erfolgte mit hoher Erwartung an die Community, die sich vor allem der Entwicklung weiterer Layer und der Bereitstellung variabler Datenmodelle widmen sollte.Mittlerweile ist die Version 6.2.7 verfügbar, die im Oktober 2019 veröffentlicht wurde. Die Community-Anbindung wurde zudem durch zwei Community-Konferenzen forciert, wovon die letzte am 18. November 2019 stattfand.
Programmvarianten und Schnittstellen
Die Datenbank wird in unterschiedlichen Systemversionen angeboten. Die Variante für macOS erfordert eine Systemversion von 10.7 oder höher.Windows wird ausschließlich in 64-Bit-Versionen ab Windows XP unterstützt. Weitere Installationen stehen für die 64-Bit-Versionen von Ubuntu Linux 12.04 und höher sowie Red Hat Enterprise Linux (RHEL) und CentOS (6.x und 7.x) bereit. Ein weiteres Paket wird bereitgestellt, das auf den meisten anderen 64-Bit-Varianten von Linux laufen sollte.FoundationDB bietet Sprachanbindungen für Python in den Versionen 2.7 bis 3.6, Go in der Version 1.1 und höher, Ruby in den Versionen 1.9.3 und 2.0.0.0 und höher, Node.js, Java 8 und höher, PHP und C an.Die Sprachanbindungen werden je nach System bereits mit der Datenbank selbst eingerichtet. Links für den Download der sprachspezifischen Python-, Java- und Ruby-Dokumentationen finden Sie auf der Projektseite (Bild 2). Die C/C++-Quelltexte zur FoundationDB werden über GitHub zum Download bereitgestellt [2].
Über die Projektseiteerhalten Sie Zugriff auf die Dokumentation, Foren, die Datenbank und den Quellcode(Bild 2)
Autor
Konzept und Architektur
FoundationDB wurde mit dem Konzept entworfen, durch Layer funktional erweiterbar zu sein. Derzeit stehen bereits zwei gesonderte Layer zum Download bereit [3]: der Record Layer und der Document Layer. Damit können Daten unterschiedlicher Datenmodelle in einer einzigen Datenbank sicher verwaltet, verteilt und repliziert werden.Ausgehend von einer Key-Value-Datenbank können bei FoundationDB weitere Datenmodelle (Bild 1) frei ergänzt werden, wobei die Layer wie bereits erwähnt durch die Community selbst entwickelt werden sollen.Prinzipiell ist die Datenbank FoundationDB als Hauptkomponente zuerst einzurichten. Erst im Anschluss daran werden einzelne Layer nachinstalliert.Der Record Layer ist als eine Java-Bibliothek implementiert, die einen datensatzbasierten Speicher zur Verfügung stellt, der selbst wieder auf der FoundationDB aufsetzt.Er bietet darüber Datenfelder und Datentypen an und erlaubt eine Änderung des Datenbankschemas aufgrund geänderter Rahmenbedingungen. Außerdem unterstützt er sowohl Primär- als auch Sekundärindizes und eine deklarative Abfragesyntax.Der Record Layer ist statuslos, vereinfacht das Hochskalieren und erbt die ACID-Fähigkeiten und Leistungsmerkmale der FoundationDB. Jeder Datensatzspeicher ist eine Datensatzerweiterung, die über Metadaten beschrieben wird. Jede Erweiterung kann wiederum Datensätze unterschiedlicher Typen enthalten, und zwar so wie relationale Datenbanken. Solange sie zusammen gespeichert werden, müssen diese kompatible Primärschlüssel besitzen.Der Document Layer ist ein statusloser Microserver, der ein dokumentenorientiertes API bereitstellt, das sowohl das MongoDB-Wire-Protokoll als auch die Nutzung des MongoDB-API über Client-Anbindung unterstützt.Dabei werden alle persistenten Daten über den Schlüssel-Wert-Speicher der FoundationDB verwaltet. Der Document Layer implementiert dabei lediglich eine Untermenge des MongoDB-API und legt den Fokus auf CRUD-Operationen (Create, Read, Update, Delete) und Indizes.Der Document Layer arbeitet mit allen aktuellen und allen offiziellen MongoDB-Treibern der Version 3.2 und höher zusammen und erfordert den Key-Value-Speicher und die Einrichtung der Datenbank FoundationDB in der Version 5.1 oder höher.Alle Layer selbst werden jeweils unabhängig voneinander entwickelt, stehen aber über die Projektseite der FoundationDB zum Download bereit.Hilfe und Dokumentation
Für das Open-Source-Projekt FoundationDB gibt es eine eigene Projektseite im Web [4] (Bild 2). Darüber laden Sie nicht nur die Datenbank herunter, sondern erhalten zudem Zugriff auf Foren und eine ausführliche Dokumentation [5] sowie ein Blog mit Informationen zu aktuellen Releases, zu Konferenzen und zu Informationen über neu entwickelte Funktionserweiterungen in Form von Layern.In der Dokumentation werden Themen wie die lokale Entwicklung, das Konzept der Transaktionen, das CAP-Theorem, die Konsistenz oder auch die Skalierbarkeit behandelt.Ferner erhalten Sie eine technische Übersicht zur Architektur, der Leistung, zu Benchmark-Tests, zum Layer-Konzept, zu den Datenmodellen, zu Abfragesprachen sowie den Funktionsmerkmalen. Außerdem gibt es ausführliche Informationen zum Design von Clients und zu den Programmiersprachenanbindungen.Ergänzt werden die Informationen um ein Entwicklerhandbuch, einen ausführlichen Themenkreis zur Datenmodellierung, zum Testen von Clients und zu Designrichtlinien. Die Dokumentationsseite selbst besitzt eine integrierte Suchfunktion, über die Sie durch die Eingabe von Suchbegriffen frei nach beliebigen Inhalten suchen.C-API, Sprach-APIs und Clients
Im Rahmen der Datenbankinstallation wird mit dem C-API ein einfaches Low-Level-API-Interface zur FoundationDB eingerichtet [6]. Es bildet jeweils die Grundlage für High-Level-Programmierschnittstellen, die darauf aufbauend für andere Programmiersprachen entwickelt werden.Die APIs sind versionsspezifisch, und im Rahmen der Entwicklung geben Sie an, welche Mindestversion für eigene Weiterentwicklungen benötigt wird. Dazu muss zuerst immer die API-Funktion fdb_select_api_version aufgerufen werden.Über das API setzen Sie die Netzwerkeinstellungen und konfigurieren, starten und beenden die FoundationDB-Ereignisverarbeitung. Die meisten Funktionen des API arbeiten asynchron und kehren zum aufrufenden Programm zurück, ehe die Ergebnisse vorliegen. Die korrekte Behandlung der entsprechenden Aufrufe und die Verarbeitung der Rückgabewerte werden in der Dokumentation beschrieben.Es stehen weitere Funktionen zur Anlage und Anbindung einer Datenbank bereit. Nach der Anlage wird per Objekt auf die Datenbank zugegriffen, das nach der Nutzung wieder freizugeben ist.Es gibt Anweisungen zum Setzen von Optionen, zum objektorientierten Ausführen von ACID-Transaktionen und der Verwaltung von Transaktionsschlüsseln, zum Abfragen und Verwalten von Netzwerkadressen sowie zum Schreiben und Lesen von Schlüssel-Wert-Paaren. Ferner gibt es Funktionen zur Schlüsselverwaltung und zur Fehlerbehandlung.Das Low-Level-C-API nutzen Sie in der Regel nur für die Anbindung von Programmiersprachen, die nicht direkt unterstützt werden. Einfacher greifen Sie mit einem darauf aufsetzenden Hochsprachen-API auf FoundationDB zu. Diese sind beispielsweise umfassend für die Sprachen Python und Ruby dokumentiert.Für Java und Go sind gesonderte Spracherweiterungen zu installieren. Werden die Java-Binaries bereits im Verbund mit der Datenbank eingerichtet, sind andere Spracherweiterungen mitunter gesondert nachzuinstallieren. Weitere Hinweise dazu finden Sie auf der Downloadseite im Bereich API Language Bindings der FoundationDB [6]..NET
.NET wird standardmäßig von der FoundationDB nicht direkt unterstützt. Entsprechende Sprachanbindungen und Clients suchen Sie deshalb auf der Webseite der Datenbank vergebens. Im Webeinsatz sind daher Python, Ruby und Java die erste Wahl für die Entwicklung.Allerdings müssen Sie nicht ganz auf den Einsatz unter .NET verzichten. Entsprechende Clients zur Anbindung von .NET und C# finden Sie über FoundationDB.Net-Clients, die über GitHub beziehungsweise NuGet bereitgestellt werden (siehe [7], [8] und [9]).Obwohl alle Seiten den gleichen Client bereitstellen, finden Sie auf den jeweiligen Seiten unterschiedliche Hintergrundinformationen, Installationshinweise und Beispiele.Der erste Client [7] selbst unterstützt das .NET Framework 2.0 und höher sowie Visual Studio 2017 und höher und erfordert zudem die DLL fdb_c.dll, die das C-API bereitstellt und selbst Bestandteil der Datenbank ist. Der Client selbst unterliegt der BSD-Lizenz.Der zweite Client [8] ist eine Weiterentwicklung des ersten Clients und erfordert das .NET Framework 4.5 oder höher und ansonsten ebenfalls die zuvor genannte C-API-DLL. Nächtliche Neuübersetzungen werden ausschließlich über [7] angeboten.In FoundationDB-Datenbankprojekten ist ein Verweis zur FoundationDB.Client-Bibliothek erforderlich. Einen Quelltextauszug zu einem Projekt in C# zeigt Listing 1. Darin wird die Datenbank angebunden, ein Testverzeichnis angelegt, um dann diverse Schlüssel-Wert-Paare nacheinander zu schreiben und dann wieder zu lesen. Die Clients für .NET orientieren sich beim Einsatz des C-API an den Programmierschnittstellen, die bereits für Ruby und Python verfügbar sind.Listing 1: FoundationDB-Datenbankzugriffe unter C# und .NET
// Client-Library-Namespace <br/>using FoundationDB.Client; <br/><br/>// Abbruch-Token <br/>CancellationToken cancel = ....; <br/><br/>// Datenbankanbindung zur Standarddatenbank "DB" <br/>using (var db = await Fdb.OpenAsync()) <br/>{ <br/> // Testdaten im Testverzeichnis <br/> var location = await db.Directory<br/> .CreateOrOpenAsync("Test", cancel); <br/><br/> // Transaktion durchführen, <br/> // Schlüssel-Wert-Paare schreiben <br/> using (var trans = db.BeginTransaction(cancel)) <br/> { <br/> // Tupel-Schlüssel "Hello" für Werteverwaltung <br/> // "World" (String) <br/> trans.Set( <br/> location.Keys.Encode("Hello"), <br/> Slice.FromString("World") <br/> ); <br/><br/> // Tupel-Schlüssel "Count" auf den Wert 42 <br/> // (1 Byte) setzen <br/> trans.Set( <br/> location.Keys.Encode("Count"), <br/> Slice.FromInt32(42) <br/> ); <br/><br/> // Commit – Änderungen an DB übergeben <br/> // (Werteübernahmen) <br/> await trans.CommitAsync(); <br/> } <br/> // Daten lesen und an der Konsole ausgeben <br/> using (var trans = <br/> db.BeginReadOnlyTransaction(cancel)) <br/> { <br/> // Schlüssel "Hello", Ergebnis String <br/> Slice value = await trans.GetAsync(<br/> location.Keys.Encode("Hello")); <br/> Console.WriteLine(value.ToUnicode()); <br/><br/> // Schlüssel "Count", Ergebnis Integer <br/> value = await trans.GetAsync(<br/> location.Keys.Encode("Count")); <br/> Console.WriteLine(value.ToInt32()); <br/><br/> // Ergebnis für nicht existierende <br/> // Schlüssel: 'Slice.Nil' <br/> value = await trans.GetAsync(<br/> location.Keys.Encode("NotFound")); <br/> Console.WriteLine(value.HasValue); <br/> Console.WriteLine(value == Slice.Nil); // -&gt; true <br/><br/> // wird 'Slice.Empty' zurückgegeben, existiert <br/> // zwar der Schlüssel, aber kein zugeordneter Wert <br/> } <br/>}
Damit setzen Sie FoundationDB mit geringem Aufwand auch in eigenen .NET-Projekten ein. Dabei müssen Sie aber stets im Auge behalten, dass die Datenbank selbst immer als externer Server benötigt wird und auszuführen ist. Die Datenbank hat aufgrund des verwendeten Layer-Konzepts enormes Ausbaupotenzial. Man darf also gespannt darauf sein, ob derzeit noch nicht verfügbare und in Bild 1 mit Sternchen gekennzeichnete Layer in Kürze ebenfalls entwickelt und bereitgestellt werden.
Fussnoten
- Liste von Datenbankmanagementsystemen, http://www.dotnetpro.de/SL2005FoundationDB1
- Quelltexte zu FoundationDB, http://www.dotnetpro.de/SL2005FoundationDB2
- Download FoundationDB und Layers, http://www.dotnetpro.de/SL2005FoundationDB3
- FoundationDB-Projektseite, https://www.foundationdb.org
- FoundationDB Site Map, http://www.dotnetpro.de/SL2005FoundationDB4
- C-API der FoundationDB, http://www.dotnetpro.de/SL2005FoundationDB5
- Client für .NET, http://www.dotnetpro.de/SL2005FoundationDB6
- Client für .NET (Alternativ-Adresse), http://www.dotnetpro.de/SL2005FoundationDB7
- FoundationDB.Client, http://www.dotnetpro.de/SL2005FoundationDB8