Wie werden Mongodb-Indizes auf der Festplatte gespeichert?

7

Lassen Sie mich zunächst die Frage mit meinem Verständnis beginnen, wie MongoDb Daten auf der Festplatte speichert: Wenn Sie also eine Datenbank in Mongodb erstellen, wird eine große Datei mit dem Namen <databasename>.0und in dieser Datei Bereiche zugewiesen, die zusammenhängende Bereiche sind, die Daten für eine bestimmte Datei entsprechen Sammlung oder bestimmter Index.

Sobald diese Datendatei gefüllt ist, wird eine neue Datei mit dem Namen erstellt <databasename>.1und auf ähnliche Weise gefüllt . Daher ist es sinnvoll anzunehmen, dass sich die zuletzt in eine bestimmte Datenbank eingefügten Daten in der Datei mit der höchsten Nummer befinden (und meine Leistungstests bestätigen dies).

Ich kann jedoch nicht sehen, wie dies für Indizes zutreffen könnte. Da es sich um einen bTree handelt, erscheint es nicht möglich / sinnvoll, diesen bTree auf dieselbe Weise über Dateien zu verteilen. Während Mongo die Wartung für einen Index durchführt, lebt der gesamte Index in einem Ausmaß, bis er über ihn hinauswächst. An diesem Punkt wird er in die aktuelle (am höchsten nummerierte Datendatei) verschoben.

Dies ist für mich wichtig geworden, da es beim Starten einer Datenbank über einen Amazon EBS-Snapshot einen enormen Aufwand für das Aufrufen dieser Datendateien gibt, bis sich das Volume erwärmt. Ich interessiere mich nur für eine Teilmenge der neuesten N Dokumente aus einer Sammlung. Wenn ich sicher sein könnte, dass ich nur die neuesten Datendateien benötige, könnte ich diese Dateien vorab starten, indem ich sie nacheinander lese, bevor ich mongod starte.

John Greenall
quelle

Antworten:

7

Die Verzögerung, die beim Laden aus einem Snapshot auftritt, hängt nicht davon ab, wie die Indizes auf der Festplatte angeordnet sind. Es ist weitaus wahrscheinlicher, dass die Verzögerung auftritt, da die Daten beim Starten einer Instanz aus einem Snapshot nur bei der ersten Verwendung geladen werden Dies ist eine grundlegende Einschränkung bei der Verwendung von Snapshots auf diese Weise und hat wirklich wenig mit der Anwendung zu tun, die versucht, auf die Festplatte zuzugreifen. Aus diesem Grund finden Sie Anleitungen zum Aufwärmen eines EBS-Volumes und dergleichen (auch beim ersten Schreiben gibt es Strafen). Wenn Sie dies tun (die Festplatte mit einer anderen Anwendung wie ddzum Beispiel aufwärmen ) und das Leistungsproblem verschwindet, haben Sie einen ziemlich guten Beweis dafür, dass das Layout der Daten nichts mit dem Problem zu tun hat.

In diesem Sinne verfügt MongoDB über den Befehl touch , mit dem Sie die Daten aufwärmen können, bevor Sie sie im Zorn verwenden (Sie können Daten, Daten und Indizes oder nur Indizes berühren). Nachdem Sie die Lautstärke zum ersten Mal angehängt haben, ist sie langsam und das Berühren wird eine Weile dauern. Zumindest nach dieser Aufwärmphase sollten Ihre Ergebnisse jedoch etwas konsistent sein.

In Bezug darauf, wie Dinge auf der Festplatte gespeichert werden, haben Sie die richtigen Grundlagen in Bezug auf die Dateizuordnung, aber es gibt eine logische Struktur innerhalb der Dateien, Extents, die die tatsächlichen Speichereinheiten sind. Dies und vieles mehr wird in dieser Präsentation von Mathias Stearn - einem der Kernel-Entwickler bei MongoDB - ausführlich behandelt .

Indizes sind nur eine andere (strukturierte) Form von Daten in MongoDB und werden in verknüpften Bereichen in der gesamten Datei gespeichert. Fragmentierung kann zu einem Problem werden (dafür ist der Befehl compact gedacht ), ebenso wie der verwendete Speicherplatz (der Reparaturbefehl wird zum Zurückfordern verwendet), aber Sie haben keine Arbeitslast beschrieben, die mich sofort glauben lässt, dass Sie auf ein Fragmentierungsproblem stoßen Warum ich vermute, dass etwas anderes (wie die Strafe für den ersten Gebrauch) Ihre Hauptursache ist.

Adam C.
quelle
Ich akzeptierte diese Antwort, da sie gut geschrieben war und mein Verständnis förderte. Ich glaube jedoch, dass die Speicherung von Indizes auf der Festplatte im EBS-Startszenario relevant ist, da die Erwärmung eines Volumes das Targeting bestimmter Dateien umfasst. Für die Aufzeichnung habe ich für meine Anwendung festgestellt, dass das Vorwärmen der letzten beiden Mongodb-Datendateien der relevanten Datenbank auf EBS (durch Kopieren nach / dev / null!) Eine anständige Beschleunigung gegenüber dem Start von Mongod Cold erzielt.
John Greenall
1
Sie würden alle relevanten Blöcke für Indizes treffen, indem Sie den Befehl touch mit der Option indexes verwenden, um alle Zweifel daran zu beseitigen, was Sie eingelagert haben. Wenn Sie genau sehen möchten, was es geschafft hat, sehen Sie sich dieses Tool an: eng.wish.com/mongomem-memory-usage-by-collection-in-mongodb
Adam C
Ah hat das verpasst. Top Tipp!
John Greenall