Sincronizando el almacén de datos

Hoy trateremos de mejorar un aspecto de nuestro servidor casero, ése del que os hablé hace un tiempo, primero montando el hardware y después añadiéndole servicios.

Esta vez sólo vamos a añadir un pequeño extra, pero que hará que estemos un poco más tranquilos ya que ahora mismo no tenemos un backup de nuestro almacén de datos. Yo ahí tengo toda mi colección personal de CDs comprimida sin pérdida, documentación que he ido recopilando y realizando durante mucho tiempo y por supuesto no quiero que nada de eso se pierda.

Aprovechando que este almacén es de sólo 1TB y que me agencié un disco de similar tamaño pero interno para el hermano mayor de mi servidor, pensé que sería buena idea orquestar algún tipo de respaldo periódico. Mi primera aproximación sería crear una tarea al arrancar la máquina para que se sincronizara con el servidor, ya que el uso que hago de este ordenador es más esporádico y bastaría con este planteamiento. El problema es que de un tiempo a esta parte su ACPI funciona perfectamente y cuando termino de trabajar con él pulso el botón de apagado y entra en hibernación instantáneamente, por lo que la idea del script en el arranque hay que refinarla un poco.

Antes de plantear el protocolo vamos a ver cuál es la orden concreta a ejecutar para esta sincronización y cómo montaremos nuestro disco para tenerlo disponible en el momento de la sincronización. Cuando tengáis elegido el disco de backup lo primero será activarlo desde el inicio, para ello ejecutamos la siguiente orden y buscamos nuestro dispositivo:

# blkid
/dev/sda1: LABEL="SyncStore" UUID="424axxxx-e6bf-xxxx-af2a-xxxxxd9f16d1" TYPE="ext4" PARTUUID="0004xxxx-xx"

Como véis, en mi caso, éste es el primero en listarse, sda. Ahora crearemos un punto de montaje que exprese para qué se va a utilizar:

# mkdir /mnt/syncstore

Y simplemente lo añadimos al archivo /etc/fstab:

[...]
# SyncStore
UUID=424axxxx-e6bf-xxxx-af2a-xxxxxd9f16d1  /mnt/syncstore  ext4  defaults  0  2  

Si ejecutamos el comando mount -a podremos ver nuestra partición de 1TB operativa para nuestro siguiente paso.

Supongo que más de una vez habréis trabajado con rsync, pues bien, yo os voy a contar cómo suelo utilizarlo yo. Mi primer paso es construir el comando a partir de un --dry-run ya que como estemos añadiendo un --delete y por un error de esos que nunca suceden, confundamos el origen con el destino la habremos liado pardísima. Luego están el resto de modificadores, aquí ya depende de cada tarea, a veces necesitaremos preservar los permisos, incluso los usuarios, por lo que os aconsejo que os dirijáis a la completísima página de manual de este potente comando para configurarlo de acuerdo a vuestras necesidades. Una vez compuesta esta parte ya sólo queda determinar el origen y el destino, incluso podremos añadir, como en este caso, un --exclude para saltarnos algún tipo de archivo o directorio completo:

# /usr/bin/rsync -ravz --dry-run --delete --exclude="lost+found" [email protected]:/mnt/almacen/ /mnt/syncstore/

Con este comando y tras mucho rato, dependiendo de la velocidad de la red y del rendimiento de los discos duros, tendremos un primer backup de nuestro almacén. El siguiente paso es articular las tareas periódicas.

El principal problema aquí es cómo programar estas tareas. Como ya os he comentado es raro que reinicie mi ordenador de escritorio, aunque vamos a utilizar una herramienta pensada para portátiles y ordenadores de sobremesa, anacron. La idea es muy sencilla, establecemos una tarea diaria y si no se puede ejecutar en el momento en el que se invocan estos scripts, cuando el ordenador arranque lanzará la acción postpuesta.

Para activar este comportamiento modificaremos el archivo /etc/anacrontab añadiendo la siguiente variable y dos líneas al final:

[...]
START_HOURS_RANGE=17-23  
[...]
# Job to backup main dino store
1               30      backup.syncstore        /usr/bin/rsync -raz --delete --exclude="lost+found" [email protected]:/mnt/almacen/ /mnt/syncstore/  

Con la variable le diremos al sistema que la tarea deberá ejecutarse entre las cinco de la tarde y las once de la noche, siempre que el sistema decida lanzarla.

Cada línea correspondiente a un trabajo en este fichero se compone de cuatro partes. La primera de ellas indica el periodo de tiempo con el que se compara para decidir si se debe lanzar el comando. Anacron se activará al iniciar la máquina y comprobará la fecha correspondiente a la tarea backup.syncstore que está guardada en /var/spool/anacron/, restará la fecha actual de la que marca este archivo y si la diferencia es mayor que este número lanzará la tarea.

Si se decide que el trabajo debe ser ejecutado entonces entra en juego el segundo campo. Como véis yo lo tengo en treinta, esto quiere decir que anacron esperará treinta minutos para lanzarlo, esto se pensó así para no sobrecargar el arranque de la máquina.

El tercer campo es el nombre de la tarea, debe ser único, ya que es el que se utiliza para guardar la marca de tiempo que hemos explicado más arriba. El campo que nos queda es el comando en sí, éste ya lo hemos explicado al principio del artículo.

Yo he hecho pruebas al configurar el ejemplo y, efectivamente, cuando reinicio mi ordenador se lanza el comando sin problemas, pero cuando lo despierto de una hibernación el efecto no es el deseado. Por ahora no me importa ya que de vez en cuando siempre le hago un reinicio completo a la máquina, pero para asegurarme que sincronizo mi almacén de datos cada día quizás debería añadir una entrada en el propio crontab, pero esa parte creo que la tenéis más que dominada.

Hoy vamos a terminar con una pequeña gran descarga, enchufad vuestros equipos de música a un volumen brutal y elegid el Testify de los angelinos Rage Against The Machine del disco de 1999 Battle Of Los Angeles. Todavía resuenan en mis oídos sus acordes en la última (y única) oportunidad que tuve de verlos en Getafe allá por el año 2008, grandérrimos.

Enjoy the summer!