Pregunta

Hay algunas preguntas muy buenas aquí en SO sobre la administración y el almacenamiento de archivos dentro de un proyecto grande.

Almacenamiento de imágenes en DB: ¿sí o no?
¿Almacenaría datos binarios en una base de datos o en un sistema de archivos?

El primero tiene algunas ideas interesantes y en mi proyecto he decidido seguir la ruta de los archivos y no la ruta de la base de datos.

Un punto importante en contra del uso del sistema de archivos es la copia de seguridad.Pero en nuestro sistema tenemos un excelente esquema de respaldo, así que eso no me preocupa.

La siguiente ruta es cómo almacenar los archivos reales.Y he pensado en tener la ubicación de los archivos estática en todo momento y crear un sistema de directorio virtual en el lado de la base de datos.Entonces los enlaces al archivo no cambian.

El sistema que estoy construyendo tendrá una administración de archivos global para que todos los archivos sean accesibles para todos los usuarios.Pero muchos de los que han seguido la ruta de los archivos hablan sobre el tamaño del directorio físico (si todos los archivos están dentro de un directorio, por ejemplo).

Entonces mi pregunta es, ¿cuáles son algunos consejos o métodos de mejores prácticas para crear carpetas para estos archivos estáticos, o si no debería seguir la ruta del directorio virtual?

(el proyecto está en la pila LAMP (PHP) si eso ayuda en algo)

¿Fue útil?

Solución

Una forma es asignar un número único a cada archivo y utilizarlo para buscar la ubicación del archivo real. A continuación, un uso de ese número para distribuir archivos en diferentes directorios en el sistema de archivos. Por ejemplo, podría usar algo como este esquema:

/images/{0}/{1}/{2}

  

{0}: file_number % 100
  {1}: (file_number / 100) % 100
  {2}: file_number

Otros consejos

He encontré con este problema hace algún tiempo para un sitio web que fue anfitrión de una gran cantidad de archivos. Lo que hicimos fue tomar un GUID (que es también el campo de clave principal de un archivo) (por ejemplo BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) y almacenar un archivo de la siguiente manera: A / B / C / C / BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301 / filename.ext

Esto tiene ciertas ventajas:

  • Se puede escalar los servidores de archivos a través de múltiples servidores (y asignar directorios específicos para cada uno)
  • Usted no tiene que cambiar el nombre del archivo
  • Sus directorios se garantiza que sea único

Espero que esto ayude!

Con el fin de evitar la creación de un excesivo número de entradas en un solo directorio, es posible que desee basar la creación de directorios en pedazos de nombre de archivo. Así, por ejemplo, si tiene un archivo llamado d7f5ae9b7c5a.png, es posible que desee almacenar en los medios de comunicación / D7 / F5 / d7f5ae9b7c5a.png. Si los nombres de archivo son todos hexadecimal entonces esto va a restringir el número de entradas en un solo directorio a 256 hasta el nivel final.

  1. Una imagen del usuario ~ 100kb, así que tiene 10 000 usuarios en la base de datos, cada usuario tendrá en promedio 5 imágenes, por lo que tendrá 5 terabytes DB, y cada salida de la imagen será ejecutada a través de una base de datos y esto DB tráfico adicional reducirá la perfomance de información general del servidor DB. ... puede utilizar el clúster DB para evitar esto, pero supongo que es caro

  2. Informe de usuario sobre el error en la base de datos activa, (en la prueba - todo funciona correctamente), ¿cómo crear un volcado de descomprimirlo en la máquina de los desarrolladores? ¿Cuánto tiempo tomará?

  3. En un momento en el que puede decidir poner las imágenes en algún CDN, lo que serán los cambios en el código fuente?

Normalmente adopto este enfoque:

Tenga una variable de configuración global para su aplicación que apunte a la carpeta donde almacena los archivos cargados.En su base de datos, almacene las rutas relativas a los archivos (en relación con lo que apunta la variable de configuración).

Entonces, si un archivo está ubicado en /www/uploads/image.jpg, la variable de configuración apunta a /www/uploads la fila de su base de datos tiene image.jpg.Esta es una forma flexible que desacopla la estructura de directorios de su sistema de su aplicación.

Además, puede fragmentar el almacenamiento de archivos en directorios según las tablas de la base de datos con las que se relacionan.Supongamos que tiene una tabla user_reports y una tabla user_photos.Almacena los archivos relacionados con user_reports en /www/uploads/user_reports.Si tiene una gran cantidad de cargas de usuarios, puede implementar la fragmentación aún más.Digamos que un usuario carga un archivo el 20.03.2009, el archivo se llama report.pdf, por lo que lo almacena en /www/uploads/user_reports/2009/03/20/report.pdf.

No puedo decir mucho acerca de cómo Apache y PHP gestionar archivos, pero puedo decir algo sobre el sistema de archivos ext3. ext3 no parecen tener problemas con un gran número de archivos en el mismo directorio. Lo he probado con hasta un millón de archivos. Asegúrese de que la opción dir_index está habilitada en el sistema de archivos antes de crear los directorios. Se puede comprobar por dump2fs en ejecución y cambiar esta opción mediante la ejecución de tune2fs. Hash de los archivos en un árbol de subdirectorios todavía puede ser útil porque las herramientas de línea de comandos todavía puede tener problemas para crear listados de los contenidos del directorio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top