IGLN

ūüí© mon petit merdier sur l’internet ūüí©

Installation et configuration de lsyncd sur Debian

Fonctionnement

Avant de se lancer dans l’installation, un peu de th√©orie, histoire de savoir pourquoi il est plus int√©ressant d’utiliser lsyncd plut√īt qu’un simple script rsync en cron. Le gros avantage de lsyncd est qu’il va utiliser inotify ou fsevevents pour monitorer les dossiers √† l’int√©rieur de votre dossier source. Cela permet de lancer un rsync uniquement lorsqu’un changement est d√©tect√©. De plus, il va lancer un rsync uniquement sur le ou les fichiers qui ont √©t√© modifi√©s ce qui √©conomise pas mal d’I/O, surtout lorsqu’on veut synchroniser des dossiers tr√®s lourd et qu’on a des disques en cartons ūüėČ

Attention, √ßa ne remplace pas un FS distribu√© ou un DRBD qui seront bien plus gourmand en I/O mais qui, en contre-partie, offriront l’assurance de dossiers synchronis√©s en temps r√©el. En effet, lsyncd va g√©n√©rer une latence entre la synchronisation des dossiers qui va √™tre plus ou moins longue (ce param√®tre est r√©glable) et qui par d√©faut est de 15 secondes. Ce type de setup peut donc tr√®s bien √™tre utilis√© pour du failover par exemple mais ne se pr√™tera s√Ľrement pas √† du load-balancing ou du HA. Ceci est √† d√©finir en fonction de l’applicatif qui tourne derri√®re et de la criticit√© de celui-ci…

Installation & Configuration

Alors comme d’habitude, je suis sous Debian donc je ne parlerai que de Debian dans ce tutoriel mais pour les autres, cela vous permettra de vous familiariser avec les options de configurations. Pour l’installation, on part sur un bon vieux apt install des familles :

apt install lsyncd

On va ensuite directement attaquer avec la création des dossiers nécessaires à la configuration et aux logs :

mkdir /etc/lsyncd
mkdir /var/log/lsyncd/

Je vais commencer par vous montrer un fichier de conf basique et je vous explique les options en dessous :

cat /etc/lsyncd/lsyncd.conf.lua
settings {
	logfile = "/var/log/lsyncd/lsyncd.log",
	statusFile = "/var/log/lsyncd/lsyncd-status.log",
	statusInterval = 1
}

sync {
	default.rsyncssh,
	source="/var/www",
	host="srv2.example.net",
	targetdir="/var/www",
	delay = 1,
	rsync = {
		archive = true,
		compress = true,
		whole_file = false
	},
	ssh = {
		port = 22
	}
}

Vous l’aurez compris, le fichier de configuration par d√©faut sur Debian est /etc/lsyncd/lsyncd.conf.lua (il est d√©finit dans le script d’init). Le premier bloc settings permet de d√©finir les param√®tres g√©n√©raux qui seront donc appliqu√©s √† tous les dossiers synchronis√©s et les blocs sync permettent de d√©finir les dossiers synchronis√©s (vous pouvez en ajouter autant que vous le d√©sirez).

Dans la partie settings, je n’utilise que 3 options car les autres ne me semblent pas forc√©ment utiles mais vous pouvez voir la liste compl√®te sur cette page.

  • logfile : permet de d√©finir le fichier de log
  • statusFile : ce fichier d√©crit les dossiers qui sont monitor√©s par lsyncd
  • statusInterval : permet de d√©finir le nombre de secondes avant que le fichier status soit mis √† jour

A noter que l’option inotifyMode permet de choisir le type de changement √† √©couter via inotify (“Modify”, “CloseWrite” ou “CloseWrite or Modify”). Par d√©faut, il s’agit de CloseWrite.

Dans la partie sync, je n’utilise √©galement que peu d’options car les options par d√©faut correspondent bien √† ma situation. Il serait d’ailleurs temps que j’explique √† quoi me sert lsyncd, vu qu’on arrive √† la moiti√© du tuto… Je l’utilise pour synchroniser des DocumentRoot d’un serveur vers un autre serveur en mode actif/passif. En cas de d√©faillance de ce serveur, je peux donc rapidement basculer vers le deuxi√®me serveur qui est d√©j√† configur√© et qui contient donc toutes les donn√©es √† jour. Dans mon exemple, il s’agit d’ailleurs du DocumentRoot du site sur lequel vous √™tes actuellement que je r√©plique vers un serveur qui r√©pond au doux nom de web3.mnt-tech.fr. Je n’utilise plus du tout lsyncd et ce blog tourne tourne sur un simple serveur dans un conteneur comme expliqu√© ici

  • default.rsyncssh : on d√©finit les param√®tres par d√©faut de rsync via ssh
  • source : le dossier source
  • host : la machine distante sur laquelle se trouve le dossier de destination
  • targetdir : c’est bon, t’as compris, t’es pas con
  • delay : cela d√©finit un d√©lai avant de spawn un process rsync

Le param√®tre le plus important est delay qui va d√©finir par d√©faut le nombre de secondes avant de spawner un process rsync. Dans mon cas, j’ai mis une seconde car je sais que les modifications sont assez peu fr√©quentes sur ce site (il n’y a qu’√† voir la fr√©quence de mise √† jour de ce blog pour s’en rendre compte ūüėČ ) mais dans le cas d’un dossier avec beaucoup de modifications par secondes, il est s√Ľrement plus int√©ressant de monter ce d√©lai qui par d√©faut est √† 15 secondes. Si en l’espace de delay secondes il y a eu 1000 modifications, un process rsync sera de toute fa√ßon lanc√© par lsyncd.

On peut ensuite modifier les options de rsync via le bloc rsync et je vous invite √† aller voir la liste compl√®tes des options sur cette page. Sur la m√™me page on trouve les options de default.rsyncssh permettant par exemple de modifier le port ou la cl√© SSH. A noter que par d√©faut l’option --delete est utilis√©e et que l’option --whole-file est d√©sactiv√©e, ce qui permet de tirer partie de l’algorithme de rsync pour n’envoyer qu’une partie d’un fichier si celui-ci n’a √©t√© modifi√© que partiellement.

Il faut ensuite ajouter la cl√© publique de root sur le serveur distant avec ssh-copy-id par exemple et il ne reste plus qu’√† lancer le service via systemctl :

systemctl start lsyncd.service

Si vous souhaitez ajouter des dossiers synchronis√©s, il suffit d’ajouter des blocs sync dans votre fichier de configuration et de relancer lsyncd. Pour le moment lsyncd marche √† merveille mais je n’ai fait que quelques tests sur des dossiers ne contenant pas √©norm√©ment de fichiers. Je reviendrai √©diter cet article quand ce sera le cas pour vous dire ce qu’il en est. Une derni√®re petite astuce avant de cloturer cet article, lorsque lsyncd ne se lance pas via systemd ou le script d’init, vous pouvez le lancer directement √† la main pour voir ou se situe votre erreur. Un exemple avec un fichier de configuration mal √©dit√© :

lsyncd /etc/lsyncd/lsyncd.conf.lua
Error: error loading /etc/lsyncd/lsyncd.conf.lua: /etc/lsyncd/lsyncd.conf.lua:5: '}' expected (to close '{' at line 1) near 'plop'