Wenn Sie Ihre Datendateien nicht verkleinern müssen, sollten Sie sie überhaupt nicht verkleinern. Dies liegt daran, dass das „Vergrößern“ Ihrer Datendateien auf der Festplatte ein ziemlich teurer Vorgang ist und je mehr Speicherplatz MongoDB in Datendateien zuweisen kann, desto weniger Fragmentierung werden Sie haben.
Sie sollten also versuchen, so viel Speicherplatz wie möglich für die Datenbank bereitzustellen.
Allerdings Wenn Sie die Datenbank verkleinern müssen, sollten Sie zwei Dinge beachten.
-
MongoDB vergrößert seine Datendateien durch Verdoppelung, sodass die Datendateien 64 MB, dann 128 MB usw. bis zu 2 GB groß sein können (an diesem Punkt hört es auf, Dateien zu verdoppeln, um Dateien bis 2 GB zu behalten.)
-
Wie bei den meisten Datenbanken ... müssen Sie für Aufgaben wie das Verkleinern einen separaten Job planen, es gibt kein "automatisches Verkleinern" in MongoDB. Tatsächlich wird von den großen NoSQL-Datenbanken (hasse diesen Namen) nur Riak automatisch verkleinert. Sie müssen also mit dem Planer Ihres Betriebssystems einen Job erstellen, um eine Verkleinerung auszuführen. Sie könnten ein Bash-Skript verwenden oder einen Job ein PHP-Skript ausführen lassen usw.
Serverseitiges Javascript
Sie können serverseitiges Javascript verwenden, um das Schrumpfen durchzuführen, und dieses JS über Mongos Shell regelmäßig über einen Job (wie Cron oder den Windows-Planungsdienst) ausführen ...
Angenommen eine Sammlung namens foo Sie würden das folgende Javascript in einer Datei namens bar.js speichern und führe ...
aus$ mongo foo bar.js
Die Javascript-Datei würde in etwa so aussehen ...
// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();
print('Storage Size: ' + tojson(storage));
print('TotalSize: ' + tojson(total));
print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');
// Run repair
db.repairDatabase()
// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();
print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));
Dies wird ausgeführt und gibt etwas wie ...
zurückMongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Führen Sie dies nach einem Zeitplan aus (außerhalb der Stoßzeiten) und Sie können loslegen.
Begrenzte Sammlungen
Es gibt jedoch eine andere Option, gedeckelte Sammlungen .
Grundsätzlich können Sie die Größe (oder Anzahl der Dokumente in ) einer Sammlung auf 20 GB begrenzen, und sobald diese Grenze erreicht ist, beginnt MongoDB, die ältesten Datensätze zu verwerfen und sie durch neuere Einträge zu ersetzen, sobald sie eintreffen.
Dies ist eine großartige Möglichkeit, eine große Datenmenge aufzubewahren, die älteren Daten im Laufe der Zeit zu verwerfen und die gleiche Menge an belegtem Speicherplatz beizubehalten.