14 Dinge, die ich gerne wüsste, bevor ich mit MongoDB anfing

Die Übersetzung des Artikels wurde am Vorabend des Kursbeginns erstellt „Nicht-relationale Datenbanken“.

14 Dinge, die ich gerne wüsste, bevor ich mit MongoDB anfing

Highlights:

  • Es ist äußerst wichtig, ein Schema zu entwickeln, auch wenn es in MongoDB optional ist.
  • Ebenso müssen Indizes Ihrem Schema und Ihren Zugriffsmustern entsprechen.
  • Vermeiden Sie die Verwendung großer Objekte und großer Arrays.
  • Seien Sie vorsichtig mit den MongoDB-Einstellungen, insbesondere wenn es um Sicherheit und Zuverlässigkeit geht.
  • MongoDB verfügt nicht über einen Abfrageoptimierer, daher müssen Sie beim Ausführen von Abfragevorgängen vorsichtig sein.

Ich arbeite schon sehr lange mit Datenbanken, habe MongoDB aber erst vor kurzem entdeckt. Es gibt ein paar Dinge, die ich gerne wüsste, bevor ich anfing, damit zu arbeiten. Wenn eine Person bereits Erfahrung in einem bestimmten Bereich hat, hat sie vorgefasste Vorstellungen darüber, was Datenbanken sind und was sie tun. Um es für andere verständlicher zu machen, präsentiere ich eine Liste häufiger Fehler.

Erstellen eines MongoDB-Servers ohne Authentifizierung

Leider wird MongoDB standardmäßig ohne Authentifizierung installiert. Bei einer Workstation, auf die lokal zugegriffen wird, ist diese Vorgehensweise normal. Da es sich bei MongoDB jedoch um ein Mehrbenutzersystem handelt, das gerne viel Speicher benötigt, ist es besser, wenn Sie es auf einem Server mit möglichst viel RAM installieren, auch wenn Sie es nur für die Entwicklung verwenden. Die Installation auf dem Server über den Standardport kann problematisch sein, insbesondere wenn in der Anfrage beliebiger Javascript-Code ausgeführt werden kann (z. B. $where als Idee für Injektionen).

Es gibt mehrere Authentifizierungsmethoden, die einfachste ist jedoch die Festlegung einer Benutzer-ID/eines Passworts. Nutzen Sie diese Idee, während Sie über eine ausgefallene Authentifizierung basierend auf nachdenken LDAP. Wenn es um die Sicherheit geht, sollte MongoDB ständig aktualisiert werden und Protokolle sollten immer auf unbefugten Zugriff überprüft werden. Ich wähle zum Beispiel gerne einen anderen Port als Standardport aus.

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

MongoDB-Sicherheitscheckliste enthält gute Tipps zur Reduzierung des Risikos von Netzwerkeinbrüchen und Datenlecks. Man kann es leicht abtun und sagen, dass ein Entwicklungsserver kein hohes Maß an Sicherheit benötigt. Allerdings ist es nicht so einfach und das gilt für alle MongoDB-Server. Insbesondere dann, wenn kein zwingender Grund für die Nutzung vorliegt mapReduce, group oder $wo, müssen Sie die Verwendung von beliebigem Code in JavaScript deaktivieren, indem Sie in die Konfigurationsdatei schreiben javascriptEnabled:false. Da Datendateien im Standard-MongoDB nicht verschlüsselt sind, ist es sinnvoll, MongoDB damit auszuführen Dedizierter Benutzer, das vollen Zugriff auf Dateien hat, mit eingeschränktem Zugriff nur darauf und der Möglichkeit, die Dateizugriffskontrollen des Betriebssystems zu verwenden.

Fehler beim Entwickeln der Schaltung

MongoDB verwendet kein Schema. Dies bedeutet jedoch nicht, dass das System nicht benötigt wird. Wenn Sie nur Dokumente ohne einheitliches Muster speichern möchten, kann das Speichern schnell und einfach sein, das spätere Abrufen kann jedoch schwierig sein. verdammt schwer.

Klassischer Artikel "6 Faustregeln für das MongoDB-Schema-Design“ Es ist eine Lektüre wert und bietet ähnliche Funktionen Schema-Explorer Im Drittanbieter-Tool Studio 3T lohnt sich der Einsatz für regelmäßige Überprüfungen von Schaltkreisen.

Vergessen Sie nicht die Sortierreihenfolge

Das Vergessen der Sortierreihenfolge kann zu mehr Frustration und Zeitverschwendung führen als jede andere falsche Konfiguration. Standardmäßig verwendet MongoBD binäre Sortierung. Aber es ist unwahrscheinlich, dass es für irgendjemanden nützlich ist. In den 80er Jahren des letzten Jahrhunderts galten Groß-/Kleinschreibung, Akzent-sensitive, binäre Sortierungen zusammen mit Perlen, Kaftanen und lockigen Schnurrbärten als seltsame Anachronismen. Jetzt ist ihr Einsatz unverzeihlich. Im wirklichen Leben ist „Motorrad“ dasselbe wie „Motorrad“. Und „Britain“ und „Britain“ sind derselbe Ort. Ein Kleinbuchstabe ist einfach das Großbuchstabe-Äquivalent eines Großbuchstabens. Und lassen Sie mich nicht mit dem Sortieren diakritischer Zeichen beginnen. Verwenden Sie beim Erstellen einer Datenbank in MongoDB eine akzentunabhängige Sortierung und registrieren, die der Sprache entsprechen und Systembenutzerkultur. Dadurch wird das Durchsuchen von Zeichenfolgendaten erheblich vereinfacht.

Erstellen Sie Sammlungen mit großen Dokumenten

MongoDB hostet gerne große Dokumente mit bis zu 16 MB in Sammlungen GridFS Entwickelt für große Dokumente mit mehr als 16 MB. Aber nur weil dort große Dokumente abgelegt werden können, ist es keine gute Idee, sie dort aufzubewahren. MongoDB funktioniert am besten, wenn Sie einzelne Dokumente mit einer Größe von einigen Kilobyte speichern und sie eher wie Zeilen in einer breiten SQL-Tabelle behandeln. Große Dokumente können zu Problemen führen Produktivität.

Erstellen von Dokumenten mit großen Arrays

Dokumente können Arrays enthalten. Am besten ist es, wenn die Anzahl der Elemente im Array weit von einer vierstelligen Zahl entfernt ist. Wenn einem Array häufig Elemente hinzugefügt werden, wächst es über das Dokument hinaus, in dem es enthalten ist, und dies muss der Fall sein Umzug, was bedeutet, dass es notwendig sein wird Aktualisieren Sie auch die Indizes. Bei der Neuindizierung eines Dokuments mit einem großen Array werden die Indizes häufig überschrieben, da ein Rekord, das seinen Index speichert. Diese Neuindizierung erfolgt auch beim Einfügen oder Löschen eines Dokuments.

MongoDB hat etwas namens "Füllfaktor", was Raum für das Wachstum von Dokumenten bietet, um dieses Problem zu minimieren.
Sie könnten denken, dass Sie auf die Array-Indizierung verzichten können. Leider kann das Fehlen von Indizes zu anderen Problemen führen. Da Dokumente von Anfang bis Ende gescannt werden, dauert die Suche nach Elementen am Ende des Arrays länger, und die meisten mit einem solchen Dokument verbundenen Vorgänge dauern auch länger langsam.

Vergessen Sie nicht, dass die Reihenfolge der Phasen in einer Aggregation wichtig ist

In einem Datenbanksystem mit einem Abfrageoptimierer sind die von Ihnen geschriebenen Abfragen Erklärungen dessen, was Sie erhalten möchten, und nicht, wie Sie es erhalten. Dieser Mechanismus funktioniert analog zur Bestellung im Restaurant: Normalerweise bestellt man einfach ein Gericht und gibt dem Koch keine detaillierten Anweisungen.

In MongoDB weisen Sie den Koch an. Beispielsweise müssen Sie sicherstellen, dass die Daten weitergeleitet werden reduce so früh wie möglich in der Pipeline verwenden $match и $project, und die Sortierung erfolgt erst danach reduceund dass die Suche genau in der von Ihnen gewünschten Reihenfolge erfolgt. Ein Abfrageoptimierer, der unnötige Arbeit eliminiert, Schritte optimal anordnet und Verknüpfungstypen auswählt, kann Sie verwöhnen. Mit MongoDB haben Sie mehr Kontrolle auf Kosten der Bequemlichkeit.

Werkzeuge wie Studio 3T vereinfacht die Erstellung von Aggregationsabfragen in MongoDB. Mit der Aggregationseditor-Funktion können Sie Pipeline-Anweisungen stufenweise anwenden und Eingabe- und Ausgabedaten in jeder Stufe überprüfen, um das Debuggen zu vereinfachen.

Verwenden der Schnellaufnahme

Stellen Sie die MongoDB-Schreiboptionen niemals auf hohe Geschwindigkeit, aber geringe Zuverlässigkeit ein. Dieser Modus „Ablegen und vergessen“ scheint schnell zu sein, da der Befehl zurückgegeben wird, bevor der Schreibvorgang erfolgt. Wenn das System abstürzt, bevor die Daten auf die Festplatte geschrieben wurden, gehen diese verloren und befinden sich in einem inkonsistenten Zustand. Glücklicherweise ist in der 64-Bit-Version von MongoDB die Protokollierung aktiviert.

Die MMAPv1- und WiredTiger-Speicher-Engines verwenden Protokollierung, um dies zu verhindern, obwohl WiredTiger eine Wiederherstellung auf die letzte Konsistenz durchführen kann Kontrollpunkt, wenn die Protokollierung deaktiviert ist.

Durch das Journaling wird sichergestellt, dass sich die Datenbank nach der Wiederherstellung in einem konsistenten Zustand befindet, und alle Daten bleiben erhalten, bis sie in das Journal geschrieben werden. Die Häufigkeit der Aufzeichnungen wird über den Parameter konfiguriert commitIntervalMs.

Um die Einträge sicherzustellen, stellen Sie sicher, dass die Protokollierung in der Konfigurationsdatei aktiviert ist (storage.journal.enabled), und die Häufigkeit der Aufzeichnungen entspricht der Menge an Informationen, deren Verlust Sie sich leisten können.

Sortieren ohne Index

Beim Suchen und Aggregieren besteht häufig die Notwendigkeit, Daten zu sortieren. Hoffen wir, dass dies in einer der letzten Phasen geschieht, nachdem das Ergebnis gefiltert wurde, um die Menge der zu sortierenden Daten zu reduzieren. Und selbst in diesem Fall benötigen Sie zum Sortieren Index. Sie können einen einzelnen oder zusammengesetzten Index verwenden.

Gibt es keinen passenden Index, verzichtet MongoDB darauf. Für die Gesamtgröße aller Dokumente gilt eine Speicherbeschränkung von 32 MB Sortiervorgänge, und wenn MongoDB dieses Limit erreicht, gibt es entweder einen Fehler aus oder kehrt zurück leerer Datensatz.

Suche ohne Indexunterstützung

Suchanfragen führen eine ähnliche Funktion wie die JOIN-Operation in SQL aus. Um optimal zu funktionieren, benötigen sie den Index des Werts des Schlüssels, der als Fremdschlüssel verwendet wird. Dies ist nicht offensichtlich, da sich die Verwendung darin nicht widerspiegelt explain(). Solche Indizes werden zusätzlich zum eingeschriebenen Index aufgeführt explain(), das wiederum von Pipelinebetreibern genutzt wird $match и $sort, wenn sie sich am Anfang der Pipeline treffen. Indizes können nun jede Stufe abdecken Aggregationspipeline.

Deaktivierung der Verwendung von Multi-Updates

Verfahren db.collection.update() Wird verwendet, um einen Teil eines vorhandenen Dokuments oder das gesamte Dokument zu ändern, bis hin zu einer vollständigen Ersetzung, je nach dem von Ihnen angegebenen Parameter update. Was nicht so offensichtlich ist, ist, dass nicht alle Dokumente in der Sammlung verarbeitet werden, es sei denn, Sie aktivieren die Option multi um alle Dokumente zu aktualisieren, die den Anforderungskriterien 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 Name/Wert-Paaren der Größe Null oder mehr, wobei Name eine Zeichenfolge und Wert eine Zeichenfolge, eine Zahl, ein Boolescher Wert, ein Nullwert, ein Objekt oder ein Array ist.

Leider legt BSON bei der Suche großen Wert auf Ordnung. In MongoDB die Reihenfolge der Schlüssel innerhalb integrierter Objekte AngelegenheitenDh { firstname: "Phil", surname: "factor" } - ist nicht dasselbe wie { { surname: "factor", firstname: "Phil" }. Das heißt, Sie müssen die Reihenfolge der Name/Wert-Paare in Ihren Dokumenten speichern, wenn Sie sicher sein möchten, dass sie gefunden werden.

Verwechseln Sie nicht "Null" и "nicht definiert"

Wert "nicht definiert" war laut JSON nie gültig offizieller Standard JSON (ECMA-404 Abschnitt 5), auch wenn es in JavaScript verwendet wird. Darüber hinaus ist es für BSON veraltet und wird in umgewandelt $null, was nicht immer eine gute Lösung ist. Vermeide das Benutzen "nicht definiert" in MongoDB.

Verwenden $limit() без $sort()

Wenn Sie in MongoDB entwickeln, ist es oft nützlich, nur ein Beispiel des Ergebnisses zu sehen, das von einer Abfrage oder Aggregation zurückgegeben wird. Für diese Aufgabe benötigen Sie $limit(), aber es sollte niemals im endgültigen Code enthalten sein, es sei denn, Sie verwenden es zuvor $sort. Diese Mechanik ist notwendig, da Sie sonst die Reihenfolge des Ergebnisses nicht garantieren können und die Daten nicht zuverlässig anzeigen können. Oben im Ergebnis erhalten Sie je nach Sortierung unterschiedliche Einträge. Um zuverlässig zu funktionieren, müssen Abfragen und Aggregationen deterministisch sein, das heißt, sie müssen bei jeder Ausführung die gleichen Ergebnisse liefern. Code, der enthält $limit(), aber nein $sort, ist nicht deterministisch und kann in der Folge Fehler verursachen, die schwer aufzuspüren sind.

Abschluss

Die einzige Möglichkeit, von MongoDB enttäuscht zu werden, besteht darin, es direkt mit einem anderen Datenbanktyp, beispielsweise einem DBMS, zu vergleichen oder es aufgrund bestimmter Erwartungen zu verwenden. Es ist, als würde man eine Orange mit einer Gabel vergleichen. Datenbanksysteme dienen bestimmten Zwecken. Es ist am besten, diese Unterschiede einfach selbst zu verstehen und zu schätzen. Es wäre eine Schande, die MongoDB-Entwickler auf einen Weg zu zwingen, der sie dazu zwingt, den DBMS-Weg einzuschlagen. Ich möchte neue und interessante Wege sehen, um alte Probleme zu lösen, wie zum Beispiel die Gewährleistung der Datenintegrität und die Schaffung von Datensystemen, die widerstandsfähig gegenüber Ausfällen und böswilligen Angriffen sind.

Die Einführung der ACID-Transaktionalität durch MongoDB in Version 4.0 ist ein gutes Beispiel für die Einführung wichtiger Verbesserungen auf innovative Weise. Transaktionen mit mehreren Dokumenten und mehreren Kontoauszügen sind jetzt atomar. Es ist auch möglich, die Zeit anzupassen, die zum Erlangen von Sperren und zum Beenden blockierter Transaktionen erforderlich ist, sowie die Isolationsstufe zu ändern.

14 Dinge, die ich gerne wüsste, bevor ich mit MongoDB anfing

Weiterlesen:

Source: habr.com

Kommentar hinzufügen