TYPO3CMD18: NoSQL-Datenbanken: Ein Überblick

TYPO3CMD18: NoSQL-Datenbanken: Ein Überblick

Slides of my session at the TYPO3Camp Mitteldeutschland in Dresden 2018

2b68bc93708466a655a4c60458dc7955?s=128

Martin Helmich

January 26, 2018
Tweet

Transcript

  1. NoSQL-Datenbanken Ein Überblick Martin Helmich Mittwald CM Service GmbH &

    Co. KG TYPO3Camp Mitteldeutschland, Dresden 26. Januar 2018 CC-0, mahaviharya https://pixabay.com/en/meditation-monk-snow-mountain-3083274/
  2. Martin Helmich Software & Systems Architect @ Mittwald CM Service

    Dozent @ Private Hochschule für Wirtschaft & Technik http://stackoverflow.com/story/martinhelmich https://github.com/martin-helmich https://www.martin-helmich.de
  3. SQL

  4. SQL No SQL

  5. http://nosql-database.org Aktuell: >225 verschiedene NoSQL-Datenbanken

  6. None
  7. CC-0, Unsplash https://pixabay.com/de/geb%C3%A4ude-turm-hochhaus-wolkenkratzer-691873/

  8. None
  9. NoSQL SQL vs. • Relationale Datenbanken: • Starker Fokus auf

    Konsistenz • ACID-Transaktionen • Häufig schlecht skalierbar • NoSQL-Datenbanken: • Sehr vielfältig, oft hochspezialisierte Produkte • Oft auf lineare Skalierung und/oder Hochverfügbarkeit ausgelegt • Geringer Fokus auf Konsistenz • BASE statt ACID
  10. Transaktionssicherheit & Konsistenz • Starke Transaktionssicherheit (ACID) • Datenbanksystem (auch

    verteilt) ist zu jedem Zeitpunkt konsistent • Sicherstellung der Konsistenz erfordert ggf. Einschränkung der Verfügbarkeit • Schwache Transaktionssicherheit (BASE) • Datenbanksystem kann über einen gewissen Zeitraum inkonsistent sein • Verzicht auf jederzeitige Konsistenz erlaubt höhere Verfügbarkeit A C I D tomicity onsistency solation urability B A S E asically vailable oft State ventually consistent
  11. MongoDB • Schemalose, dokumentenorientierte NoSQL-Datenbank • Entwickelt von der MongoDB,

    Inc. • Verfügbar als Open Source (AGPL) • Name stammt von „humongous“ („riesig“, „gigantisch“) • Skalierung über horizontale Fragmentierung („sharding“) • Projekt-Homepage: Ø https://www.mongodb.com
  12. MongoDB • Grundaufbau einer MongoDB • Ein Server verwaltet mehrere

    Datenbanken • Jede Datenbank besteht aus mehreren Collections • Jede Collection besteht aus mehreren Dokumenten • Jedes Dokument ist ein BSON-Dokument • BSON („Binary JSON“) ist eine Erweiterung von JSON um zusätzliche Datentypen • Mehr: Ø https://docs.mongodb.com/manual/core/databa ses-and-collections/ Ø https://docs.mongodb.com/manual/reference/b son-types/
  13. MongoDB • Einfachste Nutzerschnittstelle zu einer MongoDB ist der Kommandozeilen-Client

    • Offizielle Client-Bibliotheken für C, C++, C#, Java, Node.JS, Perl, PHP, Python, Ruby und Scala Ø https://docs.mongodb.com/ec osystem/drivers/ Ø https://mongodb.github.io/nod e-mongodb-native/ • Community-entwickelte Bibliotheken für Go und Erlang > show dbs admin 0.000GB local 0.000GB > show collections > use myDatabase switched to db myDatabase > db.myCollection.insert({ "firstName": "Martin", "lastName": "Helmich" }) WriteResult({ "nInserted" : 1 })
  14. MongoDB • Dokumente in einer MongoDB- Collections sind schemalos! •

    Sie können beliebig komplex ineinander verschachtelt sein • Mehr: Ø https://docs.mongodb.com/ma nual/core/document/ > db.customers.insert({ "firstName": "Martin", "lastName": "Helmich", "orders": [ { "date": new Date("2017-01-15T16:46:52"), "article": { "_id": 1 }, "deliveryAddress": { "street": "Musterstraße", "houseNo": 1, "city": { "name": "Rahden", "zip": "32369" } } } ] }) WriteResult({ "nInserted" : 1 })
  15. MongoDB • Abfragen an eine Collection sind ebenfalls BSON-Dokumente >

    db.customers.find({firstName: "Martin"}) { "_id" : ObjectId("…"), "firstName" : "Martin", "lastName" : "Helmich", "orders" : [ { "date": new Date("2017-01-15T16:46:52"), "article": { "_id" : 1 }, "deliveryAddress" : { "street" : "Musterstraße", "houseNo" : 1, "city" : { "name" : "Rahden", "zip" : "32369" } } } ] } > db.customers.find({ "orders.deliveryAddress.city.name": "Rahden" }) { "_id" : ObjectId("…"), "firstName" : "Martin", …} • Abfragen sind auch an verschachtelte Eigenschaften eines Dokuments möglich • Mehr: Ø https://docs.mongodb.com/ma nual/tutorial/query- documents/ Ø https://docs.mongodb.com/ma nual/reference/operator/query /
  16. MongoDB: Caveats • Transaktionssicherheit nur pro Dokument! • Keine Collection-übergreifenden

    Queries (wie z.B. JOINs in SQL)! • Keine Fremdschlüssel und keine referenzielle Integrität! CC-0, katharinakanns https://pixabay.com/de/otter-verkehrszeichen-warnung-tiere-1665106/
  17. MongoDB: Skalierung Herstellerangaben: • 100+ Server in mehreren Rechenzentren möglich

    • 100.000+ Lese- & Schreibzugriffe pro Sekunde möglich Quelle: Ø https://www.mongodb.com/mongodb-scale CC-0, Unsplash https://pixabay.com/de/geb%C3%A4ude-turm-hochhaus-wolkenkratzer-691873/
  18. MongoDB: Skalierung • Eine MongoDB-Collection kann auf mehrere Shards aufgeteilt

    sein • Jeder Shard besteht aus mehreren Chunks • Jeder Shard wird von einem MongoDB-Server verwaltet • Ausführlich: Ø https://docs.mongodb.com/manual/sharding/ https://docs.mongodb.com/manual/sharding/
  19. MongoDB: Skalierung • Eine MongoDB-Collection kann auf mehrere Shards aufgeteilt

    sein • Jeder Shard besteht aus mehreren Chunks • Jeder Shard wird von einem MongoDB-Server verwaltet • Der Zugriff erfolgt über einen Router, welche Anfragen an die entsprechenden Shards weiterleitet. https://docs.mongodb.com/manual/sharding/
  20. MongoDB: Skalierung Die Verteilung von Dokumenten auf Chunks kann erfolgen

    über • eine Hashfunktion über den Shard Key • Vorteil: Gute Gleichverteilung möglich (setzt jedoch einen gut gewählten Shard Key voraus) • Nachteil: Range Queries über den Shard Key sind ineffizient • Einteilung in bestimmte Intervalle (Ranges) des Shard Keys • Vorteil: Range Queries über den Shard Key sind effizient • Nachteil: Keine Gleichverteilung sichergestellt https://docs.mongodb.com/manual/sharding/
  21. MongoDB: Nutzung • Installation des Node.JS- Treibers: npm install --save

    mongodb • Wie üblich: Alles asynchron • Dokumentation: Ø https://mongodb.github.io/nod e-mongodb-native/ const mongo = require("mongodb"); const MongoClient = mongo.MongoClient; MongoClient.connect( "mongodb://localhost:27017/library", (err, database) => { const collection = database.collection("books"); const cursor = collection.find({ "author.name": "Tolkien" }); cursor.toArray((err, books) => { for (const book of books) { console.log("Buch gefunden: " + book.title); } } } );
  22. MongoDB: Nutzung • Installation des Node.JS- Treibers: npm install --save

    mongodb • Wie üblich: Alles asynchron • Dokumentation: Ø https://mongodb.github.io/nod e-mongodb-native/ const mongo = require("mongodb"); const MongoClient = mongo.MongoClient; MongoClient.connect("mongodb://localhost:27017/library") .then(database => { const collection = database.collection("books"); return collection.find({"author.name": "Tolkien"}); }) .then(cursor => cursor.toArray()) .then(books => { for (const book of books) { console.log("Buch gefunden: " + book.title); } };
  23. MongoDB: Nutzung • Installation des Node.JS- Treibers: npm install --save

    mongodb • Wie üblich: Alles asynchron • Dokumentation: Ø https://mongodb.github.io/nod e-mongodb-native/ const mongo = require("mongodb"); const MongoClient = mongo.MongoClient; (async () => { const database = await MongoClient.connect( "mongodb://localhost:27017/library"); const collection = database.collection("books); const cursor = collection.find({"author.name": "Tolkien"}); const books = await cursor.toArray(); for (const book of books) { console.log("Buch gefunden: " + book.title); } })();
  24. MongoDB – Security Obacht bei Mongo-Datenbanken im Netzwerk: • Standardmäßig

    ist keine Authentifizierung aktiv • Vorfall 2015: 40.000 offene MongoDB- Datenbanken weltweit bekannt Ø https://www.heise.de/security/meldung/Student en-entdecken-Tausende-offene-Firmen- Datenbanken-im-Internet-2545183.html • Daher: Authentifizierung aktivieren! Ø https://docs.mongodb.com/manual/tutorial/ena ble-authentication/
  25. Weitere Dokumenten- Datenbanken • Apache CouchDB • Im Unterschied zu

    MongoDB stärkerer Fokus auf Verfügbarkeit statt auf Konsistenz (AP statt CP) • Abfrage über vordefinierte Map/Reduce- Views • Couchbase • ist nicht CouchDB! • CP-Fokus • SQL-ähnliche Abfragesprache („N1QL“) • Weitere: HyperDex, OrientDB • RDBMS mit dokumentenorientierten Funktionen: Informix, PostgreSQL, …
  26. Immer bedenken! • Das richtige Werkzeug für den richtigen Zweck

    • Gegenbeispiele: • „Why you should never use MongoDB“, http://www.sarahmei.com/blog/2013/11/11/why-you-should- never-use-mongodb • „Don‘t use MongoDB“, http://pastebin.com/raw/FD3xe6Jt CC-0, stevep https://pixabay.com/de/verwirrt-durcheinander-unlogisch-880735/
  27. Redis • Key-Value-Store • Entwickelt von Redis Labs, Inc. •

    In-Memory-basiert, mit Persistenz • Verfügbar als Open Source, unter BSD- Lizenz • Projekt-Homepage: Ø https://redis.io
  28. Redis • Kommunikation über befehlsbasiertes Protokoll • Wichtigste Befehle: •

    GET, EXISTS • SET, DEL • INCR, DECR • EXPIRE, EXPIREAT, PERSIST • Vollständige Referenz: Ø https://redis.io/commands • GET somekey (nil) • SET somekey somevalue "OK" • GET somekey somevalue • SET counter "1" "OK" • INCR counter (integer) 2 • EXPIRE counter 300 (integer) 1
  29. Redis Häufige Architektur: • Redis als Cache für häufig benötigte

    oder aufwändig zu errechnende Daten Warum Redis? • Hohe Geschwindigkeit durch In-Memory- Verarbeitung • Hashmap als unterliegende Datenstruktur. Bedeutet: Die meisten Operationen in Redis sind O(1) Applikation GET cacheKey (nil) db.collection.find({…}) { "_id": …} SET cacheKey "{_id:…}" EX 300 "OK"
  30. Graphen-Datenbanken

  31. Neo4J • Schemalose Graph-Datenbank • Entwickelt von Neo Technology, Inc.

    • Verfügbar als Open Source-Edition (AGPL) und Enterprise Edition • Projekt-Homepage: Ø https://neo4j.com/
  32. Neo4J • Grundaufbau • Der Graph besteht aus Knoten und

    Kanten (Nodes und Edges) • Jeder Knoten und jede Kante kann beliebige Attribute haben (ähnlich einer schemalosen Dokumentendatenbank) • Jeder Knoten und jede Kante kann beliebige Labels haben Ø https://neo4j.com/developer/guide-data- modeling/ • Abfragen gegen den Graphen sind über die Query Language Cypher möglich Ø https://neo4j.com/developer/cypher-query- language/ firstName: Martin lastName: Helmich Person University Company WORKS_AT since: 2008 WORKS_AT since: 2017 name: HSHL name: Mittwald Finde einen bestimmten Knoten: MATCH (p:Person) WHERE p.firstName = "Martin" RETURN p Finde alle Hochschulen, an denen Martin unterrichtet: MATCH (p:Person)-[:WORKS_AT]->(u:University) WHERE p.firstName="Martin" RETURN u Finde alle anderen Personen, die zusammen mit Martin an einer Hochschule unterrichten MATCH (m:Person)-[:WORKS_AT]->(:University) <-[:WORKS_AT]-(coworker:Person) WHERE m.firstName="Martin" RETURN coworker
  33. „Allrounder“- Datenbanken • ArangoDB • Vereint dokumentenorientierte, graphorientierte und Key-Value-Store-

    Funktionen • Abfrage mit eigener Abfragesprache AQL • OrientDB • Vereint dokumentenorientierte und graphorientierte Funktionen • Abfrage mit SQL • Starke ACID-Transaktionssicherheit CC-0, Petr Kratochvil http://www.publicdomainpictures.net/view-image.php?image=2681
  34. Spezial-Datenbanken • Elasticsearch und Solr • Dokumentendatenbanken mit speziellem Fokus

    auf Volltextsuche • InfluxDB, Prometheus, Graphite • Zeitreihen und Messdaten • etcd • Konfigurationsdaten • Vault • Geheimnisse