Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TYPO3CMD18: NoSQL-Datenbanken: Ein Überblick

TYPO3CMD18: NoSQL-Datenbanken: Ein Überblick

Slides of my session at the TYPO3Camp Mitteldeutschland in Dresden 2018

Martin Helmich

January 26, 2018
Tweet

More Decks by Martin Helmich

Other Decks in Technology

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. 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
  5. 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
  6. 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
  7. 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/
  8. 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 })
  9. 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 })
  10. 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 /
  11. 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/
  12. 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/
  13. 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/
  14. 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/
  15. 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/
  16. 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); } } } );
  17. 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); } };
  18. 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); } })();
  19. 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/
  20. 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, …
  21. 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/
  22. 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
  23. 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
  24. 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"
  25. Neo4J • Schemalose Graph-Datenbank • Entwickelt von Neo Technology, Inc.

    • Verfügbar als Open Source-Edition (AGPL) und Enterprise Edition • Projekt-Homepage: Ø https://neo4j.com/
  26. 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
  27. „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
  28. Spezial-Datenbanken • Elasticsearch und Solr • Dokumentendatenbanken mit speziellem Fokus

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