En général, si vous n'avez pas besoin de réduire vos fichiers de données, vous ne devriez pas les réduire du tout. En effet, la "croissance" de vos fichiers de données sur le disque est une opération assez coûteuse et plus MongoDB peut allouer d'espace aux fichiers de données, moins vous aurez de fragmentation.
Vous devez donc essayer de fournir autant d'espace disque que possible pour la base de données.
Cependant si vous devez réduire la base de données, vous devez garder deux choses à l'esprit.
-
MongoDB fait croître ses fichiers de données de la manière suivante doublement, donc les fichiers de données peuvent être 64 Mo, puis 128 Mo, etc. jusqu'à 2 Go (où il arrête de doubler pour point où il arrête de doubler pour conserver les fichiers jusqu'à 2 Go).
-
Comme avec la plupart des bases de données ... pour faire des opérations comme le rétrécissement, vous vous devez planifier un travail séparé pour le faire, il n'y a pas de "autoshrink" dans MongoDB. En fait, parmi les principales bases de données noSQL (je déteste ce nom), seul Riak permet l'autoshrink. Vous devrez donc créer une tâche en utilisant le planificateur de votre système d'exploitation pour exécuter un rétrécissement. Vous pourriez utiliser un bash script, ou faire exécuter par un job un php script, etc.
Javascript côté serveur
Vous pouvez utiliser le Javascript côté serveur pour effectuer le rétrécissement et exécuter ce JS via le shell de Mongo sur une base régulière par le biais d'un travail (comme cron ou le service de planification de Windows) ....
En supposant qu'une collection appelée foo vous devez sauvegarder le javascript ci-dessous dans un fichier appelé bar.js et courir ...
$ mongo foo bar.js
Le fichier javascript ressemblerait à quelque chose comme ...
// 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));
Cela va s'exécuter et retourner quelque chose comme ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Exécutez cette opération selon un calendrier (en dehors des heures de pointe) et vous êtes prêt à partir.
Collections plafonnées
Il existe toutefois une autre option, collections plafonnées .
Les collections plafonnées sont de taille fixe fixes qui ont une fonction de vieillissement performance de vieillissement automatique de l'OFI (le vieillissement est basé sur l'ordre d'insertion). Elles ressemblent un peu au concept de "RRD". si vous le connaissez.
En outre, les collectes plafonnées automatiquement, avec des performances élevées, maintiennent l'ordre d'insertion des objets de la collection, ce qui est très puissant pour certains cas d'utilisation comme la journalisation.
En gros, vous pouvez limiter la taille (ou le nombre de documents) d'une collection à, disons, 20 Go. Une fois cette limite atteinte, MongoDB commencera à jeter les enregistrements les plus anciens et à les remplacer par des entrées plus récentes au fur et à mesure qu'elles arrivent.
C'est un excellent moyen de conserver une grande quantité de données, en éliminant les anciennes au fur et à mesure que le temps passe et en conservant la même quantité d'espace disque utilisé.