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
=)