GridFS es una abstracción simple del sistema de archivos sobre MongoDB. Si está familiarizado con Amazon S3, GridFS es una abstracción muy similar. Ahora, ¿por qué una base de datos orientada a documentos como MongoDB proporciona una abstracción de capa de archivo? Resulta que hay muy buenas razones:
-
Almacenamiento de contenido de archivo generado por el usuario
Una gran cantidad de aplicaciones web permiten a los usuarios cargar archivos. Históricamente, cuando se trabaja con bases de datos relacionales, estos archivos generados por el usuario se almacenan en el sistema de archivos separado de la base de datos. Esto crea una serie de problemas. ¿Cómo replicar los archivos a todos los servidores necesarios? ¿Cómo eliminar todas las copias cuando se elimina el archivo? ¿Cómo hacer una copia de seguridad de los archivos por seguridad y recuperación ante desastres? GridFS resuelve estos problemas para el usuario almacenando los archivos junto con la base de datos, y puede aprovechar la copia de seguridad de su base de datos para hacer una copia de seguridad de sus archivos. Además, debido a la replicación de MongoDB, se almacena una copia de sus archivos en cada réplica. Eliminar el archivo es tan fácil como eliminar un objeto en la base de datos.
-
Acceder a partes del contenido del archivo
Cuando se carga un archivo en GridFS, el archivo se divide en fragmentos de 256k y se almacena por separado. Entonces, cuando necesita leer solo un cierto rango de bytes del archivo, solo esos fragmentos se llevan a la memoria y no el archivo completo. Esto es extremadamente útil cuando se trata de contenido multimedia de gran tamaño que debe leerse o editarse de forma selectiva.
-
Almacenamiento de documentos de más de 16 MB en MongoDB
De forma predeterminada, el tamaño del documento de MongoDB tiene un límite de 16 MB. Por lo tanto, si tiene documentos que superan los 16 MB, puede almacenarlos con GridFS.
-
Superar las limitaciones del sistema de archivos
Si está almacenando una gran cantidad de archivos, deberá considerar las limitaciones del sistema de archivos, como la cantidad máxima de archivos/directorios, etc. Con GridFS, no No debe preocuparse por los límites del sistema de archivos. Además, con la fragmentación de GridFS y MongoDB, puede distribuir sus archivos entre diferentes servidores sin aumentar significativamente la complejidad operativa.
GridFS:detrás de escena
GridFS usa dos colecciones para almacenar los datos:
> show collections; fs.chunks fs.files system.indexes >
Las colecciones fs.files contienen metadatos sobre los archivos, y las colecciones fs.chunks almacenan los fragmentos reales de 256k. Si tiene una colección fragmentada, los fragmentos se distribuyen en diferentes servidores y puede obtener un mejor rendimiento que un sistema de archivos.
> 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 también crea un índice compuesto en files_id y el número de fragmento para ayudar a acceder rápidamente a los fragmentos:
> 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" } ] >
Ejemplos de MongoDB GridFS
MongoDB tiene una utilidad integrada llamada "mongofiles" para ayudar a ejercitar los escenarios de GridFS. Consulte la documentación de su controlador sobre cómo usar GridFS con su controlador.
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!
Módulos de GridFS
Si desea servir los datos de archivo almacenados en MongoDB directamente desde su servidor web o sistema de archivos, hay varios módulos de complemento de GridFS disponibles:
- GridFS-Fuse:conecta GridFS al sistema de archivos
- GridFS-Nginx:complemento para servidores de archivos GridFS directamente desde Nginx
Limitaciones de GridFS
-
Conjunto de trabajo
Servir archivos junto con el contenido de su base de datos puede agitar significativamente su conjunto de trabajo de memoria. Si no desea perturbar su conjunto de trabajo, podría ser mejor servir sus archivos desde un servidor MongoDB diferente.
-
Rendimiento
El rendimiento del servicio de archivos será más lento que el servicio nativo del archivo desde su servidor web y sistema de archivos. Sin embargo, los beneficios administrativos adicionales pueden valer la pena.
-
Actualización atómica
GridFS no proporciona una forma de realizar una actualización atómica de un archivo. Si este escenario es necesario, deberá mantener varias versiones de sus archivos y elegir la versión correcta.