Transfiere 15 TB de archivos pequeños

79

Estoy archivando datos de un servidor a otro. Inicialmente comencé un rsynctrabajo. Le tomó 2 semanas construir la lista de archivos solo para 5 TB de datos y otra semana para transferir 1 TB de datos.

Luego tuve que matar el trabajo ya que necesitamos un tiempo de inactividad en el nuevo servidor.

Se acordó que lo alquilaremos, ya que probablemente no necesitemos acceder a él nuevamente. Estaba pensando en dividirlo en trozos de 500 GB. Después de eso tar, iba a copiarlo ssh. Estaba usando tary pigztodavía es demasiado lento.

Hay una mejor manera de hacerlo? Creo que ambos servidores están en Redhat. El servidor anterior es Ext4 y el nuevo es XFS.

Los tamaños de archivo varían de pocos kb a pocos mb y hay 24 millones de jpegs en 5TB. Entonces supongo que alrededor de 60-80 millones por 15 TB.

editar: Después de jugar con rsync, nc, tar, mbuffer y pigz durante un par de días. El cuello de botella será el disco IO. A medida que los datos se dividen en 500 discos SAS y alrededor de 250 millones de archivos JPEG. Sin embargo, ahora aprendí sobre todas estas buenas herramientas que puedo usar en el futuro.

lbanz
fuente
1
posible duplicado de linux a linux, transferencia de 10TB?
D34DM347
2
Una opción es crear los archivos tar comprimidos en una unidad externa y moverlos al nuevo sistema. El disco adicional acelerará la creación de los archivos tar (no se escribirá en los discos existentes en el sistema, posiblemente al intentar leer 15 TB de ellos) y no inmovilizará el nuevo servidor.
Brian
44
Hay una mejor manera de hacerlo? - Sí, la replicación DFS de Windows Server 2012 R2 prepararía eso en aproximadamente 10 horas . Y sincronizaría los cambios, y continuaría donde se quedó después de reiniciar.
TessellatingHeckler
27
@TessellatingHeckler: ¿entonces sugiere que OP migre de Redhat a Windows antes de archivar?
Thomas Weller
12
@ThomasWeller Preguntaron "¿hay una mejor manera?", Y la hay. No recomiendo que usen la mejor manera. Son libres de usar comandos en una tubería que no puede recuperarse de la interrupción, no verificará el contenido del archivo, no puede informar el estado de la copia, no puede usar bloques copiados previamente para evitar copiar partes de archivos, no tiene implícito admite copia de baja prioridad, no se puede pausar, no menciona la copia de ACL y necesita que alguien permanezca conectado para ejecutarlo. Sin embargo, cualquier otra persona que lo siga puede estar interesada, o se le pedirá que diga "x hace eso en Linux".
TessellatingHeckler

Respuestas:

64

He tenido muy buenos resultados usando tar, pigz(gzip paralelo) y nc.

Máquina de origen:

tar -cf - -C /path/of/small/files . | pigz | nc -l 9876

Máquina de destino:

Extraer:

nc source_machine_ip 9876 | pigz -d | tar -xf - -C /put/stuff/here

Para mantener el archivo:

nc source_machine_ip 9876 > smallstuff.tar.gz

Si quieres ver la tasa de transferencia, ¡solo pasa pvdespués pigz -d!

h0tw1r3
fuente
3
Para su información, puede reemplazar pigzcon gzipo eliminar por completo, pero la velocidad será significativamente más lento.
h0tw1r3
10
¿Cómo se puede aceptar esto si OP ya lo ha intentado tary pigz? No entiendo ...
Thomas Weller
55
@ThomasWeller, ¿de dónde sacaste que lo intentó pigz? Según la pregunta, parece que solo lo ha intentado rsynchasta ahora y estaba considerando usar tarpara dividir y agrupar los datos. Especialmente si no ha usado la opción -z/ --compressen rsync, pigzteóricamente podría ayudar significativamente.
Doktor J
1
@ThomasWeller sí, de hecho ya probé alquitrán y pigz pero no nc. Estaba usando ssh, por lo que agregó mucho más sobrecarga.
lbanz
2
@lbanz eso simplemente significa que tarno está produciendo datos lo suficientemente rápido como para pigzusar mucha CPU para la compresión. La lectura de muchos archivos pequeños implica muchas más llamadas al sistema, muchas más búsquedas de disco y mucha más sobrecarga del kernel que leer la misma cantidad de bytes de archivos más grandes, y parece que simplemente está bloqueando la botella en un nivel fundamental.
hobbs
21

Me apegaría a la solución rsync. Modern (3.0.0+) rsync usa una lista de archivos incremental, por lo que no tiene que crear una lista completa antes de la transferencia. Por lo tanto, reiniciar no requerirá que realice una transferencia completa nuevamente en caso de problemas. Dividir la transferencia por directorio de nivel superior o segundo optimizará esto aún más. (Usaría rsync -a -Py agregaría --compresssi su red es más lenta que sus unidades).

zorro
fuente
Estoy usando rsync 2.6.8 en el servidor anterior. Como es uno de esos cuadros donde no se nos permite instalar / actualizar nada según lo indicado por el vendedor o anula la garantía. Podría actualizarlo y ver si es más rápido.
lbanz
18
Encuentre (o cree) un binario rsync vinculado estáticamente y simplemente ejecútelo desde su hogar. Esperemos que eso no arruine ninguna garantía.
Fox
¿Qué tal unison? ¿Cómo se compara con rsync?
Gwyneth Llewelyn
15

Configure una VPN (si es Internet), cree una unidad virtual de algún formato en el servidor remoto (hágalo ext4), móntela en el servidor remoto, luego móntela en el servidor local (usando un protocolo de nivel de bloque como iSCSI ) y utilice dd u otra herramienta de nivel de bloque para realizar la transferencia. Luego puede copiar los archivos de la unidad virtual a la unidad real (XFS) a su conveniencia.

Dos razones:

  1. Sin sobrecarga del sistema de archivos, que es el principal culpable del rendimiento
  2. Sin buscar, estás viendo lectura / escritura secuencial en ambos lados
Arthur Kay
fuente
3
Pasar por alto el sistema de archivos es bueno. Copiar a nivel de bloque de un sistema de archivos montado de lectura-escritura es una muy mala idea. Desmonte o monte primero solo lectura.
JB.
Tener una copia de 15 TB también es una mierda. Significa que el nuevo servidor necesita un mínimo de 30.
Arthur Kay
3
Si el servidor está usando LVM, uno podría hacer una instantánea de solo lectura del sistema de archivos y copiarla en su lugar. Sobrecarga de espacio solo para los cambios en el sistema de archivos que ocurren mientras se lee la instantánea.
liori
9

Si el servidor antiguo se está retirando del servicio y los archivos pueden estar desconectados durante unos minutos, a menudo es más rápido sacar las unidades de la caja anterior y conectarlas al nuevo servidor, montarlas (volver a conectarlas ahora) y copiar los archivos a los nuevos servidores discos nativos.

Robin Hammond
fuente
2
Se trata de 1 PB de unidades de 2 TB, por lo que es demasiado.
lbanz
3

Use mbuffer y si está en una red segura puede evitar el paso de cifrado.

JamesRyan
fuente
3

(Muchas respuestas diferentes pueden funcionar. Aquí hay otra).

Genere la lista de archivos con find -type f(esto debería terminar en un par de horas), divídala en pequeños fragmentos y transfiera cada fragmento utilizando rsync --files-from=....

pts
fuente
3

¿Has considerado sneakernet? Con eso, me refiero a transferir todo a la misma unidad, luego mover físicamente esa unidad.

Hace aproximadamente un mes, Samsung presentó una unidad de 16 TB (técnicamente, es 15.36 TB), que también es un SSD: http://www.theverge.com/2015/8/14/9153083/samsung-worlds-largest-hard -drive-16tb

Creo que esta unidad podría hacer por esto. Aún tendría que copiar todos los archivos, pero como no tiene latencia de red y probablemente puede usar SATA o una técnica similarmente rápida, debería ser mucho más rápido.

Nzall
fuente
2

Si hay alguna posibilidad de obtener una alta tasa de éxito cuando se realiza la deduplicación, usaría algo como borgbackup o Attic.

Si no es así, verifique la solución netcat + tar + pbzip2 , adapte las opciones de compresión de acuerdo con su hardware; verifique cuál es el cuello de botella (CPU? Red? IO?). El pbzip2 abarcaría muy bien todas las CPU, proporcionando un mejor rendimiento.

neutrinos
fuente
lzma ( xz) se descomprime más rápido que bzip2 y funciona bien en la mayoría de las entradas. Desafortunadamente, xzla opción de subprocesos múltiples aún no está implementada.
Peter Cordes
Por lo general, la etapa de compresión necesita más potencia que la descompresión, por lo que si la CPU es el factor limitante, pbzip2 daría como resultado un mejor rendimiento general. La descompresión no debería afectar el proceso, si ambas máquinas son similares.
neutrinus
Sí, mi punto es que es una lástima que no haya un lzma multi-hilo de flujo único. Aunque para este caso de uso, de transferir sistemas de archivos completos de datos, pigzsería un problema. ser el compresor más lento que quieras usar. O incluso lz4. (Hay lz4mtdisponible una secuencia de subprocesos múltiples para un solo flujo. No se enhebra de manera muy eficiente (genera nuevos subprocesos con mucha frecuencia), pero obtiene una aceleración sólida)
Peter Cordes
2

Está utilizando RedHat Linux, por lo que esto no se aplicaría, pero como otra opción:

He tenido un gran éxito al usar ZFS para almacenar millones de archivos, ya que los inodos no son un problema.

Si esa fuera una opción para usted, podría tomar instantáneas y usar zfs para enviar actualizaciones incrementales. He tenido mucho éxito al usar este método para transferir y archivar datos.

ZFS es principalmente un sistema de archivos Solaris, pero se puede encontrar en los illumos (bifurcación de código abierto de Sun's OpenSolaris). Sé que también ha habido algo de suerte al usar ZFS bajo BSD y Linux (¿usando FUSE?), Pero no tengo experiencia en intentarlo.

Sleepyweasel
fuente
3
Ha habido un puerto Linux de ZFS nativo sin FUSE durante bastante tiempo: zfsonlinux.org
EEAA
1

Inicia un rsyncdemonio en la máquina objetivo. Esto acelerará mucho el proceso de transferencia.

Heiko Wiesner
fuente
-1

Puedes hacer esto solo con tar y ssh, así:

tar zcf - <your files> | ssh <destination host> "cat > <your_file>.tar.gz"

O, si desea mantener archivos individuales:

tar zcf - <your files> | ssh <destination host> "tar zxf -"

Fabio Brito
fuente
1
No deduplicará, no hay forma de reanudar, comprimiendo usando solo una CPU.
neutrinus