GridFS est une abstraction simple du système de fichiers au-dessus de MongoDB. Si vous connaissez Amazon S3, GridFS est une abstraction très similaire. Maintenant, pourquoi une base de données orientée document comme MongoDB fournit-elle une abstraction de la couche fichier ? Il s'avère qu'il y a de très bonnes raisons :
-
Stocker le contenu des fichiers générés par l'utilisateur
Un grand nombre d'applications Web permettent aux utilisateurs de télécharger des fichiers. Historiquement, lorsque vous travaillez avec des bases de données relationnelles, ces fichiers générés par l'utilisateur sont stockés sur le système de fichiers séparé de la base de données. Cela crée un certain nombre de problèmes. Comment répliquer les fichiers sur tous les serveurs nécessaires ? Comment supprimer toutes les copies lorsque le fichier est supprimé ? Comment sauvegarder les fichiers pour la sécurité et la reprise après sinistre ? GridFS résout ces problèmes pour l'utilisateur en stockant les fichiers avec la base de données, et vous pouvez tirer parti de la sauvegarde de votre base de données pour sauvegarder vos fichiers. De plus, en raison de la réplication MongoDB, une copie de vos fichiers est stockée dans chaque réplique. La suppression du fichier est aussi simple que la suppression d'un objet dans la base de données.
-
Accéder à des parties du contenu du fichier
Lorsqu'un fichier est téléchargé sur GridFS, le fichier est divisé en morceaux de 256 ko et stocké séparément. Ainsi, lorsque vous devez lire uniquement une certaine plage d'octets du fichier, seuls ces morceaux sont mis en mémoire et non le fichier entier. Ceci est extrêmement utile lorsqu'il s'agit de contenu multimédia volumineux qui doit être lu ou modifié de manière sélective.
-
Stocker des documents de plus de 16 Mo dans MongoDB
Par défaut, la taille du document MongoDB est limitée à 16 Mo. Ainsi, si vous avez des documents de plus de 16 Mo, vous pouvez les stocker à l'aide de GridFS.
-
Surmonter les limitations du système de fichiers
Si vous stockez un grand nombre de fichiers, vous devrez tenir compte des limitations du système de fichiers comme le nombre maximum de fichiers/répertoires, etc. Avec GridFS, vous ne Vous n'avez pas à vous soucier des limites du système de fichiers. De plus, avec le partage GridFS et MongoDB, vous pouvez répartir vos fichiers sur différents serveurs sans augmenter de manière significative la complexité opérationnelle.
GridFS – Dans les coulisses
GridFS utilise deux collections pour stocker les données :
> ; afficher les collections;fs.chunksfs.filessystem.indexes>
Les collections fs.files contiennent des métadonnées sur les fichiers, et les collections fs.chunks stockent les blocs réels de 256 k. Si vous avez une collection fragmentée, les morceaux sont répartis sur différents serveurs et vous obtiendrez peut-être de meilleures performances qu'un système de fichiers !
> ; db.fs.files.findOne();{"_id" :ObjectId("530cf1bf96038f5cb6df5f39"),"filename" :"./conn.log","chunkSize" :262144,"uploadDate" :ISODate("2014-02 -25T19:40:47.321Z"),"md5" :"6515e95f8bb161f6435b130a0e587ccd","longueur" :1644981}>
MongoDB crée également un index composé sur files_id et le numéro de bloc pour aider à accéder rapidement aux blocs :
> ; db.fs.chunks.getIndexes();[{"v" :1,"key" :{"_id" :1},"ns" :"files.fs.chunks","name" :"_id_"} ,{"v" :1,"key" :{"files_id" :1,"n" :1},"ns" :"files.fs.chunks","name" :"files_id_1_n_1"}]>Exemples MongoDB GridFS
MongoDB dispose d'un utilitaire intégré appelé "mongofiles" pour aider à tester les scénarios GridFS. Veuillez vous référer à la documentation de votre pilote pour savoir comment utiliser GridFS avec votre pilote.
Put#mongofiles -h -u -p --db files put /conn.logconnected to :127.0.0.1added file:{ _id:ObjectId('530cf1009710ca8fd47d7d5d'), filename:"./conn.log", chunkSize :262144, uploadDate :new Date(1393357057021), md5 :"6515e95f8bb161f6435b130a0e587ccd", longueur :1644981 } done!Get#mongofiles -h -u -p --db files get /conn.logconnected to :127.0.0.1done ./conn.logList# mongofiles -h -u -p listconnected to:127.0.0.1/conn.log 1644981Delete[root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files supprimez /conn.logconnected à :127.0.0.1done !Modules GridFS
Si vous souhaitez servir les données de fichiers stockées dans MongoDB directement à partir de votre serveur Web ou système de fichiers, plusieurs modules de plug-in GridFS sont disponibles :
- GridFS-Fuse – Plugin GridFS dans le système de fichiers
- GridFS-Nginx - Plug-in pour le serveur de fichiers GridFS directement à partir de Nginx
Limites de GridFS
-
Ensemble de travail
Servir des fichiers avec le contenu de votre base de données peut considérablement altérer votre ensemble de travail de mémoire. Si vous ne souhaitez pas perturber votre ensemble de travail, il peut être préférable de servir vos fichiers à partir d'un autre serveur MongoDB.
-
Performances
Les performances de traitement du fichier seront plus lentes que le traitement natif du fichier à partir de votre serveur Web et de votre système de fichiers. Cependant, les avantages de gestion supplémentaires pourraient valoir le ralentissement.
-
Mise à jour atomique
GridFS ne fournit pas un moyen de faire une mise à jour atomique d'un fichier. Si ce scénario est nécessaire, vous devrez conserver plusieurs versions de vos fichiers et choisir la bonne version.