Wie behandelt man das Löschen der Datenbank in Mongodb?

8

Ich benutze mongodb zum Speichern von 30-Tage-Daten, die mir als Stream kommen. Ich suche nach einem Reinigungsmechanismus, mit dem ich die ältesten Daten wegwerfen kann, um Platz für neue Daten zu schaffen. Ich benutzte mysql, in dem ich diese Situation mit Partitionen behandelte. Ich habe 30 Partitionen behalten, die auf dem Datum basieren. Ich lösche die älteste datierte Partition und erstellte eine neue Partition, um neue Daten zu speichern.

Wenn ich die gleiche Sache in mongodb abbilde, habe ich das Gefühl, eine datumsbasierte "Scherbe" zu verwenden. Aber das Problem ist, dass es meine Datenverteilung schlecht macht. Wenn sich alle neuen Daten im selben Shard befinden, ist dieser Shard so heiß, dass viele Leute darauf zugreifen und die Shards mit älteren Daten weniger von Benutzern geladen werden.

Ich kann eine sammlungbasierte Bereinigung verwenden. Ich kann 30 Sammlungen haben und ich kann die älteste Sammlung wegwerfen, um neue Daten unterzubringen. Aber ein paar Probleme sind 1) Wenn ich Sammlungen kleiner mache, kann ich nicht viel davon profitieren, wie sie pro Kollektion gesammelt werden. 2) Meine Abfragen müssen sich ändern, um von allen 30 Sammlungen abzufragen und eine Vereinigung zu nehmen.

Bitte schlagen Sie mir einen guten Reinigungsmechanismus (falls vorhanden) vor, um mit dieser Situation fertig zu werden.

    
user472402 18.01.2012, 04:53
quelle

3 Antworten

9

Es gibt wirklich nur drei Möglichkeiten, um in MongoDB zu bereinigen. Es sieht so aus, als ob Sie bereits mehrere Kompromisse gefunden haben.

  1. Einzelne Sammlung, alte Einträge löschen
  2. Sammlung pro Tag, alte Sammlungen löschen
  3. Datenbank pro Tag, alte Datenbanken löschen

Option # 1: einzelne Sammlung

Profis

  • Einfach zu implementieren
  • Einfach zu bedienende Map / Reduces

Nachteile

  • Löschvorgänge sind so teuer wie Einfügungen, verursachen viel IO und die Notwendigkeit, die DB zu "defragmentieren" oder "zu verdichten".
  • An einem bestimmten Punkt behandeln Sie die doppelten "Schreibvorgänge", da Sie sowohl einfügen Daten eines Tages als auch löschen Daten pro Tag einfügen müssen.

Option # 2: Sammlung pro Tag

Profis

  • Das Entfernen von Daten über collection.drop() ist sehr schnell.
  • Standbild / Reduzieren, da die Ausgabe von jedem Tag mit den Zusammenfassungsdaten zusammengeführt oder reduziert werden kann.

Nachteile

  • Sie haben möglicherweise noch einige Fragmentierungsprobleme.
  • Sie müssen Abfragen neu schreiben. Nach meiner Erfahrung greifen Sie jedoch nur selten direkt auf diese Daten zu, wenn Sie über genügend Daten verfügen, die Sie bereinigen. Stattdessen neigen Sie dazu, Map / Reduces über diese Daten auszuführen. Das ändert vielleicht nicht das viele Abfragen.

Option # 3: Datenbank pro Tag

Profis

  • Löschen ist so schnell wie möglich, Dateien werden einfach abgeschnitten.
  • Zero Fragmentierung Probleme und einfach zu sichern / wiederherstellen / archivieren alter Daten.

Nachteile

  • Wird die Abfrage schwieriger machen ( erwarten, dass Sie einen Wrapper-Code schreiben ).
  • Map / Reduce ist nicht so einfach zu schreiben, aber werfen Sie einen Blick auf das Aggregation Framework, da es Ihre Anforderungen sowieso besser erfüllen kann.

Jetzt gibt es eine Option # 4, aber es ist keine allgemeine Lösung. Ich kenne einige Leute, die "gereinigt" haben, indem sie einfach Capped Collections verwendet haben. Es gibt definitiv Fälle, in denen das funktioniert, aber es hat eine Reihe von Vorbehalten, so dass Sie wirklich wissen müssen, was Sie tun.

    
Gates VP 18.01.2012 07:41
quelle
5

wir können TTL für die Sammlung von mongodb 2.2 Release oder höher setzen. Dies wird Ihnen helfen, alte Daten aus der Sammlung zu verfallen.

Folgen Sie diesem Link: Ссылка

    
geek 17.11.2012 23:26
quelle
0

Ich hatte eine ähnliche Situation und diese Seite hat mir geholfen, besonders der Abschnitt "Hilfreiche Skripte" unten. Ссылка

    
Paul Gregoire 05.11.2012 22:09
quelle

Tags und Links