14 Dinge, die ich gerne gewusst hätte, bevor ich mit MongoDB beginne

Der Artikel wurde im Vorfeld des Kurses erstellt „Nicht-relationale Datenbanken“.

14 Dinge, die ich gerne gewusst hätte, bevor ich mit MongoDB beginne

Wesentliche Punkte:

  • Es ist extrem wichtig, ein Schema zu entwickeln, auch wenn es in MongoDB nicht zwingend erforderlich ist.
  • Ebenso sollten die Indizes auf Ihr Schema und die Zugriffs Muster abgestimmt sein.
  • Vermeiden Sie die Verwendung großer Objekte und großer Arrays.
  • Seien Sie vorsichtig mit den Einstellungen von MongoDB, insbesondere in Bezug auf Sicherheit und Zuverlässigkeit.
  • In MongoDB gibt es keinen Abfrageoptimierer, daher sollten Sie vorsichtig bei der Ausführung von Abfragevorgängen sein.

Ich arbeite seit langer Zeit mit Datenbanken, habe aber erst vor Kurzem MongoDB entdeckt. Es gibt einige Dinge, die ich gerne gewusst hätte, bevor ich damit arbeite. Wenn jemand in einem bestimmten Bereich Erfahrung hat, hat er vorgefasste Meinungen darüber, was Datenbanken sind und was sie tun. Um anderen das Verständnis zu erleichtern, präsentiere ich eine Liste häufiger Fehler.

Einen MongoDB-Server ohne Authentifizierung erstellen

Leider wird MongoDB standardmäßig ohne Authentifizierung installiert. Für eine Workstation, die lokal zugänglich ist, ist diese Praxis üblich. Da MongoDB jedoch ein Mehrbenutzersystem ist, das große Mengen an Speicher benötigt, ist es ratsam, es auf einem Server mit maximal möglichem RAM für Ihre Gegebenheiten zu installieren, auch wenn Sie es nur für die Entwicklung nutzen möchten. Die Installation auf einem Server über den Standardport kann problematisch sein, insbesondere wenn in Anfragen beliebiger Code in JavaScript ausgeführt werden kann (zum Beispiel, $where als Idee für eine Injektion).

Es gibt verschiedene Authentifizierungsmethoden, aber am einfachsten ist es, für den Benutzer ID/Passwort festzulegen. Nutzen Sie diese Idee, während Sie über eine ausgeklügelte Authentifizierung auf Basis von LDAPnachdenken. Wenn es um Sicherheit geht, sollte MongoDB ständig aktualisiert werden, und die Protokolle sollten immer auf unbefugten Zugriff überprüft werden. Mir persönlich gefällt es, einen anderen Port als den Standardport zu wählen.

Vergessen Sie nicht, die Angriffsfläche an MongoDB zu binden.

Sicherheits-Checkliste für MongoDB enthält wertvolle Tipps zur Minderung des Risikos von Netzwerkangriffen und Datenlecks. Es ist leicht zu sagen, dass ein Entwicklungsserver kein hohes Sicherheitsniveau benötigt. Doch die Realität ist komplizierter, und dies gilt für alle MongoDB-Server. Insbesondere, wenn es keinen triftigen Grund gibt, die mapReduce, group oder $where, sollte die Ausführung von beliebigem JavaScript-Code durch eine Konfiguration in der Datei deaktiviert werden. javascriptEnabled:false. Da in der Standard-MongoDB die Datendateien nicht verschlüsselt sind, ist es ratsam, MongoDB mit dediziertem Benutzer, der vollen Zugriff auf die Dateien hat, aber nur eingeschränkten Zugang für ihn selbst und die Möglichkeit bietet, eigene Zugriffssteuerungsmittel des Betriebssystems zu nutzen, zu betreiben.

Fehler bei der Schema-Entwicklung

MongoDB verwendet kein Schema. Doch das heißt nicht, dass kein Schema erforderlich ist. Wenn Sie einfach Dokumente ohne ein konsistentes Schema speichern möchten, ist dies schnell und einfach möglich, jedoch kann es später äußerst schwierig sein, sie abzurufen..

Der klassische Artikel „6 empirische Regeln zur Gestaltung von MongoDB-Schemas“ ist lesenswert, und Funktionen wie Schema-Explorer Im externen Tool Studio 3T sollte für regelmäßige Überprüfungen von Schemata verwendet werden.

Vergessen Sie nicht die Sortierreihenfolge

Wenn Sie die Sortierreihenfolge ignorieren, können Sie am meisten enttäuscht werden und mehr Zeit verlieren als bei jeder anderen falschen Konfiguration. Standardmäßig verwendet MongoDB binäre Sortierung. Aber das wird kaum jemandem nützen. Groß- und Kleinschreibung sowie binäre Sortierungen wurden bereits in den 80er Jahren des letzten Jahrhunderts als kuriose Anachronismen betrachtet, zusammen mit Perlen, Kaftanen und gewellten Schnurrbärten. Ihre Verwendung ist heutzutage nicht mehr tragbar. In der Realität sind "Motorrad" und "motorrad" dasselbe. Und "Britannien" und "britannien" sind der gleiche Ort. Kleinbuchstaben sind einfach das kleine Äquivalent von Großbuchstaben. Und lassen Sie mich nicht über die Sortierung von diakritischen Zeichen sprechen. Bei der Erstellung einer Datenbank in MongoDB verwenden Sie Sortierparameter, die keine Akzent- und Groß-/Kleinschreibung, die der Sprache und Kultur der Nutzer des Systems entsprechen.So erleichtern Sie die Suche nach Zeichenfolgendaten erheblich.

Erstellung von Sammlungen mit großen Dokumenten

MongoDB kann große Dokumente mit einer Größe von bis zu 16 MB in Sammlungen speichern, während GridFS für Dokumente über 16 MB ausgelegt ist. Allerdings ist es nicht ideal, große Dokumente dort zu speichern, nur weil es möglich ist. MongoDB arbeitet am effektivsten, wenn Sie separate Dokumente von wenigen Kilobyte speichern, die man eher als Zeilen in einer breiten SQL-Tabelle betrachtet. Große Dokumente können Probleme verursachen mit Leistung.

Dem Erstellen von Dokumenten mit großen Arrays

Dokumente können Arrays enthalten. Es ist am besten, wenn die Anzahl der Elemente im Array weit von einer vierstelligen Zahl entfernt ist. Wenn Elemente häufig zum Array hinzugefügt werden, kann es das enthaltene Dokument übersteigen, und es muss verschoben werden, was bedeutet, dass es aktualisiert werden muss, und auch die Indizes. Bei der erneuten Indizierung eines Dokuments mit einem großen Array werden die Indizes oft überschrieben, da für jedes Element eine Aufzeichnungvorliegt, die seinen Index speichert. Eine solche erneute Indizierung findet auch statt, wenn ein Dokument eingefügt oder gelöscht wird.

In MongoDB gibt es den sogenannten „Füllfaktor“, der Platz für das Wachstum von Dokumenten bietet, um dieses Problem zu minimieren.
Sie denken vielleicht, dass Sie auf die Indizierung von Arrays verzichten können. Leider kann das Fehlen von Indizes andere Probleme mit sich bringen. Da die Dokumente von Anfang bis Ende durchgesehen werden, wird die Suche nach Elementen am Ende des Arrays mehr Zeit in Anspruch nehmen, und die meisten Operationen, die mit solch einem Dokument verbunden sind, werden langsam.

Denken Sie daran, dass die Reihenfolge der Stufen in der Aggregation wichtig ist.

In einem Datenbanksystem mit einem Abfrageoptimierer sind die Abfragen, die Sie schreiben, Erklärungen dafür, was Sie erhalten möchten, und nicht dafür, wie Sie es bekommen. Es funktioniert ähnlich wie eine Bestellung im Restaurant: Normalerweise bestellen Sie einfach ein Gericht und geben nicht dem Koch detaillierte Anweisungen.

In MongoDB weisen Sie den Koch an. Zum Beispiel sollten Sie sicherstellen, dass die Daten durch reduce so früh wie möglich im Pipeline-Prozess mit Hilfe von $match und $project, und die Sortierung erfolgt erst danach. reduce, und dass die Suche genau in der Reihenfolge erfolgt, die Sie benötigen. Ein Abfrageoptimierer, der überflüssige Arbeiten vermeidet, die Schritte optimal anordnet und den Typ der Verbindung auswählt, kann Ihnen verwöhnen. Bei MongoDB haben Sie mehr Kontrolle über den Preis des Komforts.

Tools wie Studio 3T vereinfachen den Aufbau von Aggregationsabfragen in MongoDB. Der Aggregation Editor ermöglicht es Ihnen, Pipeline-Operatoren Schritt für Schritt anzuwenden und die Eingangs- und Ausgangsdaten auf jeder Stufe zur Vereinfachung des Debuggings zu überprüfen.

Verwendung der schnellen Schreibweise

Setzen Sie in MongoDB niemals Schreibparameter mit hoher Geschwindigkeit und niedriger Zuverlässigkeit ein. Dieser Modus „file-and-forget“ scheint schnell zu sein, da der Befehl zurückgegeben wird, bevor die Schreiboperation stattfindet. Wenn das System abstürzt, bevor die Daten auf die Festplatte geschrieben wurden, gehen sie verloren und befinden sich in einem inkonsistenten Zustand. Glücklicherweise ist in der 64-Bit-Version von MongoDB das Logging aktiviert.

Die Speicher-Engines MMAPv1 und WiredTiger verwenden Logging, um dies zu verhindern, obwohl WiredTiger bis zum letzten konsistenten Kontrollpunkt wiederhergestellt werden kann., wenn das Logging deaktiviert ist.

Das Logging gewährleistet, dass die Datenbank nach einer Wiederherstellung in einem konsistenten Zustand bleibt und alle Daten bis zum Protokolleintrag speichert. Die Häufigkeit der Einträge kann mit dem Parameter commitIntervalMs.

Um sicherzustellen, dass die Aufzeichnungen stimmen, überprüfen Sie bitte, ob das Logging in der Konfigurationsdatei aktiviert ist (storage.journal.enabled), und dass die Häufigkeit der Einträge dem Informationsvolumen entspricht, das Sie sich leisten können zu verlieren.

Sortierung ohne Index

Bei der Suche und Aggregation besteht oft die Notwendigkeit, Daten zu sortieren. Wir hoffen, dass dies in einem der letzten Schritte erfolgt, nachdem das Ergebnis gefiltert wurde, um das zu sortierende Datenvolumen zu verringern. Und selbst dann benötigen Sie für die Sortierung Index. Sie können einen einfachen oder zusammengesetzten Index verwenden.

Wenn kein geeigneter Index vorhanden ist, kommt MongoDB ohne ihn aus. Es gibt eine Speicherkapazitätsbeschränkung von 32 MB für die Gesamtheit aller Dokumente in der Sortieroperation, und wenn MongoDB diese Grenze erreicht, gibt sie entweder einen Fehler aus oder gibt zurück eine leere Ergebnismenge.

Suche ohne Unterstützung von Indizes

Suchanfragen erfüllen eine Funktion, die der JOIN-Operation in SQL ähnelt. Für eine optimale Leistung benötigen sie einen Schlüsselwertindex, der als Fremdschlüssel verwendet wird. Das ist nicht offensichtlich, da die Verwendung nicht in explain(). Solche Indizes sind eine Ergänzung zu dem Index, der in explain()verzeichnet ist, welcher wiederum von den Pipeline-Operatoren genutzt wird $match und $sort, wenn sie am Anfang der Pipeline auftreten. Indizes können jetzt jede Stufe der Aggregationspipeline abdecken..

Der Verzicht auf Multi-Updates

Methode db.collection.update() wird verwendet, um einen Teil eines bestehenden Dokuments oder das gesamte Dokument zu ändern, bis hin zur vollständigen Ersetzung, abhängig von dem von Ihnen festgelegten Parameter Aktualisieren. Es ist nicht so offensichtlich, dass es nicht alle Dokumente in der Sammlung verarbeitet, bis Sie den Parameter Multi aktivieren, um alle Dokumente zu aktualisieren, die den Abfragekriterien entsprechen.

Vergessen Sie nicht, wie wichtig die Reihenfolge der Schlüssel in einer Hash-Tabelle ist.

In JSON besteht ein Objekt aus einer ungeordneten Sammlung von null oder mehr Schlüssel/Wert-Paaren, wobei der Schlüssel eine Zeichenkette ist und der Wert eine Zeichenkette, eine Zahl, ein boolescher Wert, null, ein Objekt oder ein Array sein kann.

Leider spielt BSON bei der Suche eine große Rolle in Bezug auf die Reihenfolge. In MongoDB hat die Reihenfolge der Schlüssel innerhalb von eingebetteten Objekten Bedeutung, d.h. { firstname: "Phil", surname: "factor" } ist nicht dasselbe wie { { surname: "factor", firstname: "Phil" }. Das bedeutet, dass Sie die Reihenfolge der Schlüssel/Werte in den Dokumenten beibehalten müssen, wenn Sie sicherstellen möchten, dass Sie sie finden.

Verwechseln Sie nicht "null" und "undefined"

Bedeutung "undefined" was laut dem offiziellen Standard JSON (ECMA-404, Abschnitt 5) niemals in JSON erlaubt war, obwohl es in JavaScript verwendet wird. Darüber hinaus ist es in BSON veraltet und wird in $null, was nicht immer die beste Lösung ist. Vermeiden Sie die Verwendung von "undefined" in MongoDB.

Nutzung $limit() ohne $sort()

Sehr oft, wenn Sie in MongoDB entwickeln, ist es hilfreich, einfach ein Beispiel für das Ergebnis zu sehen, das aus einer Abfrage oder Aggregation zurückgegeben wird. Für diese Aufgabe ist $limit(), aber es sollte niemals in der endgültigen Version des Codes sein, es sei denn, Sie verwenden davor $sort. Diese Mechanik ist erforderlich, da Sie sonst die Ergebnisse nicht in einer garantierten Reihenfolge erhalten und die Daten nicht zuverlässig durchsuchen können. Je nach Sortierung erhalten Sie unterschiedliche Datensätze an oberster Stelle. Für eine zuverlässige Funktion müssen Abfragen und Aggregationen deterministisch sein, das heißt, sie müssen bei jeder Ausführung die gleichen Ergebnisse liefern. Der Code, in dem es $limit(), aber nicht $sort, ist nicht deterministisch und kann später Fehler verursachen, die schwer zu verfolgen sind.

Fazit

Der einzige Weg, in Bezug auf MongoDB enttäuscht zu sein, ist, sie direkt mit einem anderen Datenbanktyp, wie einer relationalen Datenbank, zu vergleichen oder sie mit bestimmten Erwartungen zu nutzen. Das ist so, als würde man eine Orange mit einer Gabel vergleichen. Datenbanksysteme verfolgen spezifische Ziele. Am besten ist es, diese Unterschiede zu verstehen und für sich selbst zu bewerten. Es wäre schade, die Entwickler von MongoDB aufgrund des Weges, den sie in Richtung relationaler Datenbanken gegangen sind, unter Druck zu setzen. Ich möchte neue und interessante Ansätze zur Lösung alter Probleme sehen, wie die Gewährleistung der Datenintegrität und den Aufbau von datensicheren Systemen, die sowohl gegen Ausfälle als auch gegen Angriffe von Dritten gewappnet sind.

Die Einführung der ACID-Transaktionsfähigkeit in MongoDB Version 4.0 ist ein gutes Beispiel für die Implementierung wichtiger Verbesserungen auf innovative Weise. Multidokument- und Multi-Operator-Transaktionen sind jetzt atomar. Zudem gibt es die Möglichkeit, die Zeit, die für das Erhalten von Sperren benötigt wird, zu steuern, hängende Transaktionen zu beenden und das Isolationsniveau anzupassen.

14 Dinge, die ich gerne gewusst hätte, bevor ich mit MongoDB beginne

Weiterlesen:

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster