¿Cómo sincroniza archivos dispersos enormes (imágenes de disco VM) entre máquinas?

22

¿Existe un comando, como rsync, que puede sincronizar archivos enormes y dispersos de un servidor Linux a otro?

Es muy importante que el archivo de destino permanezca disperso. Puede ser más largo (pero no más grande) que la unidad que lo contiene. Solo los bloques modificados deben enviarse a través del cable.

Intenté rsync, pero no tuve alegría. https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M

Si escribo un programa para hacer esto, ¿solo estoy reinventando la rueda? http://www.finalcog.com/synchronise-block-devices

Gracias,

Chris

fadedbee
fuente
rsync es enormemente ineficiente con archivos enormes. Incluso con --inplace primero leerá el archivo completo en el host de destino y ENTONCES comenzará a leer el archivo en el host local y transferirá las diferencias (simplemente ejecute dstat o similar mientras ejecuta rsync y observe)
ndemou

Respuestas:

21
rsync --ignore-existing --sparse ...

Para crear nuevos archivos en modo disperso

Seguido por

rsync --inplace ...

Para actualizar todos los archivos existentes (incluidos los dispersos creados previamente) in situ.

Steve P
fuente
3
Invierta para tener rsync --existing --inplacey luego rsync --ignore-existing --sparsepara acelerar la sincronización
Mike
2
¿Alguien puede explicar el comentario de Mikes y cómo esto debería acelerar la sincronización?
Preexo
Creo que Mike significa primer cambio en el lugar y luego agregar nuevo, de modo que los nuevos no tengan que estar instalados nuevamente debido a la diferencia horaria entre la primera y la segunda llamada. Solo es cierto si se sincroniza directamente desde el almacén de datos y se están ejecutando máquinas virtuales. ¿A menos que él signifique algo más?
Yuan
Estoy de acuerdo con Yuan. El segundo comando de Steves volverá a sincronizar los nuevos archivos, puede protegerlo utilizando la secuencia de comandos de Mikes.
falstaff
rsync es enormemente ineficiente con archivos enormes. Vea mi comentario sobre la pregunta.
ndemou
5

Rsync solo transfiere los cambios a cada archivo y con --inplace solo debería reescribir los bloques que cambiaron sin volver a crear el archivo. Desde su página de características .

rsync es un programa de transferencia de archivos para sistemas Unix. rsync usa el "algoritmo rsync" que proporciona un método muy rápido para sincronizar archivos remotos. Lo hace enviando solo las diferencias en los archivos a través del enlace, sin requerir que ambos conjuntos de archivos estén presentes en uno de los extremos del enlace de antemano.

Usar --inplace debería funcionar para usted. Esto le mostrará el progreso, comprima la transferencia (en el nivel de compresión predeterminado), transfiera el contenido del directorio de almacenamiento local de forma recursiva (lo que importa primero la barra diagonal final), realice los cambios en los archivos en su lugar y use ssh para el transporte.

rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
[email protected]:/path/to/remote/storage/ 

A menudo uso la bandera -a también, que hace algunas cosas más. Es equivalente a -rlptgoD. Dejaré el comportamiento exacto para que lo busque en la página del manual.

reconbot
fuente
1
La '-S' es para archivos dispersos, no 'corta líneas largas'. Desde la página de manual: -S, --sparse maneja los archivos dispersos de manera eficiente. Lo intentaré, gracias.
fadedbee
Gracias, arreglé eso. Estaba saliendo de algo que se dijo en el enlace que diste.
Reconbot
No, desafortunadamente esto no resuelve el problema. Se hace sincronización del archivo, pero resulta que el archivo disperso en el otro extremo en un archivo que no sea escasa. Estoy usando ssh / rsync que viene con Ubuntu 9.04.
fadedbee
Mi comentario anterior fue incorrecto. El problema era que rsync crea archivos no dispersos en su primera copia. --Inplace rsync funciona correctamente, siempre que el archivo de destino ya exista y sea tan largo (no grande) como el archivo de origen. Ahora tengo una solución, pero requiere que verifique si cada archivo ya existe en el servidor de destino. Si es así, hago un --inplace, si no es así, uso --sparse. Esto no es ideal, pero funciona.
fadedbee
rsync es enormemente ineficiente con archivos enormes. Ver mi comentario sobre la pregunta
ndemou
4

Terminé escribiendo software para hacer esto:

http://www.virtsync.com

Este es un software comercial que cuesta $ 49 por servidor físico.

Ahora puedo replicar un archivo disperso de 50 GB (que tiene 3 GB de contenido) en menos de 3 minutos en banda ancha residencial.

chris@server:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.

real    2m47.201s
user    0m48.821s
sys     0m43.915s 
fadedbee
fuente
44
TBH, el momento indicado en el que puedes sincronizar no tiene sentido porque obviamente depende de la cantidad de datos cambiados. Lo que sería más exacto decir es que su software tarda 3 minutos en descubrir qué bloques han cambiado, e incluso esa velocidad probablemente depende de la E / S de su disco y quizás de los ciclos de CPU disponibles.
Reality Extractor
66
Debe revelar que este es un software comercial que cuesta $ 98 o más para la funcionalidad de la red.
Reid
Gracias por señalarnos un software que funcionó bien para usted, que las personas ahora pueden considerar y usar, o no usar como lo necesiten. No gracias por las otras dos personas por su contribución nada nuevo.
Florian Heigl
3

Eche un vistazo a Zumastor Linux Storage Project, que implementa una copia de seguridad de "instantánea" utilizando "rsync" binario a través de la ddsnapherramienta.

Desde la página del manual:

ddsnap proporciona la replicación de dispositivos de bloque dada una instalación de instantáneas a nivel de bloque capaz de almacenar múltiples instantáneas simultáneas de manera eficiente. ddsnap puede generar una lista de fragmentos de instantáneas que difieren entre dos instantáneas y luego enviar esa diferencia por cable. En un servidor posterior, escriba los datos actualizados en un dispositivo de bloque capturado.

rkthkr
fuente
2

lvmsync hace esto.

Aquí hay una transcripción de uso . Crea una instantánea LVM en la fuente, transfiere la partición lógica. Puede transferir actualizaciones incrementales de los cambios desde la creación de instantáneas con la frecuencia que desee.

Tobu
fuente
Lo he intentado, pero no funciona, y el autor no está dispuesto a
admitirlo
1
@ user1007727 no está dispuesto a apoyar, o no está dispuesto a apoyar de forma gratuita?
fadedbee
Utilicé lvmsync en el pasado, funcionó pero no es software de "grado prod". :-)
Florian Heigl
1

¿Podría ser una solución replicar todo el sistema de archivos? DRBD? http://www.drbd.org/

James C
fuente
No creo que drbd sea una buena solución aquí, pero la idea de rsyncing, en lugar de todo el fs, en lugar de los archivos de imagen de disco, es interesante. No estoy seguro de si rsync permite esto - Voy a darle una oportunidad y posterior informe ...
fadedbee
1

Tal vez un poco extraño aquí, pero descubrí recientemente que NFS maneja esto bien.

Entonces, exporta un directorio en una máquina, luego lo monta en la otra y simplemente copia los archivos con utilidades básicas como cp. (Algunas utilidades antiguas / antiguas pueden tener problemas con archivos dispersos).

Encontré rsyncespecialmente ineficiente en la transferencia de archivos dispersos.

cstamas
fuente
1

Para sincronizar archivos grandes o dispositivos de bloque con diferencias de bajas a moderadas, puede hacer una copia simple o usar bdsync , rsync no es apto para este caso en particular *.

bdsyncfuncionó para mí, parece lo suficientemente maduro, su historial de errores es alentador (pequeños problemas, resolución rápida). En mis pruebas, su velocidad era cercana al máximo teórico que podía obtener ** (es decir, puede sincronizar aproximadamente el tiempo que necesita para leer el archivo). Finalmente es de código abierto y no cuesta nada.

bdsynclee los archivos de ambos hosts e intercambia sumas de verificación para compararlos y detectar diferencias. Todo esto al mismo tiempo . Finalmente crea un archivo de parche comprimido en el host de origen. Luego mueve ese archivo al host de destino y ejecuta bdsync por segunda vez para parchear el archivo de destino.

Cuando se usa a través de un enlace bastante rápido (por ejemplo, Ethernet de 100 Mbit) y para archivos con pequeñas diferencias (como suele ser el caso en los discos VM), reduce el tiempo de sincronización al tiempo que necesita para leer el archivo. En un enlace lento, necesita un poco más de tiempo porque debe copiar los cambios comprimidos de un host a otro (parece que puede ahorrar tiempo utilizando un buen truco pero no lo ha probado).


*: rsync es enormemente ineficiente con archivos enormes. Incluso con --inplace primero leerá todo el archivo en el host de destino, DESPUÉS comenzará a leer el archivo en el host de origen y finalmente transferirá las diferencias (simplemente ejecute dstat o similar mientras ejecuta rsync y observe). El resultado es que incluso para archivos con pequeñas diferencias, se tarda aproximadamente el doble del tiempo que necesita leer el archivo para sincronizarlo.

**: bajo el supuesto de que no tiene otra manera de saber qué partes de los archivos han cambiado. Las instantáneas de LVM usan mapas de bits para registrar los bloques modificados para que puedan ser extremadamente más rápidos (el archivo léame de lvmsync tiene más información).

ndemou
fuente
0

No conozco una utilidad de este tipo, solo las llamadas del sistema que pueden manejarla, por lo que si escribe dicha utilidad, podría ser bastante útil.

lo que realmente puede hacer es usar qemu-img convert para copiar los archivos, pero solo funcionará si el FS de destino admite archivos dispersos

dyasny
fuente