Este artículo explica cómo configurar Lsyncd herramienta tanto localmente como a través de SSH para mantener los directorios sincronizados.
Lsyncd significa Live Syncing Mirror Daemon, y es una herramienta utilizada en los sistemas Linux para mantener los directorios sincronizados. Estos directorios se pueden encontrar de forma local, dentro de la misma máquina, o de forma remota, en diferentes máquinas. Para la sincronización remota, este artículo se centra en el uso de SSH para lograrlo.
La ventaja de usar Lsyncd es que es una solución gratuita y liviana que no afectará el rendimiento del sistema de archivos. Supervisa los archivos periódicamente en busca de cambios y luego usa rsync
para realizar la sincronización.
Requisitos
Para Lsyncd para que funcione correctamente necesitas tener rsync
instalado.
Para instalar rsync
en los sistemas CentOS, Fedora o Red Hat use:
yum install rsync
Para sistemas Ubuntu o Debian use:
apt-get update
apt-get install rsync
Instalar Lsyncd
Para instalar lsyncd
en un sistema CentOS, Fedora o Red Hat es necesario habilitar el repositorio EPEL antes de instalar lsyncd
. Los siguientes comandos se utilizan para realizar la instalación:
yum install epel-release
yum install lsyncd
Para un sistema Ubuntu o Debian, el lsyncd
La herramienta está incluida en los repositorios predeterminados, por lo que los siguientes comandos deberían ser suficientes para la instalación:
sudo apt-get update
sudo apt-get install lsyncd
Para confirmar que la instalación fue exitosa y verificar la versión instalada, use el siguiente comando:
lsyncd -version
Archivos de configuración de Lsyncd
El archivo de configuración predeterminado para Lsyncd se crea automáticamente en /etc/lsyncd.conf
cuando se complete la instalación.
Este archivo contiene todos los parámetros utilizados para realizar la sincronización entre directorios, ya sea de forma local o remota.
Para archivos de configuración de ejemplo, puede revisar el contenido en /usr/share/doc/lsyncd*/examples/
(el * se refiere a la versión de Lsyncd instalada).
cd /usr/share/doc/lsyncd-2.2.2/examples/
ls -lh
total 40
-rw-r--r--. 1 root root 715 Feb 16 2017 lalarm.lua
-rw-r--r--. 1 root root 1055 Feb 16 2017 lbash.lua
-rw-r--r--. 1 root root 534 Feb 16 2017 lecho.lua
-rw-r--r--. 1 root root 3376 Feb 16 2017 lftp.lua
-rw-r--r--. 1 root root 2278 Feb 16 2017 lgforce.lua
-rw-r--r--. 1 root root 2737 Feb 16 2017 limagemagic.lua
-rw-r--r--. 1 root root 2770 Feb 16 2017 lpostcmd.lua
-rw-r--r--. 1 root root 211 Feb 16 2017 lrsync.lua
-rw-r--r--. 1 root root 204 Feb 16 2017 lrsyncssh.lua
-rw-r--r--. 1 root root 4047 Feb 16 2017 lsayirc.lua
A los efectos de este artículo, los archivos de configuración que pueden ser ejemplos útiles son lrsync.lua
para la sincronización local y lrsyncssh.lua
para sincronización remota.
Un archivo de configuración tendrá la siguiente estructura:
cat /usr/share/doc/lsyncd-2.2.2/examples/lrsync.lua
[...]
-- User configuration file for lsyncd.
-- Simple example for default rsync.
settings {
statusFile = "/tmp/lsyncd.stat",
statusInterval = 1,
}
sync{
default.rsync,
source="src",
target="trg"
}
Como se mencionó anteriormente, Lscynd usa el rsync
herramienta para realizar la sincronización, por lo que puede usar el rsync
banderas para personalizar el proceso agregando un rsync
parámetro para sync
declaración:
[...]
sync {
default.rsync,
source="src",
target="trg",
rsync = {
archive = false,
compress = true,
links = false,
owner = false,
perms = false,
verbose = true
}
}
[...]
Además, es importante tener en cuenta que Lsyncd agrega los eventos durante un valor predeterminado de 20 segundos antes de verificar si se han realizado cambios. Este tiempo se puede modificar usando el delay
parámetro en sync
sección del archivo de configuración:
sync {
default.rsync,
source = "src",
target = "trg",
delay = 5,
}
Sincronizar directorios locales
Para sincronizar el contenido del directorio local /path/source_dir
al directorio local /path/destination_dir
necesitamos realizar algunos cambios en el archivo de configuración y se recomienda crear un archivo de registro y un archivo de estado para realizar un seguimiento del progreso de la tarea, aunque es un paso opcional:
mkdir /var/log/lsyncd
touch /var/log/lsyncd/lsyncd.{log,status}
El siguiente paso es modificar el archivo de configuración en /etc/lsyncd.conf
para especificar los directorios de origen y de destino y, si se crearon, la ubicación de los archivos de registro y de estado. La configuración será la siguiente:
-- User configuration file for lsyncd.
-- Simple example for default rsync, but executing moves through on the target.
-- For more examples, see /usr/share/doc/lsyncd*/examples/
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status"
}
sync {
default.rsync,
source = "/path/source_dir",
target = "/path/destination_dir"
}
Para activar esta nueva configuración inicie el servicio con el siguiente comando:
systemctl start lsyncd
Después de seguir las instrucciones anteriores, Lsyncd comenzará a sincronizar los contenidos de /path/source_dir
a /path/destination_dir
.
ADVERTENCIA Nota:Solo es seguro habilitar Lsyncd para que se inicie en el arranque si está seguro de que los directorios de destino nunca serán cambiados por ningún otro Lsyncd. De lo contrario, no habilite Lsyncd en el arranque y asegúrese de que MOTD contenga una línea para mostrar que Lsyncd está instalado y en uso. Por ejemplo:
Al reiniciar, siga los siguientes pasos:
rsync compruebe si se encuentra en una situación de "remoto/servidor":
rsync -n -avrc root@REMOTE_SERVER:/PATH_TO_FOLDER_TO_BE_SYNCED/* /PATH_TO_FOLDER/
Inicie Lsyncd con:
systemctl start lsyncd.service
¿Necesita sincronizar varios directorios locales?
Para sincronizar más de un par de directorios, es posible agregar más sync
declaraciones en el archivo de configuración:
[...]
sync{
default.rsync,
source = "/path/source_1",
target = "/path/target_1"
}
sync{
default.rsync,
source = "/path/source_2",
target = "/path/target_2"
}
[...]
Sincronizar directorios remotos a través de SSH
Para realizar una sincronización remota mediante Lsyncd, el servidor de origen debe tener acceso SSH sin contraseña al servidor de destino. Esto se hace creando claves SSH en la fuente servidor.
Generar claves para acceso sin contraseña SSH
Utilice el siguiente comando en el servidor de origen para generar las claves:
ssh-keygen -t rsa
Se le pedirá que ingrese el archivo donde desea guardar la clave; a menos que tenga una configuración especial, déjelo vacío para usar la ubicación predeterminada. Después de esto, otro mensaje le pedirá una frase de contraseña; déjelo vacío ya que necesita un inicio de sesión completo sin contraseña.
Ahora que se generaron las claves, copie la clave en el destino servidor. Para copiarlo en authorized_keys
archivo en el servidor de destino, use las siguientes instrucciones en el origen servidor donde se han generado las claves:
sudo su
ssh-copy-id DESTINATION_SERVER_IP
Para comprobar que se ha realizado la conexión sin contraseña, inicie sesión en el destino servidor desde la fuente uno:
ssh DESTINATION_SERVER_IP
Si puede iniciar sesión sin que se le solicite una contraseña, el proceso se ha realizado correctamente.
Ahora que ha iniciado sesión, cree un directorio en el host remoto que funcionará como la carpeta de destino y salga de la sesión SSH:
mkdir /path/remote_destination_dir
exit
exit
Editar el archivo de configuración
La estructura del archivo de configuración permanecerá como se explica en la sección para sincronizar directorios locales, pero se realizarán algunos cambios en el sync
declaración:
- El
default.rsync
la propiedad se cambiará adefault.rsyncssh
para habilitarrsync
herramienta sobre SSH. - El
target
La propiedad se reemplazará con dos propiedades para especificar el destino remoto:host
ytargetdir
.
El archivo de configuración se verá así:
[...]
settings = {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status"
}
servers = {
"REMOTE_IP"
}
sourceList =
{
"PATH_TO_FOLDER_TO_BE_SYNCED",
}
for _, source in ipairs( sourceList ) do
for _, server in ipairs(servers) do
sync {
default.rsyncssh,
source = "/path/source_dir",
host = "DESTINATION_SERVER_IP",
targetdir = "/path/remote_destination_dir"
}
[...]
Una vez que se hayan realizado los cambios en el archivo de configuración, inicie el servicio como se explicó anteriormente:
systemctl start lsyncd
Si el servicio Lsyncd ya se está ejecutando, reinícielo:
sudo service lsyncd restart
ADVERTENCIA: Solo es seguro habilitar Lsyncd para que se inicie en el arranque si está seguro de que los directorios de destino nunca son cambiados por ningún otro Lsyncd. De lo contrario, no habilite Lsyncd en el arranque y asegúrese de que MOTD contenga una línea para mostrar que Lsyncd está instalado y en uso. Por ejemplo:
Al reiniciar, siga los siguientes pasos:
rsync comprueba si estás en una situación de "remoto/servidor"
rsync -n -avrc root@REMOTE_SERVER:/PATH_TO_FOLDER_TO_BE_SYNCED/* /PATH_TO_FOLDER/
Iniciar Lsyncd con
systemctl start lsyncd.service
Excluyendo directorios de Lsyncd
A veces es necesario excluir algunas carpetas seleccionadas en un directorio específico. Los ejemplos incluyen:
- Archivos multimedia montados en NFS.
- Archivos de registro. Cuando se sincronizan, los archivos de registro crean una gran cantidad de conversaciones y uso de ancho de banda innecesarios. En algunos casos, esto puede causar retrasos significativos en la sincronización.
- Archivos temporales utilizados por los procesos en ejecución.
Para excluir carpetas solo necesita poner la ruta relativa de la carpeta excluida. Por ejemplo:
- /var/www es el directorio de destino que se sincroniza con los esclavos
- /var/www/vhosts/www.example.com/wp-content/uploads es el directorio que está montado desde su servidor NFS, o que de otro modo no desea sincronizar.
- Cree exclusiones en la configuración de lsyncd. Suponiendo que está utilizando Lsyncd 2.1.5 en CentOS 6, primero asegúrese de tener un archivo de exclusiones dentro de la configuración de Lsyncd como se muestra a continuación junto a la línea 'excludeFrom:
vim /etc/lsyncd/lsyncd.conf
[...]
sync {
default.rsyncssh,
source="/var/www/",
host=server,
targetdir="/var/www/",
excludeFrom="/etc/lsyncd-excludes.txt",
rsync = {
A continuación, excluya la ruta relativa al directorio de origen especificado para la sincronización. Dado que el directorio de destino es /var/www, y el directorio que queremos excluir es /var/www/vhosts/www.example.com/wp-content/uploads, nuestra entrada sería:
cat /etc/lsyncd-excludes.txt
vhosts/www.example.com/wp-content/uploads
PRECAUCIÓN:Asegúrese de que el archivo de exclusiones no tenga líneas vacías. Si es así, lsyncd trata esto como "excluir /" y luego todo se excluye.
Lsyncd en soluciones NFS
Lsyncd se usa comúnmente para replicar archivos en una arquitectura maestro-esclavo. Si bien esto funciona muy bien para manejar actualizaciones de contenido/código, para archivos multimedia o aportados por usuarios, a menudo es más fácil usar NFS para compartir una carpeta entre varios servidores web. Tenga mucho cuidado de excluir las carpetas compartidas a través de NFS de Lsyncd. En el peor de los casos, donde su servidor maestro se reinicia pero el recurso compartido NFS no se monta, esto podría resultar en que Lsyncd elimine el contenido de su recurso compartido NFS.
Hay un par de maneras de manejar esto.
Opción 1:Excluyendo directorios de Lsyncd
Para obtener más detalles, consulte la sección 'Exclusión de directorios de Lsyncd'
Opción 2:Usar un enlace simbólico
Rsync por defecto no funciona con los objetivos de los enlaces simbólicos. Podemos usar esto para proteger el contenido montado en NFS.
En lugar de:
/var/www <– carpeta raíz para la replicación de Lsyncd/uploads <– Punto de montaje compartido de NFS
Monte el recurso compartido NFS en una carpeta diferente, diga /nfsmount, luego haga lo siguiente (suponiendo que el contenido cargado ya se haya copiado en /nfsmount/uploads):
cd /var/www
rm -Rf uploads
ln -s /nfsmount/uploads uploads
Ahora su contenido montado en NFS está ubicado de forma segura fuera del árbol de directorios replicado por Lsyncd.
Opción 3:Establecer parámetros de rsync
Rsync admite una opción -x que le dice a rsync que no cruce los límites del sistema de archivos. Pero antes de continuar, hay varias notas que debe tener en cuenta antes de intentar esto:
- Esto no funcionará con volúmenes de Cloud Block Storage, volúmenes LVM adicionales, etc.
- Esto no funcionará si Lsyncd reside en el mismo servidor que el servidor NFS. Esta opción asume que tiene un servidor NFS dedicado
- Esto solo funciona si la fuente es un sistema de archivos único
Para Lsyncd 2.0.x:agregue esta opción a las opciones que Lsyncd pasa a rsync editando la línea rsyncOpts en /etc/lsyncd.lua:
sync{
default.rsyncssh,
source="/var/www",
host="10.x.x.x",
targetdir="/var/www",
delete="running",
rsyncOpts="-avzx"
}
Para Lsyncd 2.1.x:con Lsyncd 2.1.x, rsyncOpts se ha cambiado a rsync={opciones} con el uso de opciones con un nombre completo en lugar de solo una letra como antes. Agregue lo siguiente a /etc/lsyncd.conf:
sync{
default.rsyncssh,
source="/var/www",
host="10.x.x.x",
targetdir="/var/www",
delete="running",
rsync={ one_file_system=true }
}
Conclusiones
Usar Lsyncd para mantener sincronizadas las carpetas locales y remotas es una alternativa económica y eficiente y, gracias a las múltiples opciones disponibles para el archivo de configuración, se puede personalizar para satisfacer sus necesidades.
Artículos relacionados
- Uso de rsync para sincronizar archivos
Use la pestaña Comentarios para hacer cualquier comentario o hacer preguntas. También puede iniciar una conversación con nosotros.