Configurar replicacion de archivos en RHEL/CentOS/SL 6/7 con lsyncd y csync2

csync2

Configurar replicacion de archivos en RHEL/CentOS/SL 6/7 con lsyncd y csync2

Introduccion

En caso de que necesitemos sincronizar en tiempo cercano al real directorios entre 2 o mas servidores podemos utilizar las herramientas lsync y csync2
csync2 es el encargado de la sincronizacion o copia como tal
lsync se encarga de detectar cualquier cambio en los directorios y de notificar a csync2 para que este los sincronice
En este documento veremos como instalar y configurar estas 2 herramientas para sincronizar entre 3 nodos el directorio /home y /web

Instalacion de los paquetes necesarios

RHEL/CentOS/SL 6

Para instalar lsyncd y csync2 en CentOS/RHEL 6 solo es necesario el repositorio EPEL y se instala directo vía yum como se detalla abajo.
Configurar el repositorio EPEL

rpm -Uhv https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

Instalar los paquetes necesarios

yum install csync2 lsyncd xinetd

RHEL/CentOS/SL 7

Para versiones de RHEL 7 es necesario descargar la versión de csync2 que es para Fedora22, la misma se puede descargar desde la siguiente URL http://rpm.pbone.net/index.php3/stat/3/limit/1/srodzaj/1/dl/40/search/csync2/field%5B%5D/1/field%5B%5D/2
Una vez que descargamos instalamos con el comando:

yum install ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/22/Everything/x86_64/os/Packages/c/csync2-1.34-15.fc22.x86_64.rpm

Configurar el repositorio EPEL

rpm -Uhv https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Instalar los paquetes necesarios

yum install csync2 lsyncd xinetd

Los pasos anteriores son los únicos que difieren en cuanto a la versión 7 de la versión 6, una vez instalado los pasos son los mismos en ambas versiones

Configurar csync2

Habilitar el servicio csync2 bajo xinetd:

Para habilitar el servicio csync2 a traves de xinetd

sed -i.bak 's#yes#no#g' /etc/xinetd.d/csync2

Luego levantamos el servicio xinetd

service xinetd start

Generar los .key para la autenticacion entre los servidores

Para la autenticacion entre los servidores es necesario crear un archivo .key, el mismo lo podemos crear con el comando csync2 y la opcion -k:

csync2 -k /etc/csync2/csync2.key

Configurar alias y directorios

Podemos crear varias configuraciones de csync2 que se encarguen de sincronizar 1 o mas directorios, en el siguiente ejemplo crearemos un alias home que se encarga de sincronizar el /home y otro que sincronizara el /web de nombre web
Para configurar csync2 debemos crear el archivo /etc/csync2/csync2_<alias>.cfg, cargando lo siguiente:

vim /etc/csync2/csync2_home.cfg

nossl * *;
group web
{
        host node1;
        host node2;
        host node3;
        key /etc/csync2/csync2.key;
        include /home/;
        exclude *.log;
        auto younger;
}

vim /etc/csync2/csync2_web.cfg

nossl * *;
group web
{
        host node1;
        host node2;
        host node3;
        key /etc/csync2/csync2.key;
        include /web/;
        auto younger;
}

Se debe tener en cuenta que el nombre de host (en este caso node1) debe ser el hostname o fqdn de cada servidor

Copiar los archivos del csync a los otros nodos:

Copiamos a los demas nodos:

scp /etc/csync2/* node2:/etc/csync2

scp /etc/csync2/* node3:/etc/csync3

Iniciar la replicacion de csync2

Para la sincronizacion inicial es necesario correr el siguiente comando por cada alias

csyncs2 -xXrvB -C <alias>

Ej:

csyncs2 -xXrvB -C home

Configurar lsyncd

Crear archivos de configuracion

Se deben agregar las siguientes lineas al archivo /etc/lsyncd.conf

vim /etc/lsyncd.conf

settings {
        logident        = "lsyncd",
        logfacility     = "user",
        logfile         = "/var/log/lsyncd.log",
        statusFile      = "/var/log/lsyncd_status.log",
        statusInterval  = 1
}

initSync = {
        delay = 1,
        maxProcesses = 1,
        action = function(inlet)
                local config = inlet.getConfig()
                local elist = inlet.getEvents(function(event)
                        return event.etype ~= "Init"
                end)
                local directory = string.sub(config.source, 1, -2)
                local paths = elist.getPaths(function(etype, path)
                        return "\t" .. config.syncid .. ":" .. directory .. path
                end)
                log("Normal", "Processing syncing list:\n", table.concat(paths, "\n"))
                spawn(elist, "/usr/sbin/csync2.sh", "-C", config.syncid, "-x")
        end,
        collect = function(agent, exitcode)
                local config = agent.config
                if not agent.isList and agent.etype == "Init" then
                        if exitcode == 0 then
                                log("Normal", "Startup of '", config.syncid, "' instance finished.")
                        elseif config.exitcodes and config.exitcodes[exitcode] == "again" then
                                log("Normal", "Retrying startup of '", config.syncid, "' instance.")
                                return "again"
                        else
                                log("Error", "Failure on startup of '", config.syncid, "' instance.")
                                terminate(-1)
                        end
                        return
                end

                local rc = config.exitcodes and config.exitcodes[exitcode]
                if rc == "die" then
                        return rc
                end
                if agent.isList then
                        if rc == "again" then
                                log("Normal", "Retrying events list on exitcode = ", exitcode)
                        else
                                log("Normal", "Finished events list = ", exitcode)
                        end
                else
                        if rc == "again" then
                                log("Normal", "Retrying ", agent.etype, " on ", agent.sourcePath, " = ", exitcode)
                        else
                                log("Normal", "Finished ", agent.etype, " on ", agent.sourcePath, " = ", exitcode)
                        end
                end
                return rc
        end,

        init = function(event)
                local inlet = event.inlet;
                local config = inlet.getConfig();
                log("Normal", "Recursive startup sync: ", config.syncid, ":", config.source)
                spawn(event, "/usr/sbin/csync2.sh", "-C", config.syncid, "-xXrvvB")
        end,

        prepare = function(config)
                if not config.syncid then
                        error("Missing 'syncid' parameter.", 4)
                end
                local c = "csync2_" .. config.syncid .. ".cfg"
                local f, err = io.open("/etc/csync2/" .. c, "r")
                if not f then
                        error("Invalid 'syncid' parameter: " .. err, 4)
                end
                f:close()
        end
}

local sources = {
        ["/home"] = "home",
        ["/web"] = "web"
}

for key, value in pairs(sources) do
        sync {initSync, source=key, syncid=value}
end

No olvidar cambiar el “home” por el alias que le asignara a cada directorio, este alias debe tener su configuracion correspondiente en la siguiente ruta:

/etc/csync2/csync2_<alias>.cfg

Ej:

/etc/csync2/csync2_home.cfg

Agregar la ruta del archivo de configuracion de lsync

Debemos agregar la ruta del archivo creado en el paso previo en el archivo /etc/sysconfig/lsyncd, eso lo podemos hacer con el comando sed:

sed -i.bak 's#^LSYNCD_OPTIONS=.*#LSYNCD_OPTIONS=" /etc/lsyncd.conf"#g' /etc/sysconfig/lsyncd

Crear el Script que ejecutara el lsync

Para sincronizar las carpetas el lsync intentara ejecutar el script /usr/sbin/csync2.sh, el cual debemos crear:

cat <<EOF > /usr/sbin/csync2.sh
#!/bin/bash

/usr/sbin/csync2 $@

exit 0

## Se agrega el exit 0 para que no se detenga el lsyncd al dar un error
EOF

Dar permisos de ejecución al Script

chmod 755 /usr/sbin/csync2.sh

Habilitar e Iniciar el servicio lsyncd:

Habilitamos el servicio para que incie junto con el Sistema Operativo

chkconfig lsyncd on
chkconfig xinetd on

Luego levantamos el servicio

service lsyncd start

Deja un comentario