2017-05-18 1 views
0

Nous avons une application en production qui utilise MongoDB (version 3.4) comme magasin de données principal. Nous utilisons intensivement GridFS et pendant que la base de données est en croissance nous avons des problèmes significatifs avec sa taille. Nous avons cca. 8000 fichiers téléchargés dans GridFS (en utilisant le pilote Java) ... la somme des longueurs de fichier est d'environ 30 Go, mais la base de données a une taille de 350 Go ... donc son 10 fois plus grand. Nous ne pouvons pas voir de raison, sauf la chose chunkSize. Nous avons plusieurs gros fichiers en db mais la plupart des fichiers sont plus petits que les 256kB chunkSize par défaut voir l'exemple ci-dessous.GridFS et chunkSize - notre base de données GridFS est trop grande par rapport aux données/fichiers réels stockés

J'ai lu quelques discussions qui disent ne vous inquiétez pas à ce sujet, le stockage réel ne prend que la taille du fichier plus quelques octets. Mais ça ne ressemble pas à notre base de données. Quelqu'un peut-il confirmer comment cela devrait fonctionner? Nous avons une réplique avec des esclaves où la taille de la base de données est également de 350 Go, donc cela ne semble pas être un problème de corruption de la base de données. Nous avons essayé quelques nettoyages de bases de données ... mais pas moyen.

{ 
    "_id" : ObjectId("572c6877f0ea0bbab3b67015"), 
    "metadata" : { 
     "id" : "F735ADCACB662DD5C1257FAB0023B5CC", 
     "name" : "file" 
    }, 
    "filename" : "1150228.jpg", 
    "aliases" : null, 
    "chunkSize" : NumberLong(261120), 
    "uploadDate" : ISODate("2016-05-06T09:48:39.136Z"), 
    "length" : NumberLong(36368), 
    "contentType" : null, 
    "md5" : "fd3393af027e0f1ff799ac4b1c117d58" 
} 

EDIT 1: Je l'ai mongofiles -d database list dans le fichier et openned dans Excel et SUMED jusqu'à la taille des fichiers, montre 35GB.

SOLVED: je courais proposé commande mongo --quiet --eval 'db.fs.chunks.aggregate([{$group:{_id: "$files_id", chunks: {$sum: 1}}}]).forEach(function(f){print(f._id + "\t" + f.chunks)})' pour agréger morceau collection par file_id et le nombre de morceaux liés. Dans le fichier long, j'ai trouvé juste un objet avec plus de 20 millions de morceaux et cela a causé le problème. Maintenant il est assez facile de supprimer tous ces morceaux, puis réduire la base de données ...

+0

Que 'db.stats()' dit en termes de dataSize, storageSize, fileSize? Par "nettoyages", vous voulez dire "compact" et "réparer"? –

+0

J'ai décrit les détails dans le post ici http://stackoverflow.com/questions/43070555/gridfs-chunks-collection-shows-big-storagesize-comparing-to-real-data-stored il y a quelques semaines sans réponse. Et la base de données est en croissance ... –

+0

'mongo --quiet --eval 'db.fs.chunks.aggregate ([{$ groupe: {_id:" $ files_id ", morceaux: {$ sum: 1}}}]) .forEach (fonction (f) {print (f._id + "\ t" + f.chunks)}) '' sort un tsv de l'identifiant du fichier et du nombre de morceaux. Vérifiez si le nombre de fichiers correspond et si le nombre total de morceaux et la taille du bloc correspondent. –

Répondre

0

je courais commande proposé

mongo --quiet --eval 'db.fs.chunks.aggregate([{$group:{_id: "$files_id", chunks: {$sum: 1}}}]).forEach(function(f){print(f._id + "\t" + f.chunks)})' 

à la collecte de morceaux par agrégats file_id et le nombre de morceaux liés. Dans le fichier long, j'ai trouvé juste un objet avec plus de 20 millions de morceaux et cela a causé le problème. Maintenant, il est assez facile de supprimer tous ces morceaux, puis de réduire la base de données ...