Synchronisation en temps réel avec rsync et inotify

Prérequis essenteils

Avant toute installation, assurez-vous que le démon rsync est correctement configuré. De plus, l'installation d'inotify-tools requiert que votre noyau Linux soit au minimum en version 2.6.13 et qu'il ait été compilé avec l'option CONFIG_INOTIFY activée. Vous pouvez vérifier ce dernier point via la commande ci-dessous.

Origine de la combinaison rsync et inotify

Rsync (remote sync) est un outil de synchronisation à distance qui permet d'effectuer des sauvegardes incrémentiellles vers un serveur distant. Cependant, rsync présente des limites : lors de la synchronisation, son algorithme principal compare les fichiers sur le serveur distant pour ne synchroniser que les différences. Imaginez un serveur contenant des millions de fichiers : cette comparaison devient extrêmement lente, d'autant plus que seule une infime partie des fichiers est généralement modifiée. C'est là qu'intervient inotify, qui permet de combler cette lacune en surveillant les changements au niveau du système de fichiers.

Côté client : rsync version 3.0.6, inotify-tools version 3.14

Compilation et installation

1) Vérification de la version du noyau

admin@serveur:~$ uname -r
4.15.0-76-generic
admin@serveur:~$ ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 27 févr. 09:42 max_queued_events
-rw-r--r-- 1 root root 0 27 févr. 09:42 max_user_instances
-rw-r--r-- 1 root root 0 27 févr. 09:42 max_user_watches
# La présence de ces trois fichiers indique le support d'inotify.

2) Compilation et installation d'inotify-tools

admin@serveur:~$ cd inotify-tools-3.14/
admin@serveur:~/inotify-tools-3.14$ ./configure --prefix=/usr/local/inotify
admin@serveur:~/inotify-tools-3.14$ make
admin@serveur:~/inotify-tools-3.14$ sudo make install

3) Tests de fonctionnement local

Test de l'événement create :

admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%Y %H:%M' --format '%T %w%f' -e create /backup
27/02/2024 10:05 /backup/rapport.txt
27/02/2024 10:06 /backup/donnees

Test des événements create et delete :

admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%Y %H:%M' --format '%T %w%f' -e create,delete /backup
27/02/2024 10:08 /backup/ancien_fichier.log
27/02/2024 10:08 /backup/nouveau_fichier.dat

Test des événements create, delete et close_write (création d'un fichier peut générer deux entrées) :

admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%Y %H:%M' --format '%T %w%f' -e create,delete,close_write /backup
27/02/2024 10:10 /backup/document.pdf
27/02/2024 10:10 /backup/document.pdf

Sortie simplifiée sans horodatage :

admin@serveur:~$ /usr/local/inotify/bin/inotifywait -mrq --format '%w%f' -e create /backup
/backup/image.jpg

Explication des paramètres de inotifywait

Paramètre Description
-r, --recursive Surveillance récursive des répertoires.
-q, --quiet Affiche une sortie minimale, se limitant aux événements de surveillance.
-m, --monitor Maintient le processus en écoute continue.
--exclude Exclut des fichiers ou répertoires de la surveillance (insensible à la casse).
--timefmt Spécifie le format de l'horodatage pour la sortie.
--format Définit le format de sortie à l'aide d'une chaîne de caractères.
-e, --event Définit les événements à surveiller (voir liste ci-dessous).

Liste des événements disponibles avec -e

Événement Description
access Lecture d'un fichier ou répertoire.
modify Modification du contenu d'un fichier ou répertoire.
attrib Changement des attributs d'un fichier ou répertoire.
close Fermeture d'un fichier ou répertoire (après lecture ou écriture).
open Ouverture d'un fichier ou répertoire.
moved_to Déplacement d'un fichier ou répertoire vers un autre répertoire.
move Déplacement d'un fichier ou répertoire (entrant ou sortant).
create Création d'un fichier ou répertoire dans le répertoire surveillé.
delete Suppression d'un fichier ou répertoire.
umount Démontage du système de fichiers.

Script de synchronisation en temps réel

Le script suivant surveille un répertoire source et déclenche une synchronisation via rsync vers un serveur distant dès qu'un fichier est créé, modifié ou supprimé.

#!/bin/bash

REPERTOIRE_CIBLE="/backup"
INOTIFY_CMD="/usr/local/inotify/bin/inotifywait"
MODULE_RSYNC="rsync_backup@192.168.222.140::oldboy"
FICHIER_MDP="/etc/rsync.password"

"$INOTIFY_CMD" -mrq --format '%w%f' -e create,close_write,delete "$REPERTOIRE_CIBLE" | while read CHEMIN_FICHIER
do
    # Si le fichier n'existe plus (cas d'une suppression), on synchronise tout le répertoire.
    if [ ! -e "$CHEMIN_FICHIER" ]; then
        cd "$REPERTOIRE_CIBLE" && rsync -avz --delete ./ "$MODULE_RSYNC" --password-file="$FICHIER_MDP"
    else
        # Sinon, on ne synchronise que le fichier modifié.
        rsync -avz --delete "$CHEMIN_FICHIER" "$MODULE_RSYNC" --password-file="$FICHIER_MDP"
    fi
done

Optimisation des paramètres noyau

Les performances d'inotify sont régulées par trois paramètres dans /proc/sys/fs/inotify/ :

  • max_user_watches : Nombre maximal de fichiers/répertoires qu'un processus peut surveiller.
  • max_user_instances : Nombre maximal d'instances inotify par utilisateur.
  • max_queued_events : Taille maximale de la file d'événements en attente de traitement.

Pour une utilisation intensive, il est conseillé d'augmenter max_user_watches et max_queued_events.

admin@serveur:~$ cat /proc/sys/fs/inotify/max_user_watches
8192
admin@serveur:~$ sudo sysctl -w fs.inotify.max_user_watches=524288
admin@serveur:~$ sudo sysctl -w fs.inotify.max_queued_events=32768
# Pour rendre les changements permanents, ajoutez ces lignes à /etc/sysctl.conf :
# fs.inotify.max_user_watches=524288
# fs.inotify.max_queued_events=32768
admin@serveur:~$ sudo sysctl -p

Avantages et inconvénients d'inotify

Avantages : Permet une détection quasi instantanée des changements au niveau du système de fichiers, rendant possible une synchronisation véritablement en temps réel avec des outils comme rsync.

Inconvénients :

  1. Volume : La surveillanec peut devenir lente avec un très grand nombre de fichiers (des centaines de milliers) et des modifications fréquentes.
  2. Granularité : Un script simple, comme celui présenté, déclenche souvent la synchronisation d'un répertoire entier sur la modification d'un seul fichier, bien qu'une synchronisation incrémentielle soit possible avec une logique plus fine.
  3. Processus unique : L'appel à rsync est exécuté de manière séquentielle pour chaque événement. Pour une gestion concurrentielle à grande échelle, des outils comme sersync, qui implémentent un modèle multi-processus, peuvent être plus adaptés.

Référence

Pour plus de détails sur inotify-tools : https://github.com/rvoicilas/inotify-tools/wiki

Étiquettes: rsync inotify synchronisation Linux sauvegarde

Publié le 12 juillet à 03h59