2010-05-23 15 views
30

Tengo una aplicación web que almacena una gran cantidad de archivos generados por el usuario. Actualmente, todos están almacenados en el sistema de archivos del servidor, lo que tiene varias desventajas para mí.Almacenamiento de archivos para aplicaciones web: Sistema de archivos vs DB vs motores NoSQL

  • cuando nos movemos "carpetas" (como se define por nuestra aplicación) también tenemos que mover los archivos en el disco (aunque esto es más debido a las decisiones de diseño extraños por parte de los desarrolladores originales que un requisito de almacenar cosas en el sistema de archivos).
  • Es difícil escribir pruebas para las acciones del sistema de archivos; Tengo una clase de sistema de archivos falso que registra acciones como mover, eliminar, etc., sin realizarlas, lo que hace más o menos el trabajo, pero no tengo 100% de confianza en las pruebas.
  • Agregaré algunos otros trabajos que necesitan acceder a los archivos de otro servicio para realizar tareas adicionales (por ejemplo, indexación en Solr, generación de miniaturas, conversión de formato de película), así que necesito acceder a los archivos de forma remota. Hacer esto a través de recursos compartidos de red parece dudoso ...
  • El manejo de permisos en el sistema de archivos nos da problemas en el pasado, aunque ahora que nos hemos movido a un entorno Linux puro esto debería ser un problema menor.

Por lo tanto, mis principales preguntas son

  • ¿Cuáles son las desventajas de almacenar archivos como BLOB en MySQL?
  • ¿Existen los mismos problemas con los sistemas NoSQL como Cassandra?
  • ¿Alguien tiene alguna otra sugerencia que pueda ser apropiada, p. MogileFS, etc.

Respuesta

7

No es una respuesta directa, pero algunos consejos para preguntas muy interesantes y de alguna manera similares (sí, se trata de blobs e imágenes, pero esto es IMO comparable).

¿Cuáles son los inconvenientes de almacenar archivos como BLOB en MySQL?

¿Existen los mismos problemas con los sistemas de NoSQL, como Cassandra?

PD: No quiero ser aguafiestas, pero no creo que cualquier solución NoSQL va a resolver su problema (NoSQL es sólo irrelevante para la mayoría de las empresas).

+0

Gracias, parece un conjunto de enlaces muy útil. El almacenamiento de imágenes/blobs de cualquier tipo es lo que busco (estamos almacenando todo tipo de cosas). –

+0

Gracias, sus enlaces sugeridos son geniales. Claramente necesito buscar más duro antes de hacer preguntas :) En conclusión, evitar el DB parece ser el camino a seguir. Solo necesito desacoplar la aplicación del sistema de archivos para que sea menos doloroso ... –

+0

Me alegra que los haya encontrado útiles. Y comparto esta conclusión. –

3

quizás una solución híbrida.

Use una base de datos para almacenar metadatos sobre cada archivo y use el sistema de archivos para almacenar el archivo.

cualquier reestructuración de 'carpetas' podría modelarse en la base de datos y desreferenciarse de la ubicación real del sistema operativo.

+0

Eso es lo que hacemos actualmente; la reestructuración de las carpetas debería, idealmente, desreferenciarse completamente de la ubicación real del sistema de archivos, pero los viejos desarrolladores se volcaron para vincularla en su lugar ... Me enfrento a una reescritura de algún modo, de todos modos, y Me pregunto si existe un enfoque adecuado que evite por completo el sistema de archivos. –

+0

¿cómo hace una desreferencia desde la ubicación del sistema operativo? – Erik

+0

desreferencia aquí significaría que la ubicación del sistema de archivos puede arreglarse en algún directorio, pero la base de datos tiene otra manera de etiquetar la ubicación que podría parecerse a una jerarquía de carpetas pero no es la misma que la física: luego están vinculados como algunos relación FK normal – Randy

0

Si el sistema operativo o la aplicación no necesita acceder a los archivos, entonces no es realmente necesario almacenar los archivos en el sistema de archivos. Si desea hacer una copia de seguridad de los archivos al mismo tiempo que hace una copia de seguridad de la base de datos, entonces hay menos ventajas de almacenarlos fuera de la base de datos. Por lo tanto, podría ser una solución válida para almacenar los archivos en la base de datos.

Una desventaja adicional es que el procesamiento de archivos en el db tiene más gastos generales que el procesamiento de archivos en el nivel del sistema de archivos. Sin embargo, siempre que las ventajas superen los inconvenientes, y parece que podría ser en su caso, podría intentarlo.

Mi principal preocupación sería la gestión del almacenamiento en disco. A medida que los archivos de su base de datos crecen, la administración de toda su base de datos se vuelve más complicada. No quieres salir de la sartén y entrar al fuego.

+0

No estoy tan preocupado por el espacio en disco; ahora es una locura barata, puedo agregar más unidades y RAID si es necesario. Mi preocupación con mysql está relacionada principalmente con el almacenamiento en caché; si ejecuto una consulta que devuelve BLOBS, parece que esto ocuparía una gran cantidad de caché, borrando otros datos más útiles. Sospecho que debe haber otros problemas también, de lo contrario, más personas lo harían de esa manera, pero no estoy seguro de lo que son. –

+0

He leído mucho sobre este tema, y ​​nadie ha indicado problemas de caché de consultas como una razón para no almacenar archivos en la base de datos. Con MySQL, puede establecer el valor query_cache_limit, que indica el tamaño máximo del conjunto de resultados para almacenar en caché. El valor predeterminado es 1 MB. Como una solución alternativa que podría resolver los problemas que tiene con el sistema de archivos, también podría ver un NFS (un servidor de archivos). Puede almacenar referencias a los archivos en el db. –

+0

Cierto, limitar el tamaño de las cosas que se almacenarán en el caché de consultas probablemente reduzca mi preocupación aquí. Almacenar referencias del sistema de archivos sigue siendo un problema, pero parece que es la mejor manera. –

2

Puede almacenar archivos de hasta 2GB fácilmente en Cassandra dividiéndolos en columnas de 1MB más o menos. Esto es bastante común.

También podría almacenarlo como una gran columna, pero luego tendría que leer todo en la memoria al acceder a él.

Cuestiones relacionadas