Utiliser Lsyncd pour synchroniser deux dossiers
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
---- -- User configuration file for lsyncd. -- settings { logfile = "/home/logs/lsyncd/lsyncd.log", statusFile = "/home/logs/lsyncd/lsyncd-status.log", statusInterval = 1, insist = true } sync { default.rsync, delay=0, source="/home/sites_web/client/www1", target="2.2.2.2:/home/sites_web/client/www1", rsync = { archive = true, perms = true, owner = true, rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no", _extra = {"-a"} } } |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
---- -- User configuration file for lsyncd. -- settings { logfile = "/home/logs/lsyncd/lsyncd.log", statusFile = "/home/logs/lsyncd/lsyncd-status.log", statusInterval = 1, insist = true } source_list = { "/home/sites_web/client/www1", "/home/sites_web/client/www2", } for _, source in ipairs( source_list ) do sync { default.rsync, delay=0, source=source, target="2.2.2.2:" .. source, rsync = { archive = true, perms = true, owner = true, rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no", _extra = {"-a"} } } end |
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 🙂
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
Je connais bien, je l’ai utilisé pendant plus d’un an au travail pour synchroniser certains fichiers entre mon poste fixe et l’ordinateur qui me servait à l’époque pour bosser de chez moi (avant d’avoir un bel outil tout neuf, dont le SSD est handicapé par l’horrible antivirus McAfee). Mais tu n’est pas assuré que la synchro soit vraiment temps réel, et en plus, dans le cadre de deux serveurs qui sont côté à côté, l’aspect p2p fait que la connexion ne sera pas nécessairement directe (déjà vécu, les deux ordinateurs sur le même réseau qui ne se voient pas et… Lire la suite »
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.
Wow, c’est pas un peu torturer l’outil quand même ? En tout cas je serai curieux de voir comment on fait au niveau configuration…
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 🙂
Sinon y’a Nextcloud ? 🙂
Mouais, je suis pas sur que la finalité soit la même : pour faire juste de la synchro de dossiers, comme dans le cas de docroot pour un site web, Nextcloud est bien plus lourd à mettre en place (moustique,canon toussa). Par contre, il risque d’être un élément important pour mon téléphone dans quelques temps, notamment dans une optique de sauvegarde 🙂 (teasing pour un futur article à venir début octobre :P)