2011-03-04 12 views
6

Estoy trabajando en una utilidad de copia de seguridad de código abierto que realiza copias de seguridad de archivos y los transfiere a varias ubicaciones externas como Amazon S3, Rackspace Cloud Files, Dropbox y servidores remotos a través de FTP/Protocolos SFTP/SCP.RSync archivo único (archivo) que cambia cada vez

Ahora, he recibido una solicitud de funciones para realizar copias de seguridad incrementales (en caso de que las copias de seguridad realizadas sean grandes y su transferencia y almacenamiento sean caros). He estado buscando y alguien mencionó la utilidad rsync. Realicé algunas pruebas con esto, pero no estoy seguro si esto es adecuado, por lo que me gustaría saber de alguien que tenga experiencia con rsync.

Déjeme darle un resumen rápido de lo que sucede cuando se realiza una copia de seguridad. Básicamente comenzará a descargar bases de datos como MySQL, PostgreSQL, MongoDB, Redis. Puede tomar algunos archivos regulares (como imágenes) del sistema de archivos. Una vez que todo esté en su lugar, lo empaquetará todo en un solo .tar (adicionalmente lo comprimirá y encriptará usando gzip y openssl).

Una vez que todo esté hecho, tenemos un único archivo que tiene este aspecto:
mybackup.tar.gz.enc

Ahora quiero transferir este archivo a una ubicación remota. El objetivo es reducir el ancho de banda y el costo de almacenamiento. Asumamos que este pequeño paquete de respaldo tiene un tamaño aproximado de 1GB. Entonces usamos rsync para transferir esto a una ubicación remota y eliminar la copia de seguridad de archivos localmente. Mañana se generará un nuevo archivo de respaldo, y resulta que se han agregado muchos más datos en las últimas 24 horas, y construimos un nuevo archivo mybackup.tar.gz.enc y parece que tenemos un tamaño de hasta 1.2GB.

Ahora, mi pregunta es: ¿es posible transferir solo el 200MB que se agregó en las últimas 24 horas? Probé el siguiente comando:

rsync -vhP --append mybackup.tar.gz.enc backups/mybackup.tar.gz.enc

El resultado:

mybackup.tar.gz.enc 1,20 g 100% 36.69MB/s 0:00:46 (Xfer # 1 , a-check = 0/1)

envió 200.01M bytes
recibieron 849.40K bytes
bytes 8.14M/seg
total de tamaño es 1,20 g
aceleración es 2,01

Mirando el sent 200.01M bytes yo diría que el "añadiendo" de los datos funcionaba correctamente. Lo que me pregunto ahora es si transfirió el 1.2GB completo para averiguar cuánto y qué anexar a la copia de seguridad existente, o ¿realmente transfirió el 200MB? Porque si se transfiere el entero 1.2GB, entonces no veo cómo es muy diferente al uso de la utilidad scp en archivos grandes individuales.

Además, si lo que estoy tratando de lograr es posible, ¿qué banderas me recomiendan? Si no es posible con rsync, ¿hay alguna utilidad que pueda recomendar utilizar?

¡Cualquier comentario es muy apreciado!

Respuesta

6

Envió solo lo que dice que envió - solo la transferencia de las piezas modificadas es una de las principales características de rsync. Utiliza algunos rather clever checksumming algorithms (y envía esas sumas de comprobación a través de la red, pero esto es insignificante - varios órdenes de magnitud menos de datos que la transferencia del archivo en sí; en su caso, supongo que es el .01 en 200.01M) y solo transfiere esas partes necesita.

Tenga en cuenta también que ya hay herramientas de copia de seguridad bastante potentes basadas en rsync, es decir, Duplicity. Dependiendo de la licencia de su código, puede valer la pena ver cómo lo hacen.

+0

Gracias por la respuesta. Sí, estaba un poco inseguro porque la copia de seguridad que genero cada vez es un archivo completamente nuevo. Todas las bases de datos se volvieron a descargar, las imágenes se volverán a recopilar y se combinarán en un solo __new__ 'mybackup.tar.gz.enc'. Dado que este archivo básicamente es ** un archivo completamente nuevo ** tuve mis dudas de que podría no entender, o romper el algoritmo o algo así. Pero si tienes un punto. ¡Gracias por tus comentarios! –

+0

@Michael van Rooijen: No importa si es nuevo o no, lo que importa son * las diferencias * entre el archivo que tiene localmente y el remoto. Dado que el proceso de dumping de la base de datos es determinista, los diversos volcados de la misma base de datos tendrán mucho en común. – Piskvor

+0

Derecha. Cuando empaqueté todo lo que incluí en un archivo .tar, solo envió unos pocos 'KB' para un archivo que en realidad es' 3.5MB'. Sin embargo, una vez que comprime el archivo con 'GZip' comenzará a enviar aproximadamente' 2MB' de nuevo. Entonces, aunque la cantidad que se transfiere aún se reduce un poco, parece que RSync tiene dificultades para lidiar con las copias de seguridad comprimidas. Supongo que esto es lo mismo con el cifrado. Entonces probablemente tendré que mantenerlo en '.tar' y RSync. ¡Gracias por tu ayuda! –

8

La naturaleza de gzip es tal que pequeños cambios en el archivo de origen pueden dar lugar a cambios muy grandes en el archivo comprimido resultante: gzip tomará sus propias decisiones cada vez sobre la mejor forma de comprimir los datos que le proporcione.

Algunas versiones de gzip tienen el interruptor --rsyncable que establece el tamaño de bloque que funciona gzip al mismo que rsync, lo que resulta en una compresión ligeramente menos eficiente (en la mayoría de los casos) pero limita los cambios al archivo de salida al misma área del archivo de salida que los cambios en el archivo de origen.

Si no está disponible para usted, generalmente es mejor sincronizar el archivo sin comprimir (utilizando la propia compresión de rsync si se considera el ancho de banda) y comprimirlo al final (si se considera espacio en el disco). Obviamente, esto depende de los detalles de su caso de uso.

+0

FWIW En 'rsync',' -z' comprimirá los datos del archivo durante la transferencia. Quizás en algunos casos esa sea una alternativa a gzip por adelantado ... – rogerdpack

1

Nuevo rsync --append ROMENTARÁ el contenido de su archivo, si hay algún cambio en sus datos existentes. (Desde 3.0.0)

+0

¿Tiene un enlace para elaborar esto? ¿Se refiere al hecho de que 'hace que rsync actualice un archivo al agregar datos al final del archivo, lo que supone que los datos que ya existen en el lado de recepción son idénticos al inicio del archivo en el lado de envío. ¿? – rogerdpack

Cuestiones relacionadas