26 votos

Almacenamiento y copia de seguridad de 10 millones de archivos en Linux

Dirijo un sitio web en el que se almacenan unos 10 millones de archivos (portadas de libros) en 3 niveles de subdirectorios, que van de [0 a f]:

0/0/0/
0/0/1/
...
f/f/f/

Esto lleva a unos 2400 archivos por directorio, lo que es muy rápido cuando necesitamos recuperar un archivo. Esta es además una práctica sugerida por muchas preguntas .

Sin embargo, cuando necesito hacer una copia de seguridad de estos archivos, tardo muchos días en recorrer los 4k directorios que contienen 10m de archivos.

Así que me pregunto si podría almacenar estos archivos en un contenedor (o en contenedores 4k), que actuaría cada uno exactamente como un sistema de archivos (¿algún tipo de contenedor ext3/4 montado?). Supongo que esto sería casi tan eficiente como acceder directamente a un archivo en el sistema de archivos, y esto tendría la gran ventaja de ser copiado a otro servidor muy eficientemente.

¿Alguna sugerencia sobre la mejor manera de hacerlo? ¿O alguna alternativa viable (noSQL, ...)?

0 votos

¿Qué sistema de archivos está utilizando ahora?

0 votos

NetApp es una opción si puede soportar los precios

0 votos

Estoy usando ext4 bajo CentOS 5.6

12voto

Seth Robertson Puntos 829

Opciones para acceder rápidamente a millones de archivos y realizar copias de seguridad de los mismos

Pedir prestado a personas con problemas similares

Esto se parece mucho al tipo de problema más sencillo al que se enfrentan los servidores de noticias de USENET y los proxies web de caché: cientos de millones de pequeños archivos a los que se accede aleatoriamente. Tal vez quieras seguir su ejemplo (salvo que ellos no suelen tener que hacer nunca copias de seguridad).

http://devel.squid-cache.org/coss/coss-notes.txt

http://citeseer.ist.psu.edu/viewdoc/download;jsessionid=4074B50D266E72C69D6D35FEDCBBA83D?doi=10.1.1.31.4000&rep=rep1&type=pdf

Obviamente, la naturaleza cíclica del sistema de archivos de noticias cíclicas es irrelevante para usted, pero el concepto de bajo nivel de tener múltiples archivos/dispositivos de disco con imágenes empaquetadas y un índice rápido a partir de la información que el usuario proporciona para buscar la información de ubicación es muy apropiado.

Sistemas de archivos dedicados

Por supuesto, estos son conceptos similares a lo que la gente estaba hablando con la creación de un sistema de archivos en un archivo y el montaje a través de loopback, excepto que se llega a escribir su propio código de sistema de archivos. Por supuesto, ya que dijo que su sistema era de lectura, podría dedicar una partición de disco (o una partición lvm para tener flexibilidad en el tamaño) a este propósito. Cuando quieras hacer una copia de seguridad, monta el sistema de archivos de sólo lectura y luego haz una copia de los bits de la partición.

LVM

He mencionado anteriormente que LVM es útil para permitir el tamaño dinámico de una partición, de modo que no es necesario hacer una copia de seguridad de mucho espacio vacío. Pero, por supuesto, LVM tiene otras características que pueden ser muy aplicables. Específicamente la funcionalidad de "instantánea" que te permite congelar un sistema de archivos en un momento en el tiempo. Cualquier rm -rf o cualquier otra cosa que no perturbe la instantánea. Dependiendo de lo que intente hacer exactamente, eso podría ser suficiente para sus necesidades de copias de seguridad.

RAID-1

Estoy seguro de que ya estás familiarizado con el RAID y probablemente ya lo usas para la fiabilidad, pero el RAID-1 puede usarse también para las copias de seguridad, al menos si estás usando el RAID por software (puedes usarlo con el RAID por hardware, pero eso en realidad te da menos fiabilidad porque puede requerir el mismo modelo/revisión de controlador para leer). El concepto es que crees un grupo RAID-1 con un disco más del que realmente necesitas conectado para tus necesidades normales de fiabilidad (por ejemplo, un tercer disco si usas RAID-1 por software con dos discos, o quizás un disco grande y un RAID5 por hardware con discos más pequeños con un RAID-1 por software encima del RAID-5 por hardware). Cuando llegue el momento de hacer una copia de seguridad, instale un disco, pida a mdadm que añada ese disco al grupo raid, espere hasta que indique que está completo, opcionalmente pida un scrub de verificación, y luego retire el disco. Por supuesto, dependiendo de las características de rendimiento, puedes tener el disco instalado la mayor parte del tiempo y sólo quitarlo para intercambiarlo con un disco alternativo, o puedes tener el disco sólo instalado durante las copias de seguridad).

0 votos

Respuesta muy completa, que resume buenas soluciones. Creo que voy a mantener mi estructura de sistema de archivos existente, y utilizar instantáneas LVM, que parece ser perfecto para mi caso de uso.

9voto

Nemo Puntos 278

Como probablemente sepa, su problema es la localidad. Una búsqueda típica en el disco tarda unos 10 ms. Así que sólo llamar a "stat" (o open()) en 10 millones de archivos colocados al azar requiere 10 millones de búsquedas, o alrededor de 100000 segundos, o 30 horas.

Así que debes poner tus archivos en contenedores más grandes, de manera que el número relevante sea el ancho de banda de tu unidad (50-100 MB/seg para un solo disco, normalmente) en lugar de tu tiempo de búsqueda. También para que puedas usar un RAID, que te permite aumentar el ancho de banda (pero no reducir el tiempo de búsqueda).

Probablemente no te estoy diciendo nada que no sepas ya, pero mi punto es que tu idea de "contenedor" definitivamente resolverá el problema, y casi cualquier contenedor servirá. Los montajes en bucle probablemente funcionarán tan bien como cualquier otra cosa.

0 votos

Sí, la localidad es crucial. Observa tus patrones de uso. La mayoría de los problemas tienden a seguir el principio de Pareto (el 80% de los procesos golpean el 20% de los datos), así que si pudieras averiguar qué archivos necesitan ser almacenados en caché en la memoria RAM, o simplemente ponerlos en una partición separada con una disposición diferente de los directorios, por lo que toma menos búsquedas de directorio o busca, probablemente ayudaría mucho. Distribuir los archivos de acceso frecuente en diferentes discos para que las búsquedas se realicen en paralelo también podría ayudar. +1 para @nemo por mencionar la localidad de referencia.

9voto

Podrías montar un sistema de archivos virtual utilizando el gestor de bucles, pero aunque esto aceleraría el proceso de copia de seguridad, podría afectar a las operaciones normales.

Otra alternativa es hacer una copia de seguridad de todo el dispositivo utilizando dd. Por ejemplo, dd if=/dev/my_device of=/path/to/backup.dd .

5voto

sysadmin1138 Puntos 86362

Hay un par de opciones. La más sencilla, y que debería funcionar con todos los sistemas de archivos de Linux, es dd copiar toda la partición ( /dev/sdb3 o /dev/mapper/Data-ImageVol ) a una sola imagen y archivar esa imagen. En caso de restaurar archivos singulares, monte en bucle la imagen ( mount -o loop /usr/path/to/file /mountpoint ) y copie los archivos que necesite. Para restaurar una partición completa, puede invertir la dirección del dd pero realmente necesitas una partición de idéntico tamaño.

A juzgar por tu caso de uso, supongo que las restauraciones de archivos individuales son muy poco frecuentes, si es que ocurren. Por eso tiene sentido una copia de seguridad basada en imágenes. Si necesitas hacer restauraciones individuales más a menudo, usar instantáneas LVM por etapas será mucho más conveniente; pero aún necesitas hacer la copia de seguridad basada en imágenes para esos desastres críticos de "lo hemos perdido todo". Las restauraciones basadas en imágenes tienden a ir un montón más rápido que las restauraciones basadas en tar, simplemente porque sólo se restauran bloques, no se incurre en bastantes operaciones de metadatos con cada fopen/fclose, y también puede ser una operación de disco altamente secuencial para aumentar aún más la velocidad.

Alternativamente, como menciona el vídeo de Google al que apuntó @casey a mitad de camino, XFS es un gran sistema de archivos (aunque complejo). Una de las utilidades más agradables con XFS es el xfsdump que volcará un sistema de archivos completo en un solo archivo, y generalmente lo hará más rápido que tar puede. Es una utilidad específica del sistema de archivos, por lo que puede aprovechar las ventajas internas de fs de una manera que tar no puede.

0 votos

Hay muchas respuestas buenas. XFS parece interesante, pero me temo que está un poco fuera de mi alcance.

3voto

Casey Puntos 565

Te sugiero que primero pruebes a actualizar a EXT4, si no lo tienes ya.

Google ha investigado mucho sobre por qué EXT4 es una buena idea .

Después de eso, debería considerar la implementación de una arquitectura de sistema de archivos distribuidos. Por ejemplo:

0 votos

De hecho, ya estoy ejecutando EXT4, que tiene una pinta estupenda.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: