Utiliser Lsyncd pour synchroniser deux dossiers

closeCet article a été publié il y a 6 ans 7 mois 22 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

J’ai vaguement évoqué ce petit logiciel lors de mon billet de réflexion sur le passage à plusieurs serveurs pour un hébergement de site web. Sachant que j’ai eu l’occasion de revenir dessus récemment, je me suis dit qu’il était pertinent de ne pas passer par une simple astuce diverse et donc de lui consacrer un billet dédié.

Lsyncd est un service qui tourne en arrière plan, et lance au besoin une synchronisation entre deux dossiers, qui peuvent se trouver sur la même machine ou, dans le cas qui m’intéresse le plus, deux machines différentes.

C’est une solution fréquemment proposée lorsqu’il s’agit de synchroniser deux serveurs qui hébergent un Drupal, mais la solution est valable pour pratiquement tout type d’application. En effet, si vous avez deux serveurs qui doivent délivrer le même site web, il est absolument nécessaire que leur contenu soit identique. Et ici, l’idée est de se passer de NFS pour limiter les appels lents via le réseau.

Pourquoi le préférer à une solution classique type rsync via une tâche planifiée ? Ben déjà une tâche planifiée c’est toutes les minutes, et il faut ruser pour réduire ce délai. Vous pouvez donc très souvent avoir des contenus différents entre vos machines, ce qui est dommageable (images qui ne s’affichent pas, cache d’agrégation JS/CSS différent…). Ici, lsyncd va travailler avec inotify, que j’ai déjà pu évoquer dans un lien en vrac pour le coup, qui est un mécanisme qui permet de déclencher un évènement en fonction d’une modification du système de fichier. Donc ici dès qu’on change quelque chose, il déclenche le rsync.

Si j’ai travaillé sur des ressources intégralement en anglais au boulot, j’ai découvert par la suite que certains francophones en ont parlé. Pour une utilisation basique, je vais donc éviter de faire de la redite et vous conseiller cet article qui parle de son utilisation sous Debian.

Et si on veut que les deux serveurs communiquent entre eux, il suffit de faire la même configuration en changeant la destination en fonction du serveur. Une cross-synchronisation qui marche pas mal dans mon cas, et que j’ai donc voulu réutiliser lorsqu’on a demandé à ajouter un nouveau site destiné, à terme, à remplacer l’actuel (« vieux » Drupal 7 coincé avec du PHP 5.4, pour un nouveau Drupal 8 avec PHP 7.0).

Si l’on suit la documentation, on découvre pas mal de possibilités d’options qui permettent d’adapter le fonctionnement à notre environnement. Malgré tout, dans mon cas, et ce qui me pousse à écrire aujourd’hui, elle ne donne pas toutes les clés.

Surveiller plusieurs dossiers, pas si intuitif

C’est dans une issue Github que j’ai trouvé la piste pour la solution qui me convient, ce n’est pas inscrit dans la documentation, si ça se trouve les drogués au LUA trouveront ça très logique.

Voilà le fichier que j’avais :

C’est bien, mais ça ne fonctionne que pour un seul dossier (et ses sous-dossiers évidemment), je ne vais pas trop m’étendre sur le sujet, je vous laisse chercher les options qui vous paraissent obscures. Ce qui m’intéresse surtout c’est la méthode pour passer à plusieurs dossiers, puisqu’on ne peut pas définir plusieurs sources et plusieurs destinations.

J’en suis arrivé à utiliser la configuration suivante :

Qu’est-ce qui change ? J’ai créé une liste de sources, la destination étant identique d’un point de vue de l’arborescence et il n’y a qu’un seul serveur. Et ensuite je fais une boucle sur ces sources, et j’applique la même configuration d’origine avec comme seule modification le target, qui contient une concaténation de l’IP du serveur cible et de la variable source (et la syntaxe de cette concaténation n’est pas triviale).

Quand j’ai dit que c’était pas intuitif, c’est que je me suis planté sur la création de la liste, et quand on lit la définition de la boucle for, pour moi « _, source » n’est pas quelque chose d’évident.

Enfin bref, ça fonctionne, j’ai pu réappliquer sur mes deux fronts pour que ça soit identique, ça l’est, c’est cool 🙂

 

7 Commentaires
Le plus ancien
Le plus récent
Commentaires en ligne
Afficher tous les commentaires
garfi
garfi
07/09/2017 15:06

Connait tu Syncthing https://syncthing.net/ ?

Je met en place des solutions de backup personnel en deux coup de cuillerée avec ça 🙂
qrcode, tls, interface gtk ou web

Denis Cardon
24/10/2017 23:09
Répondre à  Seboss666

il y a une option syncthing-inotify pour éviter le pooling de syncthing, et on peut désactiver toutes les fonctionnalités p2p et communication vers l’extérieur. J’utilise syncthing pour faire des synchronisation de SYSVOL entre des Active Directory Samba4, avec aucune communication autre que celles entre les serveurs AD et ça fonctionne bien.

dcardon
25/10/2017 00:05
Répondre à  Seboss666

Tu peux jeter un coup d’oeil à notre wiki public https://dev.tranquil.it/wiki/SAMBA_-_R%C3%A9plication_du_partage_SYSVOL . Il y a un wrapper python sympa qui fait la configuration automatique. Il n’y a pas la partie syncthing-inotify, mais celle là est triviale à installer, ça ne devrait pas te poser de problème 🙂

xhark
13/09/2017 00:27

Sinon y’a Nextcloud ? 🙂