GridFS è una semplice astrazione del file system su MongoDB. Se hai familiarità con Amazon S3, GridFS è un'astrazione molto simile. Ora, perché un database orientato ai documenti come MongoDB fornisce un'astrazione del livello di file? Si scopre che ci sono alcune ottime ragioni:
-
Memorizzazione del contenuto del file generato dall'utente
Un gran numero di applicazioni web consente agli utenti di caricare file. Storicamente, quando si lavora con database relazionali, questi file generati dagli utenti vengono archiviati nel file system separato dal database. Questo crea una serie di problemi. Come replicare i file su tutti i server necessari? Come eliminare tutte le copie quando il file viene eliminato? Come eseguire il backup dei file per la sicurezza e il ripristino di emergenza? GridFS risolve questi problemi per l'utente archiviando i file insieme al database e puoi sfruttare il backup del database per eseguire il backup dei file. Inoltre, a causa della replica di MongoDB, una copia dei tuoi file viene archiviata in ogni replica. Eliminare il file è facile come eliminare un oggetto nel database.
-
Accesso a parti del contenuto del file
Quando un file viene caricato su GridFS, il file viene suddiviso in blocchi di 256k e archiviato separatamente. Quindi, quando devi leggere solo un certo intervallo di byte del file, solo quei blocchi vengono portati in memoria e non l'intero file. Ciò è estremamente utile quando si tratta di contenuti multimediali di grandi dimensioni che devono essere letti o modificati in modo selettivo.
-
Memorizzazione di documenti di dimensioni superiori a 16 MB in MongoDB
Per impostazione predefinita, la dimensione del documento MongoDB è limitata a 16 MB. Quindi, se hai documenti di dimensioni superiori a 16 MB, puoi archiviarli utilizzando GridFS.
-
Superamento delle limitazioni del file system
Se stai archiviando un numero elevato di file, dovrai considerare le limitazioni del file system come il numero massimo di file/directory, ecc. Con GridFS, non Non è necessario preoccuparsi dei limiti del file system. Inoltre, con GridFS e MongoDB sharding, puoi distribuire i tuoi file su server diversi senza aumentare significativamente la complessità operativa.
GridFS:dietro le quinte
GridFS utilizza due raccolte per memorizzare i dati:
> show collections; fs.chunks fs.files system.indexes >
Le raccolte fs.files contengono metadati sui file e le raccolte fs.chunks memorizzano i 256k blocchi effettivi. Se hai una raccolta partizionata, i blocchi sono distribuiti su server diversi e potresti ottenere prestazioni migliori rispetto a un filesystem!
> db.fs.files.findOne(); { "_id" : ObjectId("530cf1bf96038f5cb6df5f39"), "filename" : "./conn.log", "chunkSize" : 262144, "uploadDate" : ISODate("2014-02-25T19:40:47.321Z"), "md5" : "6515e95f8bb161f6435b130a0e587ccd", "length" : 1644981 } >
MongoDB crea anche un indice composto su files_id e il numero del blocco per accedere rapidamente ai blocchi:
> 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" } ] >
Esempi MongoDB GridFS
MongoDB ha un'utilità integrata chiamata "mongofiles" per aiutare a esercitare gli scenari GridFS. Fare riferimento alla documentazione del driver su come utilizzare GridFS con il driver.
Put #mongofiles -h -u -p --db files put /conn.log connected to: 127.0.0.1 added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 } done! Get #mongofiles -h -u -p --db files get /conn.log connected to: 127.0.0.1 done write to: ./conn.log List # mongofiles -h -u -p list connected to: 127.0.0.1 /conn.log 1644981 Delete [root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files delete /conn.log connected to: 127.0.0.1 done!
Moduli GridFS
Se desideri servire i dati dei file archiviati in MongoDB direttamente dal tuo server Web o file system, sono disponibili diversi moduli plug-in GridFS:
- GridFS-Fuse – Plugin GridFS nel filesystem
- GridFS-Nginx - Plugin per i file GridFS del server direttamente da Nginx
Limitazioni GridFS
-
Set da lavoro
La pubblicazione di file insieme al contenuto del database può alterare notevolmente il set di lavoro della memoria. Se non desideri disturbare il tuo set di lavoro, potrebbe essere meglio servire i tuoi file da un server MongoDB diverso.
-
Prestazioni
Le prestazioni del servizio di file saranno più lente rispetto al servizio nativo del file dal tuo server web e filesystem. Tuttavia, i vantaggi di gestione aggiuntivi potrebbero valere il rallentamento.
-
Aggiornamento atomico
GridFS non fornisce un modo per eseguire un aggiornamento atomico di un file. Se questo scenario è necessario, dovrai mantenere più versioni dei tuoi file e scegliere la versione giusta.