Cómo mantener carpetas sincronizadas en tiempo real con lsyncd

Si necesitas tener sincronizados directorios, sea de manera local o entre servidores casi en tiempo real, lsyncd es la solución.

Hace unas semanas tuve un reto en el trabajo, necesitaba mantener dos directorios, en este caso, en dos servidores diferentes, replicadas casi en tiempo real o con muy poca latencia.

La solución que estaba montada antes, para hacer la réplica era "rsync" con un cron, el problema con esto es que el mínimo de tiempo para correr un cron es un minuto, lo cual, dista mucho del concepto de "tiempo real".

Investigando un poco me encontré con el paquete lsyncd.

axkibe/lsyncd
Lsyncd (Live Syncing Daemon) synchronizes local directories with remote targets - axkibe/lsyncd

Básicamente lo que hace lsyncd es replicar contenidos entre directorios, sean estos locales o remotos y para hacerlo mira los eventos del kernel. Si algo cambia, inmediatamente dispara el trabajo de sincronización.

Cuando se instala, escribe un archivo de configuración que guarda en el siguiente directorio:

/etc/lsyncd.conf

En mi caso, la configuración fue algo parecido a esto:

settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd-status.log",
statusInterval = 1,
insist = true,
}

-- Slave server configuration

sync {
default.rsync,
source="/var/www/html/wordpress",
target="remote_server:/var/www/html/wordpress",
}

rsync = {
compress = true,
acls = true,
verbose = true,
owner = true,
group = true,
perms = true,
delay = 1,
rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
}

Acá hay unos valores que debemos retocar, por ejemplo el "delay = 1," si esto no se especifica, por defecto, cuando hay un cambio, lsyncd esperará cinco segundos antes de ejecutar el rsync para replicar los cambios.

El "source" y el "target" deben especificarse, lo mismo la ruta para el log, de esta manera, si algo no anda bien podremos consultar en algún lado que es lo que sucedió.

Cómo ves, este paquete es simple pero poderoso, en nuestro caso, nos ayudó a tener sincronizados varios servidores cuando tuvimos que improvisar medio rápido un cluster de Web Servers de alta disponibilidad.