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

MongoDB como almacenamiento de archivos

Solo puedo responder por MongoDB aquí, no pretenderé que sé mucho sobre HDFS y otras tecnologías similares.

La implementación de GridFs es totalmente del lado del cliente dentro del propio controlador. Esto significa que no hay una carga o comprensión especial del contexto del servicio de archivos dentro de MongoDB, efectivamente MongoDB en sí mismo ni siquiera entiende que son archivos ( http://docs.mongodb.org/manual/applications/gridfs/ ).

Esto significa que consultar cualquier parte de los files o chunks la colección resultará en el mismo proceso que para cualquier otra consulta, por lo que carga los datos que necesita en su conjunto de trabajo ( http://en.wikipedia.org/wiki/Working_set ) que representa un conjunto de datos (o todos datos cargados en ese momento) requerido por MongoDB dentro de un marco de tiempo determinado para mantener un rendimiento óptimo. Lo hace al paginarlo en la RAM (bueno, técnicamente lo hace el sistema operativo).

Otro punto a tener en cuenta es que se trata de un controlador implementado. Esto significa que la especificación puede variar, sin embargo, no creo que lo haga. Todos los controladores le permitirán consultar un conjunto de documentos de los files colección que solo alberga los metadatos de los archivos, lo que le permite servir más tarde el archivo en sí desde los chunks colección con una sola consulta.

Sin embargo, eso no es lo importante, desea servir el archivo en sí, incluidos sus datos; esto significa que estarás cargando los files colección y sus subsiguientes chunks colección en su conjunto de trabajo.

Con eso en mente, ya hemos topado con el primer inconveniente:

¿Se almacenarán en caché los archivos de gridfs en RAM y cómo afectará el rendimiento de lectura y escritura?

El rendimiento de lectura de archivos pequeños podría ser increíble, directamente desde la RAM; las escrituras serían igual de buenas.

Para archivos más grandes, no tanto. La mayoría de las computadoras no tendrán 600 GB de RAM y, de hecho, es bastante normal albergar una partición de 600 GB de un solo archivo en un solo mongod instancia. Esto crea un problema ya que ese archivo, para ser servido, debe caber en su conjunto de trabajo, sin embargo, es imposiblemente más grande que su RAM; en este punto, podría tener una hiperpaginación ( http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29 ) en la que el servidor solo falla en la página las 24 horas del día, los 7 días de la semana, tratando de cargar el archivo. Las escrituras aquí tampoco son mejores.

La única forma de evitar esto es comenzar a colocar un solo archivo en muchos fragmentos :\ .

Nota:una cosa más a considerar es que el tamaño promedio predeterminado de un chunks "trozo" tiene 256 KB, por lo que son muchos documentos para un archivo de 600 GB. Esta configuración es manipulable en la mayoría de los controladores.

¿Qué sucederá con gridfs cuando intento escribir algunos archivos al mismo tiempo? ¿Habrá algún bloqueo para las operaciones de lectura/escritura? (Lo usaré solo como almacenamiento de archivos)

GridFS, al ser solo una especificación, utiliza los mismos bloqueos que en cualquier otra colección, bloqueos de lectura y escritura a nivel de base de datos (2.2+) o a nivel global (anterior a 2.2). Los dos también interfieren entre sí, es decir, ¿cómo puede garantizar una lectura coherente de un documento en el que se está escribiendo?

Dicho esto, existe la posibilidad de contención en función de las especificaciones de su escenario, el tráfico, la cantidad de escrituras/lecturas simultáneas y muchas otras cosas de las que no tenemos idea.

¿Quizás hay otras soluciones que pueden resolver mi problema de manera más eficiente?

Personalmente, descubrí que S3 (como dijo @mluggy) en formato de redundancia reducida funciona mejor almacenando una mera porción de metadatos sobre el archivo dentro de MongoDB, muy parecido a usar GridFS pero sin la recopilación de fragmentos, deje que S3 maneje toda esa distribución, copia de seguridad y otras cosas para ti.

Espero haber sido claro, espero que ayude.

Editar:a diferencia de lo que dije accidentalmente, MongoDB no tiene un bloqueo de nivel de colección, es un bloqueo de nivel de base de datos.