¿GridFS es lo suficientemente rápido y confiable para la producción?

86

Desarrollo un nuevo sitio web y quiero usar GridFS como almacenamiento para todas las cargas de los usuarios, porque ofrece muchas ventajas en comparación con un almacenamiento de sistema de archivos normal.

Los puntos de referencia con GridFS servidos por nginx indican que no es tan rápido como un sistema de archivos normal servido por nginx.

Benchmark con nginx

¿Hay alguien que ya use GridFS en un entorno de producción o lo usaría para un nuevo proyecto?

Rieles mecánicos
fuente
1
Una publicación de blog sobre el almacenamiento de imágenes en mongodb para futuros buscadores que tuvieran una intención similar a la mía: menge.io/2015/03/24/storing-small-images-in-mongodb (compara GridFS con simplemente arrojarlo al documento como binario datos)
Hay muchas compensaciones a considerar al decidir si desea almacenar datos binarios en MongoDB; consulte: alexmarquardt.com/2017/03/02/…
Alexander Marquardt

Respuestas:

118

Utilizo gridfs en el trabajo en uno de nuestros servidores, que es parte de un sitio web de comparación de precios con estadísticas de tráfico honorables (alrededor de 25.000 visitantes por día). El servidor no tiene mucha memoria RAM, 2gigs, e incluso la CPU no es realmente rápida (Core 2 duo 1.8Ghz) pero el servidor tiene mucho espacio de almacenamiento: 10Tb (sata) en configuración raid 0. El trabajo que está haciendo el servidor es muy simple:

Cada producto en nuestro comparador de precios tiene una imagen (hay alrededor de 10 millones de productos según nuestro producto db), y el trabajo de los servidores es descargar la imagen, cambiar su tamaño, almacenarla en gridfs y entregarla al navegador de los visitantes. .. si no está presente en la cuadrícula ... o ... envíelo al navegador de los visitantes si ya está almacenado en la cuadrícula. Por lo tanto, esto podría denominarse como un "esquema cdn tradicional".

Hemos almacenado y procesado 4 millones de imágenes en este servidor desde que está en funcionamiento. El cambio de tamaño y almacenamiento se realiza mediante un simple script php ... pero seguro, un script de Python o algo como Java podría ser más rápido.

Tamaño de datos actual: 11,23g

Tamaño de almacenamiento actual: 12,5 g

Índices: 5

Tamaño del índice: 849,65 m

Acerca de la confiabilidad: esto es muy confiable. El servidor no se carga, el tamaño del índice está bien, las consultas son rápidas

Acerca de la velocidad: seguro, ¿no es rápido como almacenamiento de archivos local, quizás un 10% más lento, pero lo suficientemente rápido como para usarse en tiempo real incluso cuando la imagen necesita ser procesada, que en nuestro caso depende mucho de php? Los tiempos de mantenimiento y desarrollo también se han reducido: se volvió tan simple eliminar una o varias imágenes: simplemente consulte la base de datos con un simple comando de eliminación. Otra cosa interesante: cuando reiniciamos nuestro servidor anterior, con almacenamiento de archivos local (millones de archivos en miles de carpetas), a veces se cuelga durante horas porque el sistema estaba realizando una verificación de integridad de archivos (esto realmente tomó horas ...). Ya no tenemos este problema con gridfs, nuestras imágenes ahora se almacenan en grandes trozos de mongodb (archivos de 2gb)

Entonces ... en mi mente ... Sí, gridfs es lo suficientemente rápido y confiable como para usarse en producción.

Manu Eidenberger
fuente
9
Me sorprende que alguien use raid 0 como almacenamiento principal en un sitio web de producción. Incluso con buenas copias de seguridad, aumentar la probabilidad de una falla de almacenamiento es un precio bastante alto a pagar por un mejor rendimiento.
mikerobi
67
Usamos raid 0 porque en nuestro caso particular, los datos de la imagen pueden ser volátiles. No importa si la imagen se pierde, ya que la volveremos a descargar del sitio web del comerciante. De manera pragmática, podríamos considerar que nuestro servidor es un simple servidor de caché de imágenes.
Manu Eidenberger
Pero está aumentando activamente la posibilidad de falla (factor de falla inicial de la unidad multiplicado por la cantidad de ejes). Raid 10 sería ideal si necesita más escrituras que lecturas o Raid 5/6 si necesita más lecturas que escrituras.
NeuroScr
9
@ManuEidenberger ¿Por qué utiliza GridFS para almacenar imágenes que preferirían almacenar en un documento MongoDB? Supongo que no alcanzó el límite de tamaño de documento de 16 MB. Y almacenar la imagen como BLOB dentro de un documento MongoDB sería más eficiente, ya que no necesita la capa GridFS encima de los documentos MongoDB.
Arnaud Bouchez
1
También tengo curiosidad por la pregunta de @ ArnaudBouchez. ¿Hubo algún beneficio que le hizo elegir GridFS en lugar de simplemente almacenarlo como datos binarios en un documento, Manu? ¡Gracias!
12

Como se mencionó, puede que no sea tan rápido como un sistema de archivos ordinario, pero luego le brinda ventajas sobre los sistemas de archivos ordinarios por los que creo que vale la pena renunciar a un poco de velocidad.

En última instancia, con la fragmentación, sin embargo, puede llegar a un punto en el que el almacenamiento GridFS se convierte en la opción más rápida en comparación con un sistema de archivos ordinario y un solo nodo.

Tom
fuente
6

Sin embargo, esté atento a las reparaciones para bases de datos más grandes: un nuevo sistema que estamos desarrollando, mongo no salió limpiamente, y la reparación del GridFS de 7TB parece que llevará 130 horas.

Debido a esto, creo que consideraré cambiar a OpenStack Swift o Ceph. Aún así, hasta entonces estuvo bien. Y el módulo nginx-gridfs es genial.

Mella
fuente
Entonces, ¿cómo te fue?
Mukus
5

El módulo nginx-gridfs de mdirolf es excelente y bastante fácil de configurar. Lo estamos usando en producción en paint.ly para servir todas las pinturas y hasta ahora no ha habido problemas.

Schallis
fuente
3
paint.ly ya no está disponible, parece. :(
Marian
2

No recomiendo usar gridfs a menos que sepa lo que está haciendo. GridFS es solo una capa de abstracción que divide los archivos en trozos y almacena los archivos en dos colecciones. Más archivos, más gastos generales. Si espera que los archivos sean del mismo tamaño, que no superen los 32M o menos, está en el camino correcto. No intente almacenar archivos grandes en gridfs. ¿Por qué?

  1. Los controladores en diferentes idiomas pueden leer el archivo completo (por ejemplo, fragmentos) al leer la pequeña parte del archivo.
  2. La modificación del archivo puede afectar a todos los fragmentos y aumentar la carga de la base de datos. Si su sistema de archivos está creciendo, tendrá que decidir dividir el gridfs. ¡Ten cuidado! ¡La consistencia no está garantizada cuando se inicializa la fragmentación!

Si piensa en un proyecto cargado de lectura, considere cargar los archivos en documentos directamente (si es de 16M o menos) o elija otro clusterfs y vincule el nombre de archivo / inodo a su lógica.

Espero que esto ayude.

Vitaly Greck
fuente
4
Soy bastante nuevo en GridFS, aunque por lo que entiendo, GridFS es más que una simple capa de abstracción que duplica la cantidad de archivos. GridFS proporciona una forma sencilla de aprovechar las funciones de replicación y fragmentación de MongoDB. Creo que otros también han mencionado que los archivos se almacenan en trozos de 2GB, lo que imagino reduciría la cantidad total de archivos, especialmente si alguien tiene una gran cantidad de imágenes pequeñas.
+1 Tienes razón. Incluso los archivos más pequeños no se beneficiarían de almacenarse con GridFS. Si su archivo pudiera almacenarse en un documento MongoDB (es decir, <de su límite de tamaño de 16 MB), preferiría almacenar el archivo como BLOB dentro de un documento MongoDB. Evitará la sobrecarga de usar GridFS sobre el almacenamiento de MongoDB. Ver compose.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez