Schwerpunktthema Alles ist möglich                                                                 {                     ...
        SchwerpunktthemaDer Wert kennzeichnet die Reihenfolge der indizierten Elemente            Installation(1 für aufs...
Schwerpunktthema       System.out.println(myDoc);                                            final byte[]fileAsByte = rea...
        Schwerpunktthemafach und automatisch. Innerhalb weniger Minuten lässt sich       Literatur und Linksein neuer Ser...
Nächste SlideShare
Wird geladen in …5
×

Einfuehrung in mongo_db_iks

1.264 Aufrufe

Veröffentlicht am

Für spezifische Probleme werden spezialisierte Datenbanken benötigt.

MongoDB bietet für Webapplikationen, in denen eine große Anzahl von Daten, die nicht transaktionsbasiert vorgehalten werden müssen, eine hochperformante, skalierbare, schemafreie und dokumentenorientierte Lösung.

In seinem Artikel „Einführung in MongoDB - alles ist möglich" stellt unser Mitarbeiter Herr Markus Alvermann MongoDB vor und zeigt anhand von Beispielen auf, wie der Einsatz der Java-API funktioniert.

Der Artikel ist im Rahmen des Themenschwerpunkts „NoSQL-Datenbanken" in Ausgabe 1/2011 des JavaSPEKTRUMs erschienen

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.264
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
20
Aktionen
Geteilt
0
Downloads
6
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Einfuehrung in mongo_db_iks

  1. 1. Schwerpunktthema Alles ist möglich { nutzername:mustermann,Einführung inhalt:Wieder was gelernt., email:max@mustermann.dein MongoDB }, { nutzername:dbgott, inhalt:Alles Schrott!,Markus Alvermann email:dbgott@dodgit.com } ]Für spezifische Probleme werden spezialisierte Datenbanken benötigt. }MongoDB bietet für Webapplikationen, in denen eine große Anzahl vonDaten, die nicht transaktionsbasiert vorgehalten werden müssen, eine Listing 1: Dokumenthochperformante, skalierbare, schemafreie und dokumentenorientierteLösung. In diesem Artikel wird die MongoDB vorgestellt und anhand Am besten lässt sich die Dokumentenstruktur an einem kon-von Beispielcode aufgezeigt, wie der Einsatz der Java-API funktioniert. kreten Beispiel erklären. In Listing 1 sehen wir ein Dokument, welches Daten aus einem Blog-Eintrag widerspiegelt. In Mon- goDB bekommt jedes Dokument automatisch einen Primär-Einleitung schlüssel (Markierung 1). Der Primärschlüssel kann natürlich jederzeit den eigenen Bedürfnissen angepasst werden. An Mar- MongoDB wird von der Firma 10gen entwickelt. Im Jahr kierung 2 sehen wir anhand der Eigenschaft tags, dass DatenE 2007 begann 10gen mit der Arbeit an einer Softwareplatt- mithilfe von eckigen Klammern in ein Array geschrieben wer-form, die aus einem Server und einer Datenbank bestehen den. Die Kommentare bei Markierung 3 bestehen wiederumsollte. Als Einsatzgebiet war das Hosten und Skalieren von aus eigenen Dokumenten.Anwendungen in der Cloud vorgesehen. Schnell stellte sich je- In einer relationalen, SQL-basierten Datenbank lässt sich eindoch heraus, dass potenzielle Kunden zwar nicht bereit waren, Blog-Eintrag nicht so einfach abbilden. Hierzu benötigen wirdermaßen viel Kontrolle über ihre Produkte an die „Wolke“ ab- eine Tabelle für die Blog-Einträge, die per Fremdschlüsselbe-zugeben, allerdings an der Datenbank der Softwareplattform ziehung mit einer Tabelle für die Kommentare und einer Ta-selbst Gefallen fanden. Daraufhin stellte 10gen die Entwick- belle für die Tags verknüpft ist. Leseoperationen funktionierenlung an der Softwareplattform ein und konzentrierte sich auf aufwendig mit Join-Operationen.die Datenbank – MongoDB war geboren. Bei einem Dokument hingegen haben wir alle Informationen Mongo steht als Abkürzung für „Humongous“, also enorm, an einer Stelle, was Lese- und Schreiboperationen vereinfacht,und so gibt schon der Name einen Hinweis auf das Einsatzge- und vor allen Dingen bei Projektstart für leichteres Arbeitenbiet bzw. eine der wichtigsten Eigenschaften der Datenbank: sorgt, da Dokumente dynamisch um benötigte Informationendie performante Verarbeitung großer Datenmengen. Von Be- erweitert werden können. Außerdem muss nicht jedes Doku-ginn an für die Verwendung in Webapplikation und dem In- ment die gleichen Daten bereitstellen; es kann beispielsweiseternet vorgesehen, sind der Aufbau und die Datenstruktur von auch Blog-Einträge ohne Tags geben, die Eigenschaft tags ent-MongoDB genau für diesen Anwendungsfall optimiert wor- fällt dann für diesen Eintrag. Der zur Verfügung stehende Platzden (vgl. [Mong]). wird somit optimal genutzt, Platzhalter in Form von leeren Spalten bei relationalen Datenbanken existieren nicht. Dokumente werden in MongoDB in Collections zusammen-Dokumente gefasst. Analog zu relationalen Datenbanken stellen Dokumen- te das Pendant zu Spalten dar, während Collections das Ge-Daten werden in MongoDB in Dokumenten abgespeichert. Ein genstück zu Tabellen sind. Collections können Dokumente mitDokument besteht aus einem sortierten Satz von Eigenschaf- völlig unterschiedlichem Aufbau beinhalten.ten, die aus einem Namen und einem Wert bestehen. Wertekönnen einfache Datentypen, Felder oder andere Dokumentesein. Dokumente sind schemalos, d. h. sie haben keinen festen HochperformantAufbau, sondern werden dynamisch mit den Daten befüllt, diebenötigt werden. Eine hohe Performance war von Beginn an eines der Haupt- Das Format, in dem Dokumente abgespeichert werden, ist ziele beim Entwurf von MongoDB. Viele Designentscheidun-BSON, binäres JSON. BSON zeichnet sich durch Effizienz und gen sind gefällt worden, um die Performance der DatenbankPlatzersparnis aus und kann durch seine auf C basierende Reprä- zu verbessern. Die Kommunikation zwischen Server und Cli-sentation von Typen performant codiert und decodiert werden ent läuft über ein leichtgewichtiges TCP/IP-Protokoll, welches(vgl. [Cho10] und [Bson]). Unabhängig vom eingesetzten Treiber viel weniger Overhead verursacht als HTTP/REST. Daten wer-wird intern jedes Dokument auf ein BSON-Konstrukt abgebildet. den im Hauptspeicher verwaltet, wodurch das Speicherma- nagement vom Betriebssystem übernommen wird. Bei Abfra- { gen greift im Hintergrund ein Abfrage-Optimierer, der sich den _id:ObjectID(123ab76fe554dcc4356bde9e), //1 schnellsten Weg zum Ausführen einer Abfrage merkt. titel: MongoDB im Einsatz, Des Weiteren garantiert der bewusste Verzicht auf einige von author:mal, tags:[ //2 relationalen Datenbanken bekannte Features, wie „Join-Operati- datenbank, onen“ oder Transaktionskontrolle, eine hohe Geschwindigkeit. mongodb, Eine weitere Möglichkeit, die MongoDB zur Performancestei- praxis gerung bietet, ist die Verwendung von Indizes. Jede Property ei- ], kommentare:[ //3 5 nes Dokumentes kann mit dem Befehl ensureIndex({property:wert}) indiziert werden – selbst Propertys eingebetteter Dokumente. 16 JavaSPEKTRUM 1/2011
  2. 2.  SchwerpunktthemaDer Wert kennzeichnet die Reihenfolge der indizierten Elemente Installation(1 für aufsteigend, -1 für absteigend), zusammengesetzte Indizeswerden per Kommanotation erstellt. Die Installation von MongoDB erfolgt in vier einfachen Schrit- ten. Zuerst laden wir uns von [Mong] die aktuelle Version von MongoDB herunter und achten darauf, eine gerade Versions-Replikation und Ausfallsicherheit nummer auszuwählen, da es sich bei den ungeraden Versions- nummern um Entwicklungsreleases handelt. Die heruntergela-MongoDB bietet verschiedene Replikationsmodi für die Si- dene Datei entpacken wir an einen Ort unserer Wahl.cherung von Daten an, wobei der Master-Slave-Modus der ge- Als Nächstes legen wir im Root-Verzeichnis ein Unterver-bräuchlichste ist. Er kann flexibel zur Datensicherung, Ausfall- zeichnis /data/db/ an, in dem MongoDB nach dem Start automa-sicherung und Skalierung der Datenbank verwendet werden. tisch alle Datenbanken und Daten verwaltet. In einer KonsoleUm dieses Feature nutzen zu können, müssen lediglich min- wechseln wir in das bin-Verzeichnis der MongoDB-Installationdestens zwei Datenbankknoten gestartet werden, von denen und starten die Datenbank mit ./mongod (bzw. mongod.exe).ein Knoten im Master-Modus und die anderen Knoten im Sla-ve-Modus laufen. Einen Master starten wir mit dem Befehl mongod --master, den Die MongoDB-Shellzugehörigen Slave mit mongod --slave --sourcemaster_adresse. DieDaten des Masters werden automatisch auf den laufenden Sla- Ebenfalls im bin-Verzeichnis befindet sich unter ./mongo die Shellves repliziert. Die Anzahl der Slaves ist nicht begrenzt, wirkt von MongoDB. Sie ist ein vollständiger JavaScript-Interpre-sich jedoch bei einer größeren Anzahl auf die Performance des ter, was wir einfach mit der Eingabe einiger JavaScript-Befeh-Master-Knotens aus. In der Praxis haben sich Cluster mit bis zu le überprüfen können (bspw. alert(„Test“);). Mithilfe der Shellzwölf Slaves bewährt (vgl. [Cho10]). können der Datenbankinhalt inspiziert, Abfragen abgesetzt Die Ausfallsicherheit wird durch sogenannte Replica Sets ge- und administrative Aufgaben ausgeführt werden.währleistet: In einem Replica Set gibt es keinen Master, sondern In Tabelle 1 werden einige MongoDB-Befehle vorgestellt undeine Primärdatenbank, die als Master fungiert, und eine belie- ihrem SQL-Pendant gegenübergestellt. Als Java-Entwickler hatbige Anzahl von Sekundärdatenbanken, welche die Slaves dar- man die JavaScript-ähnliche Notation schnell verinnerlicht,stellen. Die Primärdatenbank wird vom Cluster ausgewählt. da sie mehr an Programmierung als an SQL angelehnt ist. MitFällt sie aus, wird bei allen verfügbaren Sekundärdatenbanken db.users.find({age:33}).sort({name:1}) werden beispielsweise allegeprüft, welche als Letztes mit der Primärdatenbank synchro- Dokumente aus der Collection users ausgelesen, die die Pro-nisiert wurde. Die so ermittelte Datenbank wird automatisch perty age:33 enthalten, und nach der Property name aufsteigendzur neuen Primärdatenbank. Wenn die ausgefallene Daten- sortiert ausgegeben.bank wieder zur Verfügung steht, reiht siesich als Sekundärdatenbank in den Cluster CREATE TABLE USERS (a Number, b Number) implizitein. INSERT INTO USERS VALUES(1,1) db.users.insert({a:1,b:1}) SELECT a,b FROM users db.users.find({}, {a:1,b:1}) SELECT * FROM users WHERE age=33 ORDER BY name db.users.find({age:33}).sort({name:1})Sharding UPDATE users SET a=1 WHERE b=q db.users.update({b:q}, {$set:{a:1}}, false, true) CREATE INDEX myindexname ON users(name) db.users.ensureIndex({name:1})MongoDB bietet mit AutoSharding ein Fea- SELECT DISTINCT last_name FROM users db.users.distinct(last_name)ture, das es ermöglicht, einen Datenbankser-ver automatisch auf verschiedene physika- Tabelle 1: Vergleich SQL – MongoDB-Shelllische Maschinen aufzuteilen und somit dieDatenbank horizontal zu skalieren. Um das Sharding bei Mon-goDB zu konfigurieren, werden drei Komponenten benötigt: Die Java-API Shard: Ein einzelner Datenbankserver, der eine Teilmenge, ein „Bruchstück“ bzw. Shard, der Daten beinhaltet. Um MongoDB in einem Java-Projekt einzusetzen, müssen wir mongos: Eine Art Router, der die Datenbankanfragen entge- uns lediglich das aktuelle mongo-x.x.jar von [Mong] herun- gennimmt, an die korrekten Shards weiterleitet und die Ant- terladen und in den Klassenpfad des Projektes einbinden. In worten der Shards zu einem kompletten Ergebnis zusammen- Schritt 1 von Listing 2 sehen wir, wie die Verbindung zu einer setzt. Die Informationen, welche Daten sich in welcher Shard Datenbank mithilfe des Mongo-Objekts und des DB-Objekts her- befinden, entnimmt mongos einem Konfigurationsserver. gestellt wird und eine optionale Authentifizierung mit einem Konfigurationsserver: Hier werden die Informationen über die Datenbanknutzer erfolgt. Das Abfangen der Exceptions ist zu- einzelnen Shards hinterlegt, welche von mongos synchronisiert gunsten der Lesbarkeit des Quellcodes gekürzt worden. werden.Das Sharding bei MongoDB funktioniert Collection-basiert. //Schritt 1 Mongo mongo = new Mongo();Es wird ein sogenannter ShardKey festgelegt, der als Kriteri-um fungiert, nachdem die Dokumente auf die verschiedenen DB db = mongo.getDB("test");Shards aufgeteilt werden. In unserem obigen Blog-Eintrag-Bei-spiel könnte der author als ShardKey festgelegt werden. Bei drei String username = "iks"; char passwd[] = { i, k, s };zur Verfügung stehenden Shards könnte der erste Shard al- booleanauth = db.authenticate(username, passwd);le Autoren von A-H, der zweite alle Autoren von I-P und derdritte alle Autoren von Q-Z enthalten. Die Applikation selbst //Schritt 2bekommt vom Sharding gar nichts mit. Anfragen werden an DBCollectioncoll = db.getCollection("testCollection");mongos gestellt, die sich der Applikation wie eine einzelne Da- DBObjectmyDoc = coll.findOne(); 5tenbank präsentieren.www.javaspektrum.de 17
  3. 3. Schwerpunktthema  System.out.println(myDoc); final byte[]fileAsByte = readFile(file); coll.drop(); GridFSgridFS = new GridFS(db); //Schritt 3 GridFSInputFileinputFile = gridFS.createFile(byteArray); DBObject doc = new BasicDBObject(); inputFile.save(); String name = inputFile.getFilename(); doc.put("name", "MongoDB"); doc.put("type", "database"); List list = gridFS.find(name); doc.put("count", 1); Listing 4: Dateien speichern mit GridFS BasicDBObject info = new BasicDBObject(); info.put("x", 203); info.put("y", 102); In der Java-API stellt die Klasse GridFS die Funktionalität doc.put("info", info); zum Abspeichern von Dateien zur Verfügung. Listing 4 zeigt die Schritte, die nötig sind, um eine Datei in der Datenbank coll.insert(doc); abzulegen, wobei das Einlesen der Datei in der Methode read- File() abstrahiert wurde. GridFS kann über ein byte-Array aus //Schritt 4 BasicDBObject query = new BasicDBObject(); einer Datei ein GridFSInputFile kreieren, welches dann einfach query.put("i", 71); per save()-Methode abgespeichert werden kann. Anhand des DBCursor cur = coll.find(query); Dateinamens können wir das Dokument per find()-Methode while (cur.hasNext()) { wieder aus der Datenbank auslesen. Um die einzelnen Chunks System.out.println(cur.next()); } muss sich der Programmierer nicht kümmern, da dies automa- tisch von MongoDB übernommen wird.Listing 2: Basis-Operationen In Schritt 2 wird mit einer DBCollection eine Collection aus der EinsatzgebieteDatenbank ausgelesen und mit der findOne()-Methode der ers-te Eintrag aus dem Ergebnis in ein DBObject – der Java-Entspre- Obwohl MongoDB ein noch recht junges Projekt ist, bietetchung eines Dokuments – geschrieben. Mit der Methode coll. die Datenbank eine Fülle von Features und positioniert sichdrop() wird die gesamte Collection aus der Datenbank entfernt. damit – wie gewollt – zwischen den schnellen, aber feature- In Schritt 3 legen wir ein eigenes DBObject an und befüllen es ärmeren und unflexibleren Schlüssel-Wert-Speichern undmit der put()-Methode, die als ersten Parameter den Namen den komplexeren, schwergewichtigeren relationalen Daten-und als zweiten Parameter den Wert der Eigenschaft erhält. So banken und wird auch schon in vielen Produktivumgebun-ist es auch auf einfache Art und Weise möglich, ein eingebet- gen eingesetzt. MongoDB wird in der Regel nicht exklusivtetes Dokument hinzuzufügen. Mit der coll.insert()-Methode verwendet, sondern dient als Lösung für bestimmte Teilauf-wird das Dokument in die Collection geschrieben. gaben. Einige bekanntere Firmen, die MongoDB einsetzen In Schritt 4 verwenden wir ein BasicDBObject, um eine Abfra- sindge abzusetzen. In diesem Fall werden alle Dokumente aus der  Foursquare: Ein ortsabhängiges soziales Netzwerk, mit demCollection, die i:71 als Eigenschaft beinhalten, in einen DBCursor Nutzer an Orten virtuell einchecken und zu diesen Ortengeschrieben. Mithilfe des Cursors können wir über das Ergeb- Tipps und Bewertungen schreiben. Foursquare setzt Mon-nis iterieren. Mit Literalen und Punktnotation können wir auch goDB exklusiv für die Eincheck-Funktion ein (‚Who’s here?‘).komplexere Abfragen erstellen.  New York Times: Hier wird MongoDB für ein frei konfigu- rierbares Foto-Upload-Formular verwendet. Aufgrund der query.put(“i”, newBasicDBObject(“$gt”, 20).append(“$lte”, 30)); Schemalosigkeit der Dokumente kann jeder Anwender sein coll.find(query); eigenes, maßgeschneidertes Formular erstellen.  Sourceforge: Die Projekt-Webseiten und die Download-SeitenListing 3: Parametrisierte Abfrage aller Projekte werden mit MongoDB verwaltet.  GitHub: Die soziale Coding-Plattform setzt MongoDB für in- Die Methoden aus Listing 3 lesen alle Dokumente aus der Col- ternes Reporting ein.lection mit 20 < i < 30. Eine vollständige Übersicht über die zur  IGN Entertainment: Die Computerspiele- und Unterhaltungs-Verfügung stehenden Literale und Befehle findet sich auf [Mong]. seite analysiert in Echtzeit den Seiten-Verkehr mit MongoDB. Auch der Umgang mit großen Dateien stellt mit MongoDB kein Da die Datenbank von Anfang an für den Einsatz in Webappli-Problem dar. Mit GridFS, einer leichtgewichtigen Spezifikation kationen vorgesehen war, lassen sich mit MongoDB Aufgabenzum Speichern von Dateien, die auf der normalen Dokumenten- wie Dokumentenmanagement, das Verwalten von Anwender-spezifikation aufsetzt, werden große Dateien einfach in kleinere und Sitzungsdaten, Logging, Echt-Zeit-Analysen und gene-Chunks aufgesplittet und jeder Chunk wird als eigenes Doku- rell Aufgaben mit einem hohen Datenaufkommen einfach undment in der Datenbank abgelegt. MongoDB stellt mit fs.chunks bequem lösen. Nicht geeignet ist MongoDB für Systeme miteine eigene Collection für GridFS-Dateien zur Verfügung. Die komplexen Transaktionen und für traditionelle Business-Intel-Dokumente in dieser Collection bestehen aus einer id, einer file_ ligence-Projekte, da die dafür nötigen Strukturen nicht zur Ver-id, die festlegt, in welchem Dokument sich die Metadaten für fügung stehen.den Chunk befinden, einer Chunk-Nummer und den binärenDaten des Dateifragments. Die file_id verweist auf eine andereCollection namens fs.files, die die Dateiinformationen enthält, Fazitdie folgende Angaben umfasst: eine id, die Größe der Datei inBytes, eine Angabe über die Chunk-Größe, das Upload-Datum MongoDB ist eine Datenbank, die bei den oben aufgeführ-und eine md5-Checksumme, mit deren Hilfe Nutzer überprü- ten Einsatzgebieten ohne Schwierigkeiten eingesetzt werdenfen können, ob die Datei korrekt hochgeladen wurde. kann. Datenreplikation und Skalierbarkeit funktionieren ein- 18 JavaSPEKTRUM 1/2011
  4. 4.  Schwerpunktthemafach und automatisch. Innerhalb weniger Minuten lässt sich Literatur und Linksein neuer Server in einen bestehenden Cluster einbinden undnutzen; vertikales Skalieren, also das Aufrüsten eines beste- [Ban10] K. Banker, MongoDB in Action (MEAP), Manning, 2010henden Servers und die damit verbundene Ausfallzeit, entfal- [Bson] Homepage BSON,len vollständig. Der Failover-Mechanismus funktioniert eben- http://www.bsonspec.orgfalls automatisch und garantiert somit eine sehr hohe Daten- [Cho10] K. Chodorow, M. Dirolf, MongoDB:verfügbarkeit. The Definitive Guide, O’Reilly, 2010 MongoDB ist hochperformant. Atomare Updates von Do- [Mong] Homepage MongoDB,kumenten sind um ein Vielfaches schneller als bei relationa- http://www.mongodb.orglen Datenbanken. In einem interessanten Blog-Eintrag [Word] [Word] Wordnik-Blog,beschreiben die Entwickler von Wordnik, dass sie aufgrund http://blog.wordnik.com/12-months-with-mongodbvon Performance-Problemen den Umstieg von MySQL aufMongoDB vollzogen haben. Die Geschwindigkeit verschiede-ner Abfragen hat sich signifikant verbessert. Das Abfragen vonWörterbucheinträgen dauert statt 20 ms nur noch 1 ms, Abfra-gen, die auf den Plattenspeicher zugreifen, dauern nur noch 60ms statt 400 ms. Markus Alvermann ist als IT-Berater bei derDie Java-API ist ausgereift und einfach zu verwenden. Durch iks Gesellschaft für Informations- und Kommuni-die JavaScript-ähnliche Syntax finden sich Programmierer sehr kationssysteme mbH tätig. In seinen Kundenprojektenleicht in MongoDB zurecht. beschäftigt er sich seit vielen Jahren mit der Entwick- Natürlich gibt es Nachteile: Um eine hohe Geschwindigkeit lung moderner JEE-Anwendungen. Ein besondererzu erreichen, wird die gesamte Datenbank im RAM gehalten. Interessenschwerpunkt ist die Evaluierung neuerKommt es zum unsauberen Beenden einer Master-Datenbank, Technologien. E-Mail: m.alvermann@iks-gmbh.comsind die Daten oftmals korrupt. Deswegen ist es zwingend not-wendig, MongoDB mit Replikation laufen zu lassen. Außerdemsollte MongoDB auf einem 64-Bit-System installiert werden, umdie RAM-Beschränkung von 32-Bit-Systemen zu umgehen.www.javaspektrum.de 19

×