Kürzlich stand Autor Charly vor der Aufgabe, ein Verzeichnis auf einem Server mit zwei NFS-gemounteten Clients zu synchronisieren. Das Ganze sollte schnell passieren und leicht handhabbar sein. Damit waren DRBD und Gluster-FS schon mal raus.
Mein Synchronisier-Setup schaut im Groben so aus: Ein Applikationsserver liest zyklisch Werte aus einer Datenbank, flicht daraus HTML-Dateien und einige Bilder und legt alles in dem Verzeichnis »/source« ab. Per NFS 4 eingehängt sind die Verzeichnisse »/dest1« und »/dest2« . Wann immer es neue Daten in »/source« gibt, sollen diese baldmöglichst in die beiden Zielverzeichnisse gelangen.
Einfach und schon lange dabei
Da komplexere Lösungen nicht in Frage kommen, bleibt eigentlich nur noch übrig, die Aufgabe dem Inotify-Subsystem in den Schoß zu werfen. Inotify ist seit 2.6.13 Bestandteil des Kernels und bietet Userspace-Programmen eine Schnittstelle zu Dateisystem-Ereignissen an. Abseits von Incron [1] habe ich dafür bisher kaum Verwendung gefunden, aber für das zeitnahe Syncen von Verzeichnissen sollte es ideal sein – so meine Überlegung. Fehlt nur noch das passende Tool für die Aufgabe.
Eine kurze Recherche brachte gleich zwei Kandidaten ans Licht: Lsyncd und Iwatch. Da zu Lsyncd bereits ein guter Linux-Magazin-Artikel [2] erschien, konzentriere ich mich hier auf Iwatch.
Der Wächter eignet sich für den Betrieb im Vordergrund genauso wie als Daemon. Im einfachsten Fall lasse ich beispielsweise mit »iwatch -r /var« ein Verzeichnis lediglich beobachten, ohne eine Aktion auszulösen. Iwatch meldet dann:
[ 6/May/2014 20:49:30] IN_CREATE /var/tmp/etilqs_SqorfaOvdiBaBI7 [ 6/May/2014 20:49:30] IN_DELETE /var/tmp/etilqs_SqorfaOvdiBaBI7
Mit dem Parameter »-c Aktion« weise ich Iwatch dagegen an, auf Ereignisse zu reagieren. Um der Parameterhölle zu entfliehen, erscheint mir eine Konfigurationsdatei wie in Abbildung 1 besser zu sein. Der spannende Teil der Konfiguration steht im »<path>« -Tag. Dort bestimme ich mit »type=recursive« , dass Iwatch auch Verzeichnisse unterhalb von »/source« einbeziehen möge.
Im Falle eines Dateisystem-Ereignisses startet der Mechanismus das Shellskript »/home/charly/bash/sync.sh« . Dabei übergibt Iwatch dem Skript die Variable »%f« . Darin steht der vollständige Pfad der Datei, die sich geändert hat.
Das Skript »sync.sh« wiederum ist ein schlanker Zweizeiler:
#!/bin/bash rsync -a --delete $1 /dest1/$1 & rsync -a --delete $1 /dest2/$1 &
Das klappt recht gut, wenn die Anzahl der zu verarbeitenden Ereignisse nicht exorbitant ansteigt. Wenn doch – wie etwa beim Syncen einer sechsstelligen Anzahl sehr kleiner Dateien, die der Server in maximaler Geschwindigkeit auf die Platte nagelt –, kommt es zu einer beachtlichen Menge Schlange stehender Rsync-Prozesse. Nicht, dass mir das schon mal passiert wäre – hust!
Infos
- Charly Kühnast, “Aus dem Alltag eines Sysadmin: Incron”: Linux-Magazin 02/07, S. 71, https://www.linux-magazin.de/Ausgaben/2007/02/Event-gesteuert (HTML) sowie auf vorliegender Delug-DVD (PDF)
- “Tooltipps Extended: Lsyncd”: https://www.linux-magazin.de/NEWS/Tooltipps-Extended-Lsyncd







