Sirviendo imágenes desde el servidor SQL vs. sistema de archivos vs. S3 etc.

12

Mi aplicación (¡asp clásico yay!) Tiene alrededor de 2.1 millones de imágenes a 25GB y eso solo representa 90 días de datos y me gustaría ir a 365 como mínimo. Necesito tener esto bajo control y estoy considerando todas las opciones. ¿Qué piensa sobre las ventajas y desventajas de las siguientes prácticas?

  • Ventajas de SQL Server: fácil de respaldar Contras: ¿rendimiento?
  • Ventajas del sistema de archivos: Contras de velocidad: redundancia, la copia de seguridad es lenta (actualmente se está investigando hacer copias de seguridad completas sintéticas que podrían mejorarlo)
  • S3 y similares Pros: el ancho de banda se transfiere de mi centro de datos a Amazon, almacenamiento prácticamente ilimitado. Contras: Costo, el análisis de costos es complicado (estimar que el 80% de mi ancho de banda son imágenes para fines de ROI), difícil / costoso para cambiar los proveedores de servicios en caso de que sea necesario

¿Alguien más se enfrenta al desafío de imágenes multimillonarias y cómo lo resolvió?

Webjedi
fuente
44
No no no no no no no no almacena los datos de imagen (blobs) en la base de datos. Cometimos este error hace muchos años y lo hemos estado pagando desde entonces. Sin embargo, la base de datos es excelente para los metadatos.
Mark Henderson
Vea mi publicación sobre el tipo de datos FILESTREAM, puede cambiar de opinión.
Dan Diplo

Respuestas:

6

No tenemos millones de imágenes, pero tenemos cientos de miles, y utilizamos el enfoque híbrido: mysql para metadatos, imágenes almacenadas en el disco local para copia de seguridad y enviadas a Amazon s3 donde se sirven a los usuarios. No hemos tenido problemas con Amazon y su disponibilidad. La mudanza a Cloudfront está en nuestros planes, solo necesitamos encontrar el tiempo.

Esta discusión puede ser útil para usted en su decisión:
http://ask.metafilter.com/59635/Millions-of-images

Iría con metadatos en el servidor SQL y archivos en el sistema de archivos (o s3 o cloudfront). Pero la mejor respuesta depende de otros patrones de uso:

  • las imágenes cambian a menudo
  • ¿puede servir las imágenes directamente desde el sistema de archivos (es decir, img src="...") o necesita que se controle el acceso? Si este último, entonces una solución de base de datos es mejor
  • ¿Está sirviendo una pequeña cantidad de imágenes la mayor parte del tiempo (el 10% más reciente) o la distribución está relativamente extendida.

Las copias de seguridad de millones de imágenes serán complicadas, sin importar cómo las organice, solo son muchos datos. Me gustaría encontrar un buen caso de estudio sobre cómo realizar copias de seguridad de blobs en el servidor SQL antes de comprometerme con esa solución. (Aquí hay un artículo que puede ser útil: http://www.databasejournal.com/features/mssql/article.php/3738276/Storing-Images-and-BLOB-files-in-SQL-Server-Part-4.htm )

amarrados
fuente
La copia de seguridad será compleja, pero al menos con las copias de seguridad a nivel de archivo usted (generalmente) no tiene que restaurar toda la copia de seguridad solo para restaurar un registro / imagen. IMO, sistema de archivos por defecto a menos que la base de datos le proporcione algo que no puede hacer de otra manera. +1
JasonBirch
Los sistemas de archivos están diseñados para almacenar archivos: puede encontrar sistemas de archivos diseñados para almacenar millones de archivos de manera eficiente. Las bases de datos están diseñadas para cosas como sus metadatos: consultas y relaciones. A menos que tenga muy pocas imágenes, esta es probablemente la mejor manera (excluyendo las soluciones en la nube).
dmsnell
3

Ignore a las personas que dicen: " No almacene imágenes / datos binarios en la base de datos ", ya que basan sus respuestas en información antigua (suponiendo que almacenará los datos en una columna de tipo VarBinary). Los problemas de rendimiento al usar SQL Server para almacenar imágenes ahora se pueden mitigar mediante el uso del tipo de datos FILESTREAM en SQL Server 2008. En esencia, el tipo de datos FILESTREAM le permite combinar la facilidad de almacenar datos en la base de datos con el rendimiento que obtiene al servir archivos de un almacén de archivos NTFS.

Para citar SQL Mag :

"El nuevo soporte FILESTREAM de SQL Server 2008 combina la ventaja de acceder a los LOB directamente desde el sistema de archivos NTFS con la integridad referencial y la facilidad de acceso que ofrece el motor de base de datos relacional de SQL Server".

Para obtener más información, lea este blog de Ravi S.Maniam en MSDN .

Dan Diplo
fuente
¿El almacenamiento FILESTREAM cambia la historia de copia de seguridad / restauración? Ese es nuestro mayor problema en este momento ... si están almacenados en VarBinary, sería una historia relativamente sencilla.
Webjedi
No, los datos de FILESTREAM se tratan como cualquier otro, por lo que se respaldan con la base de datos. Para citar MSDN: "puede utilizar todos los modelos de copia de seguridad y recuperación con datos de FILESTREAM, y los datos de FILESTREAM se respaldan con los datos estructurados en la base de datos". - technet.microsoft.com/en-us/library/bb933993.aspx
Dan Diplo
2

Si bien no enfrento el desafío de imágenes multimillonarias, usaría Amazon CloudFront. Todos los archivos se almacenan en un depósito S3 pero son servidores a través del sistema de entrega de contenido de Amazon. No usaría S3 solo.

Mi segunda opción sería el sistema de archivos. Simple y fácil, el único problema es que si todos estos archivos terminan en un directorio, todo se bloqueará, con fuerza.

SQL para mí no sería una opción para un sistema como este. No solo se le cobrará por la transferencia de ancho de banda, también se le cobrará por el procesamiento de la consulta, esto dependerá mucho del alojamiento, sino que supongo que está utilizando un servidor dedicado o al menos un vps donde se le cobrará por ciclos. Luego, ralentizará todo su sitio si usa la misma base de datos que el servidor de imágenes. Si no, entonces agrega toda esta complejidad de tener que administrar dos conexiones de base de datos.

Frank Robert Anderson
fuente
En mi escenario, actualmente todo está en las premisas de mis propios servidores que tengo. Entonces no hay un costo de transacción per se.
Webjedi
1

Las bases de datos están diseñadas para datos transaccionales / consistencia y seguridad.

Los archivos multimedia (imágenes, audio, video) tienden a crearse y tal vez eliminarse, pero rara vez se actualizan. Por lo tanto, generalmente no hay necesidad de mantenerlos consistentemente transaccionales con otros datos y una base de datos no le dará ningún beneficio real allí. El contenido del texto puede ser un asunto diferente.

Siempre que no tenga ningún problema con el concepto de que alguien extraiga su archivo directamente si tiene la URL del archivo, entonces un sistema de archivos está bien. Si estaba ejecutando algo así como una biblioteca de fotos, donde espera cargar antes de que las personas descarguen el archivo, entonces probablemente sea un asunto diferente. Es decir, una vez que un usuario ha pagado, puede obtener una URL específica para ese usuario o válida solo por un corto tiempo, y la aplicación maneja URL múltiples o temporales que apuntan a la misma imagen. Eso todavía podría ser manejado por la aplicación y un sistema de archivos, pero terminas sirviendo los medios a través de la aplicación en lugar de una descarga directa de archivos (que en su mayoría descartaría cualquier beneficio de S3) y hay menos diferencia entre DB y el sistema de archivos .

Gary
fuente