rsync + Inotify = lsyncd

Rsync es una herramienta genial para sincronizar archivos y directorios tanto a nivel de máquina como en red. El problema de rsync es que en sincronizaciones de mucho tamaño y/o número de archivos, el proceso resultante de generar la lista inicial de ficheros para conocer los cambios a transferir puede llegar a demorarse mucho. Estoy hablando del famoso «sending incremental file list«.

Por otra parte tenemos Inotify (inode notify), que es un subsistema del kernel Linux que permite la notificación de cambios a nivel de filesystem. Esto permite reindexar cambios del sistema de ficheros sin necesidad de hacer un rescan de todo el FS cada X tiempo.

Viendo esto, la combinación de la versatilidad de rsync para hacer copias incrementales y sincronización de archivos y directorios, junto con la capacidad de Inotify para evitar tener que hacer un «barrido» de los datos a sincronizar en cada ejecución es perfecta. Aquí es donde entra lsyncd, que no es otra cosa que la combinación de rsync junto con el sistema de notificaciones de Inotify.

Instalación de lsyncd

Podemos instalar lsyncd por repositorio tanto de Debian/Ubuntu como RedHat/CentOS y sus derivados.

Debian:

# apt-get install lsyncd

CentOS (en el repositorio de RPMForge):

# wget http://pkgs.repoforge.org/lsyncd/lsyncd-2.1.4-1.el6.rf.x86_64.rpm
# yum install lsyncd-2.1.4-1.el6.rf.x86_64.rpm

Sobre todo tened en cuenta que conforme han ido avanzando las versiones de lsyncd la configuración varía bastante entre versiones (según la que instaléis, revisad la documentación correspondiente. En este caso vamos a trabajar con la versión 2.1.

Configuración de lsyncd

Los ficheros de configuración se gestionan con el lenguaje de programación Lua.

En el directorio «examples» de /usr/share/doc encontraréis ejemplos base según como queráis utilizar lsyncd (como rsync, como rsync + ssh, como copia de archivos locales, etc).

# ls -l /usr/share/doc/lsyncd-2.1.4/examples/
total 28K
-rw-r--r--. 1 root root  574 Aug  9  2012 lecho.lua
-rw-r--r--. 1 root root 1.1K Aug  9  2012 lbash.lua
-rw-r--r--. 1 root root 2.3K Aug  9  2012 lgforce.lua
-rw-r--r--. 1 root root 2.7K Aug  9  2012 limagemagic.lua
-rw-r--r--. 1 root root 2.6K Aug  9  2012 lpostcmd.lua
-rw-r--r--. 1 root root  213 Aug  9  2012 lrsync.lua
-rw-r--r--. 1 root root  204 Aug  9  2012 lrsyncssh.lua

El siguiente ejemplo muestra como sincronizar con rsync dos directorios locales, generando los logs en «/var/log/lsyncd.log«, deshabilitando el borrado en destino cuando se borra en local y aplicando parámetros personalizados de rsync:

# cat /etc/lsyncd/lsyncd-test.lua 
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings {
	logfile = "/var/log/lsyncd.log",
	statusFile = "/tmp/lsyncd.stat",
	statusInterval = 1,
}

sync {
    default.rsync,
    source = "/var/tmp/test",
    target = "/var/tmp/test2",
    delete   = false,
    rsync     = {
        archive  = true,
        compress = false,
	_extra   = { '--ignore-existing' }

    }
}

Toda la documentación de la versión 2.1.X de lsyncd la podéis encontrar en el sitio GitHub del proyecto.

Probando lsyncd

Para arrancar el demonio de lsyncd simplemente le pasamos el archivo de configuración:

# lsyncd /etc/lsyncd/lsyncd-test.lua

Si se quiere evitar el modo daemon y ejecutarlo para ver todo en stdout/stderr podemos añadir el parámetro –nodaemon:

OPTIONS:
  -delay SECS         Overrides default delay times
  -help               Shows this
  -insist             Continues startup even if it cannot connect
  -log    all         Logs everything (debug)
  -log    scarce      Logs errors only
  -log    [Category]  Turns on logging for a debug category
  -logfile FILE       Writes log to FILE (DEFAULT: uses syslog)
  -nodaemon           Does not detach and logs to stdout/stderr
  -pidfile FILE       Writes Lsyncds PID into FILE
  -runner FILE        Loads Lsyncds lua part from FILE
  -version            Prints versions and exits

Para verificar su funcionamiento simplemente añadimos un archivo a la ruta origen. Pasados unos segundos veremos como se sincroniza en el directorio de destino y queda registrado en el log:

# touch /var/tmp/test/foo.txt
Fri Mar  6 06:32:57 2015 Normal: recursive startup rsync:
 /var/tmp/test/ -> /var/tmp/test2/
Fri Mar  6 06:32:57 2015 Normal: Startup of "/var/tmp/test/" finished.
Fri Mar  6 06:35:06 2015 Normal: Calling rsync with filter-list
 of new/modified files/dirs
/foo.txt
/
Fri Mar  6 06:35:06 2015 Normal: Finished a list after exitcode: 0

2 comentarios en “rsync + Inotify = lsyncd

  1. Lo estoy probando y funciona bien, si creo un nuevo file en el origen, este se crea también en el destino, PERO si se modifica un file ya existente en el origen, este NO se modifica también en el destino.

    uso esta configuración:

    settings {
    logfile = «/var/log/lsyncd.log»,
    statusFile = «/tmp/lsyncd.stat»,
    statusInterval = 1,
    }

    sync {
    default.rsync,
    source = «/home/informatica/prueba»,
    target = «/media/informatica/Datos/compartidos/prueba»,
    delete = true,
    rsync = {
    archive = true,
    compress = false,
    _extra = { ‘–ignore-existing’ }

    }
    }

  2. Puede que tu problema este por el parámetro extra que le pasas a rsync, en concreto este:

    _extra = { ‘–ignore-existing’ }

    No he usado la herramienta pero si rsync, entiendo que con ese parámetro lo que le dice a rsync es que ignore los archivos existentes en destino, prueba quitandolo y nos cuentas.

    Un saludo

Comments are closed.