Cargando

Ir a contenido


 


Que es Rsync y como usarlo para Respaldos

Hablaremos de cómo utilizar rsync para respaldos backup de todo tipo y como asociarlo con cron y scripts para ambientes de producción.


Escrito por el nov 16 2015 18:58 rsync cron backup respaldo


En la actualidad mantener una infraestructura de cualquier tamaño sin ningún respaldo puede considerarse una locura, un disco puede fallar en cualquier momento y podrías perder información tan valiosa como la contabilidad de la empresa. En esta entrada hablaremos como usar Rsync, una de las mejores herramientas para los respaldos en sistemas *nix.

 

Veremos desde lo más básico hasta ejemplos más avanzados con scripts y ejemplos que puedas aplicar en tu entorno de trabajo.

 

La necesidad de tener la misma información en distintos lugares viene siendo una que cada vez va tomando más fuerza, esto debido a que nuestro espacio de trabajo es variable y queremos tener nuestras herramientas siempre con nosotros o inclusive como medidas de respaldo.

 

¿Qué es rsync?
Es una herramienta de código abierto de transferencia de archivos y directorios entre una ubicación y otra. Sus ventajas se basan principalmente en la compresión de la información a enviar, permite que la transferencia se realice mediante un canal SSH y que transfiere solo los archivos y trozos de archivos que han sido modificados en lugar de transferir el archivo completo nuevamente, algo parecido a lo que sucede al transferir las diferencias en un archivo bajo el control de versiones Git.

 

Entre los diferentes usos que se le dan a rsync se encuentran los siguientes:

  • Respaldos automatizados a discos o servidores remotos.
  • Sincronización de archivos y directorios remotos.
  • Transferencia común de archivos.

 

Beneficios de Rsync
1. Es más rápido que scp (Secure Copy) porque rsync utiliza un protocolo de subida que permite transferir solo la diferencia entre los archivos, la primera vez transfiere todo el archivo para la segunda vez solo los cambios que puedan haber.
2. Está diseñado para respaldos en remoto.
3. Soporta la copia de toda la permisología de los archivos por ejemplo, dueño, grupos soft y hard link.
4. Utiliza menos ancho de banda al utilizar compresión mientras se envían los archivos.

 

 

Aprendiendo a usar Rsync


Entramos de lleno en el manejo del comando y los opciones más útiles.

 

Syntax Básica

Está compuesta por el comando rsync al inicio, las opciones a utilizar, el archivo de origen y el destino del respaldo.
# rsync options source destination
Opciones de Rsync

Estas son algunas de las opciones más útiles que pueden utilizarse con Rsync recuerda que para ver todas sus opciones podemos visitar su man page ---> man rsync
-v: verbose ---> Muestra mayor información de la operación.
-r: recursive ---> Se utilizarán las sub-carpetas en la operación.
-a: archive ---> Copiarla tal cual preservando los permisos, symbolic links, usuarios y grupos y manteniendo los tiempos de modificación.
-z: compress ---> habilita la compresión mientras se transfiere. 
-h: human-readable ----> Las unidades se mantienen en MB GB para una fácil lectura.
Instalar Rsync

Viene instalado en casi todas las distribuciones aun así puedes instalarlo desde los repo.
#Red Hat/Centos
yum install rsync 
#Debian/Ubuntu/Linux Mint
apt-get install rsync
Pasamos a su uso.

 

 

Utilizando Rsync para respaldos locales


En ocasiones debemos respaldar cierta información antes de hacer modificaciones y en caso de algún error recuperar desde el Respaldo, empezaremos con un laboratorio haciendo respaldo de una carpeta a otra.

 

Preparando el Sistema

Empezamos verificando que rsync esté instalado.
[user@Joncak6 ~]$ which rsync
/usr/bin/rsync
Crearemos 2 carpetas para el origen y destino de los archivos.
mkdir {respaldo1, respaldo2}
Creamos varios archivos en la carpeta respaldo1 en este caso no importa el tamaño de los archivos.
[user@Joncak6 ~]$ touch respaldo1/file{1..75}
El directorio debería tener 75 archivos.
[user@Joncak6 ~]$ ls respaldo1/
file1   file14  file19  file23  file28  file32  file37  file41  file46  file50  file55  file6   file64  file69  file73
file10  file15  file2   file24  file29  file33  file38  file42  file47  file51  file56  file60  file65  file7   file74
file11  file16  file20  file25  file3   file34  file39  file43  file48  file52  file57  file61  file66  file70  file75
file12  file17  file21  file26  file30  file35  file4   file44  file49  file53  file58  file62  file67  file71  file8
file13  file18  file22  file27  file31  file36  file40  file45  file5   file54  file59  file63  file68  file72  file9
Hacemos respaldo.

 

Respaldar Archivos y Directorios

Para respaldar los archivos al respaldo2 usamos:
rsync -r respaldo1/ respaldo2
El origen debe terminar en / de lo contrario copiaria su carpeta y no el contenido.

 

SI entramos en el respaldo2 podemos ver los 75 archivos incluso podemos comprobar que son 2 directorios idénticos usando diff.

[user@Joncak6 ~]$ diff respaldo1 respaldo2
En caso de crear un softlink de un archivo del directorio 1
ln -s file30 file100
Al utilizar rsync con -r no sincronizará el softlink en este caso usamos:
rsync -a respaldo1/ respaldo2
Si nos fijamos esta vez sí tendremos el softlink sincronizado.

 

 

Usando el Dry Run en Rsync


Si no estamos seguro de lo que vamos a respaldar podemos usar una simulación con -n y en conjunto con -v puede ser muy util.
[user@Joncak6 ~]$ rsync -anv respaldo1/ respaldo2
sending incremental file list


sent 606 bytes  received 12 bytes  1236.00 bytes/sec
total size is 6  speedup is 0.01 (DRY RUN)

Copiar archivos a un Servidor Remoto


Es posible realizar respaldos a servidores externos en este caso debemos tener acceso por SSH al servidor de destino recuerden activar la compresión para transferencias mucha más rápidas. Debemos usar la dirección de acceso seguido del directorio donde se guardará el respaldo.
[user@Joncak6 ~]$ rsync -avz respaldo1/ user@172.31.17.163:/home/user/
The authenticity of host '172.31.17.163 (172.31.17.163)' can't be established.
ECDSA key fingerprint is 0d:0c:b1:1d:e1:cf:6d:9f:51:bf:0f:dc:60:82:a1:73.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.31.17.163' (ECDSA) to the list of known hosts.
user@172.31.17.163's password:
sending incremental file list
./
file1
file10
file100 -> file30
file11
file12
file13
file14
file15
file16
….
sent 3312 bytes  received 1443 bytes  559.41 bytes/sec
total size is 6  speedup is 0.00
Nos pedirá contraseña del otro servidor si no lo tenemos con llaves públicas al finalizar tendremos una réplica de la carpeta respaldo1 en el ServidorB.

 

 

Copiar Archivos de un Servidor Remoto a un Servidor Local


En caso de querer descargar los archivos a una máquina en local usamos el mismo comando pero cambiando el orden del origen y destino siguiendo el ejemplo anterior quedaria asi.
[user@Joncak6 ~]$ rsync -avz user@172.31.17.163:/home/user/respaldo1/ home/respaldo1

Respaldo usando SSH para datos Encriptados


La seguridad es muy importante en ambientes de producción, la información de los clientes no puede estar comprometida y podemos encriptar los datos mientras son respaldados usando SSH, otro de sus beneficios es que los credenciales pueden ser protegidos en caso que no usemos llaves públicas. Su desventaja es que puede consumir más recursos del sistema y puede que la transferencia no sea igual de rápida.

 

 

Para utilizar un protocolo con rsync usamos la opción -e seguido del protocolo a usar, en este usaremos ssh y el comando es así.

[user@Joncak6 ~]$ rsync -avzhe ssh user@172.31.17.163:/home/user/ /home/respaldo1

Mostrar Progreso con Rsync


Hacer un respaldo único puede tomar cierto tiempo puedes llevar un progreso desde la consola usando la opción --progress no recomiendo usar esta opción con scripts puede darte un log muy extenso.
[user@Joncak6 ~]$ rsync -avzhe ssh --progress user@172.31.17.163:/home/user/ /home/respaldo1
sending incremental file list


created directory /root/rpmpkgs


rpmpkgs/


rpmpkgs/httpd-2.2.3-82.el5.centos.i386.rpm


           1.02M 100%        2.72MB/s        0:00:00 (xfer#1, to-check=3/5)


rpmpkgs/mod_ssl-2.2.3-82.el5.centos.i386.rpm


          99.04K 100%  241.19kB/s        0:00:00 (xfer#2, to-check=2/5)


rpmpkgs/nagios-3.5.0.tar.gz


           1.79M 100%        1.56MB/s        0:00:01 (xfer#3, to-check=1/5)


rpmpkgs/nagios-plugins-1.4.16.tar.gz


           2.09M 100%        1.47MB/s        0:00:01 (xfer#4, to-check=0/5)


sent 4.99M bytes  received 92 bytes  475.56K bytes/sec


total size is 4.99M  speedup is 1.00

Utilizar -include y -exclude con Rsync


Es posible el uso de listas de acceso con Rsync con las opciones include y exclude, solo necesitamos crear archivos de texto y colocar los nombres de los archivos o carpetas que deben ser incluidos en el respaldo o añadir la lista de lo que debe ser ignorado al realizar la transferencia.

 

Crearemos un archivo llamado incluir y otro llamado excluir

[user@Joncak6 ~]$ touch {incluir,excluir}
Añadimos lo que queramos en cada archivo y después incluimos el archivo con rsync
[user@Joncak6 ~]$rsync -avze ssh --include 'incluir' --exclude 'excluir' root@192.168.0.101:/home/user/respaldo1/ /home/media/respaldo2

Eliminar archivos con Rsync


Por defecto no podemos eliminar archivos entre el origen y destino a no ser que usemos la opción -delete, al usarla si en el destino está un archivo que no está en el origen será eliminado para que los 2 directorios sean iguales.
Si creamos un archivo en el respaldo2.
[user@Joncak6 ~]$ touch respaldo2/solvetic
Despues sincronizamos desde el respaldo1
rsync -avz --delete respaldo1/ respaldo2
Vemos como el archivo solvetic queda eliminado.

 

 

Cuota Máxima de archivos a Transferir


Podemos fijar un tamaño máximo de los archivos a transferir o sincronizar, al utilizar la opción -max-size. Por ejemplo si sólo queremos transferir archivos no mayores a 200 mb usamos -max-size ‘200mb’, Esto puede ser muy útil cuando respaldamos una web pero queremos omitir su base de datos.
[user@Joncak6 ~]$ rsync -avzhe ssh --max-size'200mb' /var/www/* root@192.168.0.100:/root/respaldoweb

Eliminar archivos automáticamente después de ser transferidos o sincronizados


Supongamos que tenemos un servidor web y un servidor de respaldo, Y tenemos un escrito de respaldo diario, y no queremos guardar contenido del respaldo en el servidor web. no es necesario eliminar los archivos manualmente rsync puedo eliminarlos automáticamente usando la opción -remove-source-files.

 

Cuando se termine de transferir los archivos inmediatamente serán eliminados del servidor web.

[user@Joncak6 ~]$ rsync --remove-source-files -zvh backup.tar /tmp/backups/
backup.tar
sent 14.71M bytes  received 31 bytes  4.20M bytes/sec


total size is 16.18M  speedup is 1.10


Al finalizar vemos que el archivo tar no se encuentra en el servidor de origen.


[user@Joncak6 ~] ll backup.tar
ls: backup.tar: No such file or directory

Limitar el ancho de banda al transferir archivos con rsync


es común realizar los respaldos en servidores de producción Para evitar que el servicio a los clientes cba mermado Por poco ancho de banda es bueno limitar el respaldo, usando la opción -bwlimit limitaremos el I/O bandwidth.
[user@Joncak6 ~]rsync --bwlimit=100 -avzhe ssh  /var/lib/rpm/  root@192.168.0.100:/root/tmprpm/
root@192.168.0.100's password:
sending incremental file list
sent 324 bytes  received 12 bytes  61.09 bytes/sec
total size is 38.08M  speedup is 113347.05
Hemos limitado el respaldo a 100 kbps de velocidad de transferencia.

 

 

Rsync y Cron para respaldos incrementales automáticos


Esta sección asume que ya sabes cómo especificar el tiempo en un crontab, para más información sobre esto, puedes revisar mi publicación previa Usando cronjobs para automatizar tareas.

 

Si fuéramos a hacer un respaldo completo diario, podríamos utilizar el siguiente crontab:

rsync -au --delete respaldo1/ respaldo2
Esto sincronizará el directorio origen con el directorio destino, y tendríamos un respaldo completo en destino. Sin embargo, solo tendríamos los archivos en el mismo estado como estuvieron desde la última copia. No podríamos regresar a ningún otro punto en el tiempo. Para dejar una copia de los archivos como estaban antes de que utilizáramos los archivos, esto es, un respaldo incremental, debemos usar:
rsync -ab --backup-dir=viejo_`date +%F` --delete --exclude=viejo_* origen/ destino/
Ahora tendríamos el respaldo completo en el directorio destino, y un respaldo de los archivos como estaban antes de el último respaldo en un directorio. Si este respaldo ocurrió el 25 de febrero de 2015, entonces el directorio sería llamado viejo_2015-02-25. Por supuesto esto crearía un diferente directorio de respaldo por todos y cada uno de los días en que se ejecute, y para restaurar archivos a su estado en cierto día, necesitaríamos copiar secuencialmente los archivos de el más reciente al día que queremos restaurar sobre el la carpeta de respaldo completo, y borrar cualquier nuevo archivo que fue creado tras ese día.

 

 

Respaldo incremental rotativo con rsync y cron


Un respaldo incremental rotatorio se refiere al hecho de que reutilizamos un cierto número de carpetas de respaldo para los respaldos incrementales. En lugar de, por ejemplo, agregar la fecha completa al nombre de un directorio cuando estamos haciendo un respaldo diario, podemos utilizar solo el día de la semana. Esto crearía los directorios viejo_0, viejo_1 ... viejo_6 y entonces,usaría de nuevo la carpeta viejo_0 al comienzo de la siguiente semana. Eliminaríamos esta carpeta si existe, y la recrearíamos para el nuevo respaldo. De esta manera podríamos regresar en el tiempo hasta 7 días. La ventaja obvia de esto es que no terminaríamos con un gran número de carpetas de respaldo (y un montón de viejos datos) ya que estaríamos reutilizando el espacio y los nombres de las carpetas. Siete días puede ser muy corto, podemos usar el número del día en el mes para poder regresar alrededor de 30 días en el tiempo, o el número del día en el año para poder regresar hasta 365 días en tiempo.

 

 

Script de Ejemplo

Podemos usar un script básico para un respaldo incremental diario o semanal todo depende de como lo configures en cron, dejo un ejemplo de respaldo incremental.
#!/bin/sh


SUFIJO=$(date +%j)


# Borrar el directorio en el servidor remoto vía SSH
# ssh respaldo_remoto 'ls Respaldos/mi_trabajo/respaldo_'$SUFIJO' && rm -r Respaldos/mi_trabajo/respaldo_'$SUFIJO


# Borrar el directorio en el servidor remoto vía SFTP
sftp -b /dev/fd/0 respaldo_remoto <<EOF
cd Respaldos/mi_trabajo
rmdir respaldo_$SUFIJO
exit
EOF


# Actualizar la información, creando una carpeta de respaldo e ignorando el
# el resto de los directorios de respaldo
rsync -ab --recursive --files-from='a_respaldar.txt' --backup-dir=respaldo_$SUFIJO --delete --filter='protect respaldo_*' /home/juan/ respaldo_remoto:Respaldos/mi_trabajo/
Recuerden añadir el script en crontab o en una de las carpetas de cron.
crontab -e
Y añadir la ubicación de donde tenemos el script.
/home/user/bin/respaldo_auto.sh
Conclusiones
Hemos visto cómo utilizar rsync con las opciones más útiles, en conjunto con herramientas como cron y scripts en bash, python tendremos todo lo necesario para hacer nuestros respaldos sin necesita de herramientas de terceros, en otra entrada hablaré de los tipos de respaldos y como usarlos con rsync adicional añadir scripts mucho más complejos.

¿Te ha gustado y ayudado este Tutorial?
Puedes premiar al autor pulsando este botón para darle un punto positivo
  • -
  • 0
10
VOTA
5
100%
4
0%
3
0%
2
0%
1
0%

  Información

  •   Publicado nov 16 2015 18:58
  •   Actualizado abr 18 2017 16:19
  •   Visitas 5.2K
  •   Nivel
    Profesional



Tutoriales Relacionados


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!
Demuestra que eres experto!
  ESCRIBIR TUTORIAL
Suscribirse