Sincronización de ficheros bidireccional con Unison

¿Por qué usar Unison?

En ocasiones queremos tener archivos replicados en varios equipos, por ejemplo para tener una copia de seguridad de nuestros datos. En este caso podríamos utilizar rsync, ya que es uno de los mejores para ello pero sólo trabaja en una dirección y si queremos hacer una sincronización de archivos en dos direcciones, se complica la configuración.

Es por ello que hoy quiero presentarte Unison, un software de réplica bidireccional, de manera que con una sola configuración, podemos hacer que se sincronicen archivos en ambas direcciones. Por ejemplo, si tienes dos servidores web con balanceo de carga o alta disponibilidad, podrás tener los archivos de tu web sincronizados perfectamente. Si además quisieras sincronizar la base de datos de tu web, puedes leer mi otro post “Replicación de base de datos MariaDB con Galera Cluster“.

Características básicas de Unison

  • Es una herramienta de software libre bajo licencia General Public License (GPL).
  • Funciona bajo OSX, Unix, Linux y Windows.
  • Sincronización entre diferentes sistemas operativos. Puedes sincronizar ficheros de Linux con ficheros de Windows.
  • La sincronización se realiza de forma segura a través de conexión SSH cifrada.

 

Instalación y configuración de Unison en dos servidores Linux

En nuestro caso, tenemos dos servidores web con CentOS 7 y panel Plesk para gestionar nuestras webs:

  • servidorweb1 – IP: 10.0.0.1
  • servidorweb2 – IP: 10.0.0.2

Nos conectamos a servidorweb1 por SSH y realizamos la instalación de Unison:

# yum install ocaml ocaml-camlp4-devel ctags ctags-etags

 

Instalamos wget para poder descargar ficheros:
# yum install wget

Descargamos la última versión de Unison. Para ello, vamos antes a esta dirección y copiamos el nombre de la última versión. En nuestro caso es unison-2.48.4.tar.gz.

Directorio de descarga de Unison

 

 

Una vez conocemos el nombre de fichero, procedemos con la descarga:

# wget http://www.seas.upenn.edu/~bcpierce/unison/download/releases/stable/unison-2.48.4.tar.gz

Descomprimimos el paquete:

# tar xvfz unison-2.48.4.tar.gz

Entramos en la carpeta descomprimida:

# cd src

Compilamos el proyecto para generar el ejecutable:

# make

Copiamos el ejecutable en las siguientes dos ubicaciones:

# cp -v unison /usr/local/sbin/
# cp -v unison /usr/bin/

Nos desplazamos al directorio superior para eliminar directorio actual y el fichero descargado:

# cd ..
# rm -rf src
# rm -rf unison*

* Ahora repetimos exactamente los mismos pasos en servidorweb2.

Copiando clave pública/privada del servidorweb1 al servidorweb2

Por defecto, si lanzamos la sincronización, nos pedirá la contraseña de root de la otra máquina y habrá que hacer siempre una acción manual, de manera que no podríamos automatizarlo. Para evitar esto, debemos crear una clave pública y privada en el primer servidor, y después copiarla al segundo servidor.

Generamos clave:

# ssh-keygen -t dsa

Pulsamos Intro tres veces sin escribir nada en lo que nos pregunte.

Crear clave privada

 

 

Damos permisos:

# chmod 755 /root/.ssh

Ya tenemos la clave generada, ahora la copiamos al servidorweb2:

# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.2

Al ser la primera vez que realizamos una conexión al segundo servidor, saldrá una advertencia, escribimos “yes” y acto seguido pedirá la contraseña de “root” del servidorweb2. La escribimos y pulsamos Intro.

Copiar clave privada a servidor 2

 

 

Probando la sincronización

Ya tenemos todo preparado. Vamos a realizar una prueba de sincronización. Nosotros queremos sincronizar solamente una de nuestras webs, que se ubica en /var/www/vhosts/nombre_cliente/httpdocs/nombre_proyecto, por lo tanto lanzaríamos el siguiente comando en servidorweb1:

# unison -batch /var/www/vhosts/nombre_cliente/httpdocs/nombre_proyecto/ ssh://10.0.0.2//var/www/vhosts/nombre_cliente/httpdocs/nombre_proyecto/

Ahora podéis ir al servidorweb2 y comprobar que se ha copiado todo el contenido de la carpeta especificada. Hasta ahora, vemos que sincroniza en una dirección, pero os preguntaréis ¿cómo hacemos para que sincronice a la inversa? Pues de la misma manera. Crea un fichero de prueba en el servidorweb2 y lanza de nuevo el mismo comando en webserver1. Podrás comprobar que se copia el fichero desde servidorweb2 a servidorweb1 perfectamente.

 

Fichero de configuración con todas las propiedades

Para reducir el comando y no tener que especificar tantos parámetros, lo ideal es crear un fichero de configuración para que Unison coja todos los parámetros desde ahí. Por ejemplo, nosotros no queremos que sincronice las carpetas “application/config” ni “application/logs”, porque queremos que estos datos sean distintos en cada servidor.

# vi /root/.unison/default.prf

Copiamos todo este contenido:

# Unison preferences file
# Roots of the synchronization
root = /var/www/vhosts/nombre_cliente/httpdocs/nombre_proyecto
root = ssh://10.0.0.2//var/www/vhosts/nombre_cliente/httpdocs/nombre_proyecto



# rutas a sincronizar. Si no se especifica, se cogerá únicamente el path establecido en las directivas root anteriores.
#path = current
#path = common
#path = .carpeta/archivo.html



# Ignoramos los directorios/ficheros a ignorar siguiente las siguientes expresiones
#ignore = Path carpeta1 ## ignora /var/www/carpeta1
#ignore = Path carpeta1/* ## ignora /var/www/carpeta1/*
#ignore = Path */carpeta2 ## ignora /var/www/carpeta1/carpeta2, pero no /var/www/a/b/c/carpeta2
#ignore = Name *carpeta1 ## ignora todos los ficheros/directorios que terminan por "carpeta1".
#ignore = Name carpeta1* ## ignora todos los ficheros/directorios que empiezan por "carpeta1"
#ignore = Name *.txt ## ignora todos los ficheros con extensión .txt



ignore = Path application/config</pre>
<pre>ignore = Path application/logs</pre>
<pre>
# When set to true, this flag causes the user interface to skip
# asking for confirmations on non-conflicting changes. (More
# precisely, when the user interface is done setting the
# propagation direction for one entry and is about to move to the
# next, it will skip over all non-conflicting entries and go
# directly to the next conflict.)
auto=true



# When this is set to true, the user interface will ask no
# questions at all. Non-conflicting changes will be propagated;
# conflicts will be skipped.
batch=true



# !When this is set to true, Unison will request an extra
# confirmation if it appears that the entire replica has been
# deleted, before propagating the change. If the batch flag is
# also set, synchronization will be aborted. When the path
# preference is used, the same confirmation will be requested for
# top-level paths. (At the moment, this flag only affects the
# text user interface.) See also the mountpoint preference.
confirmbigdel=true



# When this preference is set to true, Unison will use the
# modification time and length of a file as a `pseudo inode
# number' when scanning replicas for updates, instead of reading
# the full contents of every file. Under Windows, this may cause
# Unison to miss propagating an update if the modification time
# and length of the file are both unchanged by the update.
# However, Unison will never overwrite such an update with a
# change from the other replica, since it always does a safe
# check for updates just before propagating a change. Thus, it is
# reasonable to use this switch under Windows most of the time
# and occasionally run Unison once with fastcheck set to false,
# if you are worried that Unison may have overlooked an update.
# The default value of the preference is auto, which causes
# Unison to use fast checking on Unix replicas (where it is safe)
# and slow checking on Windows replicas. For backward
# compatibility, yes, no, and default can be used in place of
# true, false, and auto. See the section "Fast Checking" for more
# information.
fastcheck=true



# When this flag is set to true, the group attributes of the
# files are synchronized. Whether the group names or the group
# identifiers are synchronizeddepends on the preference numerids.
group=true



# When this flag is set to true, the owner attributes of the
# files are synchronized. Whether the owner names or the owner
# identifiers are synchronizeddepends on the preference
# extttnumerids.
owner=true



# Including the preference -prefer root causes Unison always to
# resolve conflicts in favor of root, rather than asking for
# guidance from the user. (The syntax of root is the same as for
# the root preference, plus the special values newer and older.)
# This preference is overridden by the preferpartial preference.
# This preference should be used only if you are sure you know
# what you are doing!
prefer=newer



# When this preference is set to true, the textual user interface
# will print nothing at all, except in the case of errors.
# Setting silent to true automatically sets the batch preference
# to true.
silent=true



# When this flag is set to true, file modification times (but not
# directory modtimes) are propagated.
times=true

Ejecutando Unison con archivo de configuración

Ahora que ya tenemos el fichero default.prf creado, podemos ejecutar la sincronización simplemente así:

# unison default
  • “default” es el nombre de archivo que hemos creado con la configuración, podríamos crear más y lanzar cada uno de ellos cambiando simplemente el parámetro “default”.

 

Programando Unison como tarea programda con el cron de Linux

En nuestro caso trabajamos con Plesk, por lo que es muy sencillo crear la tarea programada.

Vamos a “Herramientas y configuración/Tareas programadas”.

Tareas programadas Unison

 

 

Pulsamos en “Añadir una tarea” y rellenamos el formulario con nuestros datos. Los campos más importantes son “Comando”, donde pondremos “unison default” como he explicado antes y cada cuanto tiempo queremos que se ejecute. Depende de vuestras necesidades, podéis poner que se ejecute la sincronización 1 vez al día, cada hora, cada minuto…

Tarea programada cron Unison Plesk

 

En caso de trabajar con cPanel, también es muy sencillo. Simplemente, vamos a “Trabajos de cron” y creamos la tarea:

Configuración cPanel para Unison

 

 

Cron cPanel para Unison

 

Siguiendo estos pasos tendrás tu réplica de ficheros automática en ambas direcciones. ¿Te ha servido el artículo? ¿Conoces otras maneras y herramientas para realizar una sincronización bidireccional? Estamos encantados de conocer otras propuestas, ¡déjanos tu comentario!

Sincronización de ficheros bidireccional con Unison
Valora este post

Rubén González Platas

Programador web. Ayudo a empresas y emprendedores a crear su web corporativa y canal de venta online. ¿Tienes un proyecto en mente y no sabes cómo llevarlo a cabo? Contacta conmigo y te ayudaré.

Deja un comentario