Alternative Speichersysteme

NoSQL – Schöne neue Welt?

Matthias Wessendorf, Bartosch Warzecha

Seit 2009 erhalten alternative Speichersysteme verstärkt Einzug in Plattformen wie Twitter oder Facebook. Die alternativen Speichersysteme werden von der „NoSQL-Bewegung“ vorangetrieben. Die Community stellt dabei unterschiedliche Ansätze zur Verfügung, beispielsweise dokumentorientierte Ansätze vs. „Key/Value“ Storage.

Die Suche nach alternativen Speichersystemen ist nichts Neues: Mit der Verbreitung der Objektorientierung wurde bereits Ende der 80er Jahre nach neuen Speichermöglichkeiten gesucht. Daraus entstanden objektorientierte Datenbanksysteme (ODBMS) als Alternative zu traditionellen relationalen Datenbanken (RDBMS). Die meisten Anwendungen nutzen heutzutage RDBMS, da diese Systeme komfortable Vorteile wie Constraints, Transaktionen, Locking sowie Abfragemöglichkeiten wie SQL bieten.

Web-2.0-Zeitalter

Im Zeitalter von Web 2.0 sind schreibende Zugriffe mindestens genauso wichtig wie lesende. Anwendungen wie StudiVZ, Twitter oder Facebook leben davon, dass die Nutzer massenhaft Daten einstellen (z. B. ihren Facebook-Status). Allerdings scheinen RDBMS-Systeme Probleme mit der Verarbeitung und Skalierung großer Datenmengen zu haben.

Die alternativen Speichersysteme der NoSQL-Bewegung verzichten bewusst auf einige Vorteile moderner RDBMS, um eine bessere Performance zu erreichen. Am Beispiel von Twitter wird deutlich, dass die „Timeline“ zwar (fast) immer verfügbar ist, diese allerdings nicht unmittelbar konsistent ist. Die endgültige Konsistenz der Daten wird hingegen gewährleistet. Ein weiteres Beispiel sind Content-Management-Systeme (CMS), die zwar Persistenz für die Dokumentenverwaltung benötigen, dafür aber nicht zwangsläufig auf komplexe Abfragemöglichkeiten wie SQL zurückgreifen müssen. Da die Struktur häufig bekannt ist, kann hier auf flexible Abfragemöglichkeiten zugunsten hoher Performance verzichtet werden.

Not only SQL

Wie bereits angedeutet, entstehen unterschiedlichste Systeme innerhalb der NoSQL-Bewegung. Stellt sich letztendlich die Frage: Was bedeutet NoSQL? Oft wird vermutet, dass sich hinter dem Ausdruck ein „No to SQL at all“ verbirgt. Vielmehr ist NoSQL als „Not only SQL“ zu verstehen. Unterschiedliche Probleme erfordern unterschiedliche Lösungen. Daher ist es konsequent, dass eine breite Menge von unterschiedlichen „Not only SQL“-Systemen existiert. Das wiederrum unterstreicht den Innovationsgeist der Community. Ebenfalls ist festzustellen, dass traditionelle Datenbanksysteme (RDBMS) nicht nur heute, sondern auch in Zukunft eine hohe Bedeutung haben werden.

Choice is good

Auf dem Markt existieren diverse NoSQL-Speichersysteme. Der Wikipedia-Eintrag zur NoSQL-Bewegung listet bereits mehr als 20 dieser Systeme auf. Ihr (theoretischer) Hintergrund ist ebenfalls unterschiedlich. Einige Systeme sind in Anlehnung an Googles Bigtable implementiert, z. B. Apache HBase oder Hypertable. Andere Systeme wie Riak realisieren das Dynamo-Paper vonAmazon.com. Beide Ansätze werden durch hybride Systeme, die „das Beste“ aus beiden Welten vereinen, repräsentiert. Daneben existieren Systeme, die spezifischere Einflüsse haben, z. B.Apache Jackrabbit, das aus dem CMS-Bereich kommt. Ein weiteres Produkt ist Oracles Berkeley DB.

Ein Hase als Dokumentenwächter

Das Apache-Jackrabbit-Projekt implementiert die JSRs 170 und 283. Bei diesen Standards handelt es sich um das Java Content Repository API (JCR) in den Versionen 1.0 und 2.0. Da die Dokumente nicht via SQL aus dem Repository geladen werden, sondern mittels JCR, versteht sich das Projekt als vollwertiges Mitglied der NoSQL-Bewegung. Die Installation von Jackrabbit ist einfach und wird ausführlich auf der Website des Projekts beschrieben. Das Arbeiten mit dem JCR erinnert stark an ein hierarchisches System:

...
Repository rep = ...
Session session = rep.login(...);
Node root = session.getRootNode();
root.addNode(“foo”).addNode(“bar”);
... 

Der obige Code legt einen bar-Zweig unterhalb von foo ab. Innerhalb eines Unix-Verzeichnisbaums wäre dies das Äquivalent zu /foo/bar. Einem Node können Eigenschaften (als Key/Value Pairs) hinzugefügt werden. Die Abfrage des oben genannten Nodes sieht wie folgt aus: Node fooBar = session.getNode(„foo/bar“);. Das Sessionobjekt navigiert zur gewünschten Stelle der Dokumentenhierarchie und lädt den entsprechenden Node.

[ header = Seite 2: CouchDB – Time to relax ]

CouchDB – Time to relax

Apache CouchDB ist eine dokumentenbasierte Datenbank, die in der Programmiersprache Erlang geschrieben ist. Die Abfrage und das Indizieren der Dokumente geschehen mit MapReduce via JavaScript. Der geistige Vater Damien Katz, einst Entwickler bei Lotus Notes, arbeitet derzeit für IBM an dem Apache-CouchDB-Projekt. Die Installation ist allerdings nicht einfach, verläuft aber auf dem Linux/Mac-OS-System in der Regel problemlos. Das Besondere an CouchDB ist, dass sämtliche Dokumente (schemafrei) in der JSON-Syntax gespeichert werden und der Zugriff auf die Datenbank via HTTP/REST APIs erfolgt:

curl -X POST http://woody:5984/articles -d
'{"article":"NoSQL im JavaMagazin", "authors":["Warzecha", "Wessendorf"]}'

Mit dem Unix-Kommandozeilentool curl wird hier ein Dokument in der Datenbank articles angelegt. Im Erfolgsfall bekommt man ein weiteres JSON-Dokument zurückgeliefert:

{"ok":true,"id":"3aa2d6b50934b1a7fa9064d8b9789447",
"rev":"1-8f4e988fffd0787228bbe9a33909633e"}

Die ID des neuen JSON-Dokuments lässt sich nun für die Abfrage der Daten über HTTP/REST nutzen: curl -X GET http://woody:5984/articles/3aa2d6b50934b1a7fa9064d8b9789447. Das Ergebnis sieht anschließend wie folgt aus:

{"_id":"3aa2d6b50934b1a7fa9064d8b9789447",
"_rev":"1-8f4e988fffd0787228bbe9a33909633e",
"article":"NoSQL im JavaMagazin","authors":["Warzecha","Wessendorf"]}

Alternativ können Dokumente/Datenbanken mit dem webbasierten Administrationswerkzeug Fluton (Abb. 1) verwaltet werden, dass durch seine Oberfläche überzeugt. Fluton bietet ebenfalls einen erstklassigen Support für die Erstellung von map/reduce-Funktionen. Der eingebaute Support für HTTP/REST bietet einem Java-Entwickler wiederum weitere Möglichkeiten, um mit CouchDB zu kommunizieren. Statt der direkten Nutzung der JDK-Klasse HttpURLConnection, stehen verschiedene APIs wie das hier benutzte jcouchdb-Projekt bereit:

Database db = new Database("woody", "articles");
Map doc = new HashMap();
doc.put("article", "NoSQL im JavaMagazin");
doc.put("authors", new String[] {"Bartosch Warzecha", "Matthias Wessendorf"});
db.createDocument(doc);

Mit einer einfachen Syntax ermöglicht jcouchdb den Zugriff auf die Daten. Innerhalb von fünf Zeilen wird hier ein ähnliches Dokument erstellt wie bereits zuvor mit curl. Ein schöner Aspekt derjcouchdb ist die im Projekt enthaltene Beispielandwendung Hood, die den Umgang mit dem API veranschaulicht. CouchDB selbst ist ein sehr fortgeschrittenes NoSQL-System, das aktuell in einer BETA-Version (0.10.x) angeboten wird. Mit der Mozilla Foundation und der Ubuntu-9.10-Version hat das Apache-CouchDB-Projekt zwei populäre „Kunden“. Für die CouchDB gibt es bereits verschiedene Publikationen, beispielsweise das „CouchDB: The Definitive Guide“ -Buch, das auch online zugänglich ist. Es existieren bereits Unternehmen, die im Umfeld des Apache-CouchDB-Projekts Hosting, Schulungen und kommerziellen Support anbieten.

Abb. 1: Administrationswerkzeug Fluton

[ header = Seite 3: Apache Cassandra + Fazit ]

Apache Cassandra

Das Cassandra-Projekt ist eine Art hybride, hoch skalierbare Open-Source-Datenbank. Das Projekt wurde von einem der Autoren des Dynamo-Papiers entworfen und 2008 von Facebook an die Apache Software Foundation übergeben. Sie basiert auf Googles BigTable-Datenmodel, wobei sich die Infrastruktur an dem Dynamo-Papier orientiert. Da die Daten in Spalten gespeichert werden, besitzt Cassandra etwas mehr Struktur als einfache Key/Value-Datenbanken.

Durch die Verwendung einer Java-API ist der Einsatz für Java-Entwickler intuitiv. Nach dem Start der Datenbank kann der Benutzer beliebige Daten über eine geöffnete Verbindung mit dem folgenden Aufruf speichern:

client.insert("Keyspace1",key_user_id,
new ColumnPath("column_family1", null, "artikel".getBytes("UTF-8")),
"NoSQL Artikel".getBytes("UTF-8"),timestamp, ConsistencyLevel.ONE);

Über den Client werden die Daten anhand einer frei definierbaren key_user_id, eines Zeitstempels sowie des ConsitencyLevels (von asynchron im Hintergrund bis „streng“ konsistent) in einer Column mit dem Namen artikel, die zu dem Keyspace Keyspace1 gehören, gespeichert.

Ein Keyspace stellt dabei eine Ansammlung von Tabellen dar, ähnlich eines Schemas oder einer Datenbank in RDBMS. Zu einem Keyspace gehören so genannte Column Families, die in etwa den Tabellen eines RDBMS entsprechen. Zu den Column Families wiederum gehören Columns, wie in unserem Beispiel die Column-Artikel, die den Spalten einer relationalen Datenbanktabelle entsprechen. Diese sind allerdings für jeden Datensatz einer Column Family frei definierbar. Eine sehr gute Einführung in das vollständige Datenmodel von Cassandra bietet. Mit dem folgenden Aufruf kann anschließend auf die gespeicherten Daten zugegriffen werden:

ColumnPath path = new ColumnPath("column_family1", null,
"artikel".getBytes("UTF-8"));
client.get("Keyspace1", key_user_id, path, ConsistencyLevel.ONE));

Nach dem Erstellen des columnPath kann durch die Angabe der key_user_id, des ConsistencyLevels und des Keyspace auf die Daten zugegriffen werden. Das Cassandra-Projekt befindet sich noch in einer relativ frühen Phase, sodass die Strukturen und die API durchaus noch größere Änderungen erfahren könnten.

Fazit und Ausblick

Die NoSQL-Bewegung ist kreativ – keine Frage. Dieser Artikel konnte lediglich auf einige Aspekte weniger Systeme eingehen. Allerdings kann man bereits daran wunderbar erkennen, wie im Augenblick zahlreiche NoSQL-Storage-Systeme entstehen. Ein bisschen erinnert dieser Trend an die Geschichte der (Java-)Webframeworks. Böse Zungen behaupten, dass jeder, der nicht 100%ig mit dem vorhandenem zufrieden ist, sich direkt sein eigenes System schreibt.

Fakt ist, dass die NoSQL-Bewegung am Anfang steht und eine Konsolidierung auch hier eintreten wird. Die zahlreichen Projekte sind teilweise sehr fortgeschritten, z. B. Jackrabbit oder CouchDB. Andere stecken jedoch noch in den Kinderschuhen, beispielsweise Apache Cassandra oder HBase (Unterprojekt von Apache Hadoop). Trotzdem werden diese Systeme bereits in produktiven Umgebungen wie Digg.com, Twitter oder Rackspace eingesetzt. Ebenfalls basiert der Datastore von Googles AppEngine auf einer Bigtable-Implementierung. Die Zukunft dieser neuen Bewegung bleibt spannend. Die Ideen der jungen Systeme sind innovativ und es macht Spaß, mit ihnen Anwendungen und Prototypen zu entwickeln.

Bartosch Warzecha ist Software Engineer bei dem IT-Dienstleistungs- und Beratungsunternehmen adesso AG. Er beschäftigt sich mit der Entwicklung von JEE-Anwendungen.
Matthias Weßendorf ist PMC Chair von Apache MyFaces. Beruflich beschäftigt er sich mit Themen rund um das „Next Generation Web“. Matthias blogt regelmäßig auf http://matthiaswessendorf.wordpress.com (Twitter: @mwessendorf).
Geschrieben von
Matthias Wessendorf, Bartosch Warzecha
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.