SlideShare uma empresa Scribd logo
1 de 4
Baixar para ler offline
Schwerpunktthema 

Alles ist möglich                                                                 {
                                                                              nutzername:'mustermann',


Einführung                                                                    inhalt:'Wieder was gelernt.',
                                                                              email:'max@mustermann.de'



in 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 von
Daten, die nicht transaktionsbasiert vorgehalten werden müssen, eine      Listing 1: Dokument
hochperformante, skalierbare, schemafreie und dokumentenorientierte
Lö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 Daten
E    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 wiederum
sollte. 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 ein
doch heraus, dass potenzielle Kunden zwar nicht bereit waren,             Blog-Eintrag nicht so einfach abbilden. Hierzu benötigen wir
dermaß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 funktionieren
lung 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 Arbeiten
biet bzw. eine der wichtigsten Eigenschaften der Datenbank:               sorgt, da Dokumente dynamisch um benötigte Informationen
die 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 beispielsweise
ternet 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 Platz
den (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 mit
Dokument besteht aus einem sortierten Satz von Eigenschaf-                völlig unterschiedlichem Aufbau beinhalten.
ten, die aus einem Namen und einem Wert bestehen. Werte
können einfache Datentypen, Felder oder andere Dokumente
sein. Dokumente sind schemalos, d. h. sie haben keinen festen             Hochperformant
Aufbau, sondern werden dynamisch mit den Daten befüllt, die
benö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 Datenbank
Platzersparnis 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
        Schwerpunktthema

Der Wert kennzeichnet die Reihenfolge der indizierten Elemente            Installation
(1 für aufsteigend, -1 für absteigend), zusammengesetzte Indizes
werden 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 Konsole
Um dieses Feature nutzen zu können, müssen lediglich min-                 wechseln wir in das bin-Verzeichnis der MongoDB-Installation
destens 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-Shell
zugehörigen Slave mit mongod --slave --sourcemaster_adresse. Die
Daten des Masters werden automatisch auf den laufenden Sla- Ebenfalls im bin-Verzeichnis befindet sich unter ./mongo die Shell
ves 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 Shell
zwö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 und
eine Primärdatenbank, die als Master fungiert, und eine belie- ihrem SQL-Pendant gegenübergestellt. Als Java-Entwickler hat
bige 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. Mit
Fällt sie aus, wird bei allen verfügbaren Sekundärdatenbanken db.users.find({age:33}).sort({name:1}) werden beispielsweise alle
geprü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 aufsteigend
zur neuen Primärdatenbank. Wenn die ausgefallene Daten- sortiert ausgegeben.
bank wieder zur Verfügung steht, reiht sie
sich als Sekundärdatenbank in den Cluster          CREATE TABLE USERS (a Number, b Number)     implizit
ein.                                               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-Shell
lische Maschinen aufzuteilen und somit die
Datenbank 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 der
dritte alle Autoren von Q-Z enthalten. Die Applikation selbst                //Schritt 2
bekommt 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();                        5
tenbank präsentieren.

www.javaspektrum.de                                                                                                                                17
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     Einsatzgebiete
Datenbank 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, bietet
chung eines Dokuments – geschrieben. Mit der Methode coll.              die Datenbank eine Fülle von Features und positioniert sich
drop() 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 und
mit 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 exklusiv
tetes 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-         sind
ge abzusetzen. In diesem Fall werden alle Dokumente aus der              Foursquare: Ein ortsabhängiges soziales Netzwerk, mit dem
Collection, die i:71 als Eigenschaft beinhalten, in einen DBCursor         Nutzer an Orten virtuell einchecken und zu diesen Orten
geschrieben. 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-Seiten
Listing 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 Aufgaben
zum 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 und
ment in der Datenbank abgelegt. MongoDB stellt mit fs.chunks            bequem lösen. Nicht geeignet ist MongoDB für Systeme mit
eine 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ären
Daten des Dateifragments. Die file_id verweist auf eine andere
Collection namens fs.files, die die Dateiinformationen enthält,         Fazit
die folgende Angaben umfasst: eine id, die Größe der Datei in
Bytes, 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 werden
fen können, ob die Datei korrekt hochgeladen wurde.                     kann. Datenreplikation und Skalierbarkeit funktionieren ein-

 18                                                                                                                        JavaSPEKTRUM 1/2011
        Schwerpunktthema

fach und automatisch. Innerhalb weniger Minuten lässt sich       Literatur und Links
ein neuer Server in einen bestehenden Cluster einbinden und
nutzen; vertikales Skalieren, also das Aufrüsten eines beste-    [Ban10] K. Banker, MongoDB in Action (MEAP), Manning, 2010
henden Servers und die damit verbundene Ausfallzeit, entfal-     [Bson] Homepage BSON,
len vollständig. Der Failover-Mechanismus funktioniert eben-     http://www.bsonspec.org
falls 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.org
len 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-mongodb
von Performance-Problemen den Umstieg von MySQL auf
MongoDB vollzogen haben. Die Geschwindigkeit verschiede-
ner Abfragen hat sich signifikant verbessert. Das Abfragen von
Wörterbucheinträgen dauert statt 20 ms nur noch 1 ms, Abfra-
gen, die auf den Plattenspeicher zugreifen, dauern nur noch 60
ms statt 400 ms.                                                                    Markus Alvermann ist als IT-Berater bei der
Die 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 Kundenprojekten
leicht 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 besonderer
zu erreichen, wird die gesamte Datenbank im RAM gehalten.                           Interessenschwerpunkt ist die Evaluierung neuer
Kommt es zum unsauberen Beenden einer Master-Datenbank,                             Technologien.
                                                                                    E-Mail: m.alvermann@iks-gmbh.com
sind die Daten oftmals korrupt. Deswegen ist es zwingend not-
wendig, MongoDB mit Replikation laufen zu lassen. Außerdem
sollte MongoDB auf einem 64-Bit-System installiert werden, um
die RAM-Beschränkung von 32-Bit-Systemen zu umgehen.




www.javaspektrum.de                                                                                                                           19

Mais conteúdo relacionado

Destaque

Destaque (18)

Mehr Softwarequalität: Softwarequalität ist steuerbar
Mehr Softwarequalität: Softwarequalität ist steuerbarMehr Softwarequalität: Softwarequalität ist steuerbar
Mehr Softwarequalität: Softwarequalität ist steuerbar
 
Apps als motor zur digitalen transformation
Apps als motor zur digitalen transformationApps als motor zur digitalen transformation
Apps als motor zur digitalen transformation
 
"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010
"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010
"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010
 
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetproTest-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
 
App-Projekte richtig steuern
App-Projekte richtig steuernApp-Projekte richtig steuern
App-Projekte richtig steuern
 
Mehr Softwarequalitä: Usability
Mehr Softwarequalitä: UsabilityMehr Softwarequalitä: Usability
Mehr Softwarequalitä: Usability
 
FAQs zur Technik
FAQs zur TechnikFAQs zur Technik
FAQs zur Technik
 
iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb
iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb
iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb
 
Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)
 
Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)
 
Mehr Softwarequalität: Team-Cleancoding
Mehr Softwarequalität: Team-CleancodingMehr Softwarequalität: Team-Cleancoding
Mehr Softwarequalität: Team-Cleancoding
 
Micro, Nano, Mono - Microservices verständlich erklärt.
Micro, Nano, Mono  - Microservices verständlich erklärt.Micro, Nano, Mono  - Microservices verständlich erklärt.
Micro, Nano, Mono - Microservices verständlich erklärt.
 
Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...
Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...
Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...
 
Mehr Softwarequalität: Technische Schulden
Mehr Softwarequalität: Technische SchuldenMehr Softwarequalität: Technische Schulden
Mehr Softwarequalität: Technische Schulden
 
Mehr Softwarequalität: Qualität als Treiber
Mehr Softwarequalität: Qualität als TreiberMehr Softwarequalität: Qualität als Treiber
Mehr Softwarequalität: Qualität als Treiber
 
Agiles Arbeiten - Mythen, Trends und Best Practices
Agiles Arbeiten  - Mythen, Trends und Best PracticesAgiles Arbeiten  - Mythen, Trends und Best Practices
Agiles Arbeiten - Mythen, Trends und Best Practices
 
Ist Ihr Unternehmen reif für Microservices?
Ist Ihr Unternehmen reif für Microservices?Ist Ihr Unternehmen reif für Microservices?
Ist Ihr Unternehmen reif für Microservices?
 
Service goes green
Service goes greenService goes green
Service goes green
 

Semelhante a Einfuehrung in mongo_db_iks

mongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - GrundlagenmongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - Grundlageninovex GmbH
 
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungBack to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungMongoDB
 
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Oliver Hader
 
DOAG Webinar Oracle und Docker
DOAG Webinar Oracle und DockerDOAG Webinar Oracle und Docker
DOAG Webinar Oracle und DockerStefan Oehrli
 
Schau, Mutti, keine Programmierzeile
Schau, Mutti, keine ProgrammierzeileSchau, Mutti, keine Programmierzeile
Schau, Mutti, keine Programmierzeilerokr
 
Compact, Compress, De-DUplicate
Compact, Compress, De-DUplicateCompact, Compress, De-DUplicate
Compact, Compress, De-DUplicateUlrich Krause
 
Yes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-EntwicklerYes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-EntwicklerGregor Biswanger
 
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBDocker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBPeter Ramm
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBMario Müller
 
Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)Dietmar Leher
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)Uwe Printz
 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) MongoSF
 
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)inovex GmbH
 

Semelhante a Einfuehrung in mongo_db_iks (20)

mongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - GrundlagenmongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - Grundlagen
 
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungBack to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
 
Daos
DaosDaos
Daos
 
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
 
DOAG Webinar Oracle und Docker
DOAG Webinar Oracle und DockerDOAG Webinar Oracle und Docker
DOAG Webinar Oracle und Docker
 
Schau, Mutti, keine Programmierzeile
Schau, Mutti, keine ProgrammierzeileSchau, Mutti, keine Programmierzeile
Schau, Mutti, keine Programmierzeile
 
Compact, Compress, De-DUplicate
Compact, Compress, De-DUplicateCompact, Compress, De-DUplicate
Compact, Compress, De-DUplicate
 
Yes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-EntwicklerYes zu NoSQL mit MongoDB für .NET-Entwickler
Yes zu NoSQL mit MongoDB für .NET-Entwickler
 
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBDocker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDB
 
Codeblocks manual de_2012
Codeblocks manual de_2012Codeblocks manual de_2012
Codeblocks manual de_2012
 
Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)
 
Node.js für Webapplikationen
Node.js für WebapplikationenNode.js für Webapplikationen
Node.js für Webapplikationen
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)
 
Node.js
Node.jsNode.js
Node.js
 
CMS Kurs-Glossar
CMS Kurs-GlossarCMS Kurs-Glossar
CMS Kurs-Glossar
 
Openshift
OpenshiftOpenshift
Openshift
 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
 
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
Hadoop aus IT-Operations-Sicht - Teil 1 (Hadoop-Grundlagen)
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 

Mais de IKS Gesellschaft für Informations- und Kommunikationssysteme mbH

Mais de IKS Gesellschaft für Informations- und Kommunikationssysteme mbH (20)

Es wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingt
Es wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingtEs wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingt
Es wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingt
 
Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...
Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...
Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...
 
Thementag 2023 04 Lindern, heilen oder gar fit machen.pdf
Thementag 2023 04 Lindern, heilen oder gar fit machen.pdfThementag 2023 04 Lindern, heilen oder gar fit machen.pdf
Thementag 2023 04 Lindern, heilen oder gar fit machen.pdf
 
Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...
Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...
Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...
 
Thementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdf
Thementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdfThementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdf
Thementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdf
 
Thementag 2023 03 Einführung in die Softwaremodernisierung.pdf
Thementag 2023 03 Einführung in die Softwaremodernisierung.pdfThementag 2023 03 Einführung in die Softwaremodernisierung.pdf
Thementag 2023 03 Einführung in die Softwaremodernisierung.pdf
 
Thementag 2022 01 Verpassen Sie nicht den Anschluss.pdf
Thementag 2022 01 Verpassen Sie nicht den Anschluss.pdfThementag 2022 01 Verpassen Sie nicht den Anschluss.pdf
Thementag 2022 01 Verpassen Sie nicht den Anschluss.pdf
 
Thementag 2022 04 ML auf die Schiene gebracht.pdf
Thementag 2022 04 ML auf die Schiene gebracht.pdfThementag 2022 04 ML auf die Schiene gebracht.pdf
Thementag 2022 04 ML auf die Schiene gebracht.pdf
 
Thementag 2022 03 Ein Modell ist trainiert - und jetzt.pdf
Thementag 2022 03 Ein Modell ist trainiert - und jetzt.pdfThementag 2022 03 Ein Modell ist trainiert - und jetzt.pdf
Thementag 2022 03 Ein Modell ist trainiert - und jetzt.pdf
 
Thementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdf
Thementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdfThementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdf
Thementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdf
 
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine LearningDaten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
 
Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...
Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...
Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...
 
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
 
Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?
 
Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...
Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...
Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...
 
Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...
Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...
Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...
 
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine LearningDaten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
 
Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?
 
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine LearningDaten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
 
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
 

Einfuehrung in mongo_db_iks

  • 1. Schwerpunktthema  Alles ist möglich { nutzername:'mustermann', Einführung inhalt:'Wieder was gelernt.', email:'max@mustermann.de' in 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 von Daten, die nicht transaktionsbasiert vorgehalten werden müssen, eine Listing 1: Dokument hochperformante, skalierbare, schemafreie und dokumentenorientierte Lö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 Daten E 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 wiederum sollte. 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 ein doch heraus, dass potenzielle Kunden zwar nicht bereit waren, Blog-Eintrag nicht so einfach abbilden. Hierzu benötigen wir dermaß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 funktionieren lung 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 Arbeiten biet bzw. eine der wichtigsten Eigenschaften der Datenbank: sorgt, da Dokumente dynamisch um benötigte Informationen die 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 beispielsweise ternet 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 Platz den (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 mit Dokument besteht aus einem sortierten Satz von Eigenschaf- völlig unterschiedlichem Aufbau beinhalten. ten, die aus einem Namen und einem Wert bestehen. Werte können einfache Datentypen, Felder oder andere Dokumente sein. Dokumente sind schemalos, d. h. sie haben keinen festen Hochperformant Aufbau, sondern werden dynamisch mit den Daten befüllt, die benö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 Datenbank Platzersparnis 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. Schwerpunktthema Der Wert kennzeichnet die Reihenfolge der indizierten Elemente Installation (1 für aufsteigend, -1 für absteigend), zusammengesetzte Indizes werden 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 Konsole Um dieses Feature nutzen zu können, müssen lediglich min- wechseln wir in das bin-Verzeichnis der MongoDB-Installation destens 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-Shell zugehörigen Slave mit mongod --slave --sourcemaster_adresse. Die Daten des Masters werden automatisch auf den laufenden Sla- Ebenfalls im bin-Verzeichnis befindet sich unter ./mongo die Shell ves 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 Shell zwö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 und eine Primärdatenbank, die als Master fungiert, und eine belie- ihrem SQL-Pendant gegenübergestellt. Als Java-Entwickler hat bige 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. Mit Fällt sie aus, wird bei allen verfügbaren Sekundärdatenbanken db.users.find({age:33}).sort({name:1}) werden beispielsweise alle geprü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 aufsteigend zur neuen Primärdatenbank. Wenn die ausgefallene Daten- sortiert ausgegeben. bank wieder zur Verfügung steht, reiht sie sich als Sekundärdatenbank in den Cluster CREATE TABLE USERS (a Number, b Number) implizit ein. 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-Shell lische Maschinen aufzuteilen und somit die Datenbank 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 der dritte alle Autoren von Q-Z enthalten. Die Applikation selbst //Schritt 2 bekommt 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(); 5 tenbank präsentieren. www.javaspektrum.de 17
  • 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 Einsatzgebiete Datenbank 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, bietet chung eines Dokuments – geschrieben. Mit der Methode coll. die Datenbank eine Fülle von Features und positioniert sich drop() 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 und mit 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 exklusiv tetes 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- sind ge abzusetzen. In diesem Fall werden alle Dokumente aus der  Foursquare: Ein ortsabhängiges soziales Netzwerk, mit dem Collection, die i:71 als Eigenschaft beinhalten, in einen DBCursor Nutzer an Orten virtuell einchecken und zu diesen Orten geschrieben. 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-Seiten Listing 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 Aufgaben zum 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 und ment in der Datenbank abgelegt. MongoDB stellt mit fs.chunks bequem lösen. Nicht geeignet ist MongoDB für Systeme mit eine 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ären Daten des Dateifragments. Die file_id verweist auf eine andere Collection namens fs.files, die die Dateiinformationen enthält, Fazit die folgende Angaben umfasst: eine id, die Größe der Datei in Bytes, 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 werden fen können, ob die Datei korrekt hochgeladen wurde. kann. Datenreplikation und Skalierbarkeit funktionieren ein- 18 JavaSPEKTRUM 1/2011
  • 4. Schwerpunktthema fach und automatisch. Innerhalb weniger Minuten lässt sich Literatur und Links ein neuer Server in einen bestehenden Cluster einbinden und nutzen; vertikales Skalieren, also das Aufrüsten eines beste- [Ban10] K. Banker, MongoDB in Action (MEAP), Manning, 2010 henden Servers und die damit verbundene Ausfallzeit, entfal- [Bson] Homepage BSON, len vollständig. Der Failover-Mechanismus funktioniert eben- http://www.bsonspec.org falls 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.org len 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-mongodb von Performance-Problemen den Umstieg von MySQL auf MongoDB vollzogen haben. Die Geschwindigkeit verschiede- ner Abfragen hat sich signifikant verbessert. Das Abfragen von Wörterbucheinträgen dauert statt 20 ms nur noch 1 ms, Abfra- gen, die auf den Plattenspeicher zugreifen, dauern nur noch 60 ms statt 400 ms. Markus Alvermann ist als IT-Berater bei der Die 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 Kundenprojekten leicht 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 besonderer zu erreichen, wird die gesamte Datenbank im RAM gehalten. Interessenschwerpunkt ist die Evaluierung neuer Kommt es zum unsauberen Beenden einer Master-Datenbank, Technologien. E-Mail: m.alvermann@iks-gmbh.com sind die Daten oftmals korrupt. Deswegen ist es zwingend not- wendig, MongoDB mit Replikation laufen zu lassen. Außerdem sollte MongoDB auf einem 64-Bit-System installiert werden, um die RAM-Beschränkung von 32-Bit-Systemen zu umgehen. www.javaspektrum.de 19