sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cuándo usar GridFS en MongoDB?

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.