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.
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.
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.
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
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.
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 rsyncPasamos 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.
Empezamos verificando que rsync esté instalado.
[user@Joncak6 ~]$ which rsync /usr/bin/rsyncCrearemos 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 file9Hacemos respaldo.
Para respaldar los archivos al respaldo2 usamos:
rsync -r respaldo1/ respaldo2El 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 respaldo2En caso de crear un softlink de un archivo del directorio 1
ln -s file30 file100Al utilizar rsync con -r no sincronizará el softlink en este caso usamos:
rsync -a respaldo1/ respaldo2Si 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.00Nos 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/solveticDespues sincronizamos desde el respaldo1
rsync -avz --delete respaldo1/ respaldo2Vemos 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.05Hemos 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/ respaldo2Esto 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.
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 -eY añadir la ubicación de donde tenemos el script.
/home/user/bin/respaldo_auto.sh