Ich habe mehrere Möglichkeiten ausprobiert um auf unterschiedlichen Linux-Servern Dateien synchron zu halten. Wer als Beispiel ein Webprojekt auf mehreren Servern betreibt, und sich die Mehrkosten und auch evtl. auftretende Probleme eines NFS sparen möchte, hat sicherlich schon einmal daran gedacht Dateien mittels rsync und cron synchron zu halten. Das funktioniert jedoch nur in einem 1 Minuten Rhythmus.
Mit Lsyncd ist dieses Problem nicht mehr existent. Lsyncd befragt den Linux Kernel mittels inotify ob sich Dateien in einem beobachteten Ordner inklusive Unterordner geändert haben, und synchronisiert diese je nach Einstellung mittels rsync auf einen oder mehrere Server.
Punkt 1: Installation unter Debian
Wir installieren das Paket.
1 |
apt-get install lsyncd |
Legen den Konfigurationsordner an.
1 |
mkdir /etc/lsyncd/ |
Erstellen einen SSH-Key ohne Passphrase.
1 |
ssh-keygen |
Fügen den Inhalt von /root/.ssh/id_rsa.pub
auf den anderen Servern am Ende der Datei /root/.ssh/authorized_keys
ein.
Punkt 2: Konfiguration
Ich gebe euch eine Beispiel Konfiguration mit der mehrere Ordner auf mehrere Server synchron gehalten werden können. Mehr Informationen findet ihr in der offiziellen Dokumentation.
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 33 34 35 36 37 38 39 |
settings { logfile = "/var/log/lsyncd.log", statusFile = "/var/log/lsyncd.stat", statusInterval = 1, maxProcesses = 1, maxDelays = 1, insist = false } targetList = { "server1", "10.1.2.3" } targetDirs = { "/var/www/", "/path/to/whatever/" } for _, server in ipairs(targetList) do for _, dir in ipairs(targetDirs) do sync { default.rsyncssh, source=dir, host=server, targetdir=dir, delete='startup', exclude={ "*.*~", "*.swp", "*.tmp" }, rsync = { owner = true, group = true, perms = true }, ssh = { port = 22 } } end end |
- Die settings könnt ihr beibehalten oder auch anpassen. In dieser Einstellung synchronisiert der Dienst nahezu live die Daten.
- Mit targetList gebt ihr die Server an auf die synchronisiert werden soll.
- Die targetDirs sind die Quelle und gleichzeitig das Ziel. Eine Dateibegrenzung gibt es im Kernel, dazu mehr im nächsten Punkt.
- WICHTIG: Mit delete=’startup‘ löscht Lsyncd Dateien erst wenn Lsyncd neugestartet wird. Diese Option ist notwendig wenn Dateien mittels Linux-Editoren (bsp. vim) bearbeitet werden, da diese Dateien während dem Bearbeiten verschoben/umbenannt werden. Ansonsten kann auf delete=true (Standard Wert) gestellt werden.
- In der exclude Zeile können Dateien oder Dateiendungen angegeben werden, die beim Sync ausgeschlossen werden sollen.
Alternative für unterschiedliche Quell und Ziel Verzeichnisse:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
settings { logfile = "/var/log/lsyncd.log", statusFile = "/var/log/lsyncd.stat", statusInterval = 1, maxProcesses = 1, maxDelays = 1, insist = false } targetList = { "server1", "10.1.2.3" } for _, servers in ipairs(targetList) do sync { default.rsyncssh, source="/var/www/", host=servers, targetdir="/var/www/vhosts/", delete='startup', exclude={ "*.*~", "*.swp", "*.tmp" }, rsync = { owner = true, group = true, perms = true }, ssh = { port = 22 } } sync { default.rsyncssh, source="/path/to/whatever/", host=servers, targetdir="/path/to/whatever/and/ever/", delete='startup', exclude={ "*.*~", "*.swp", "*.tmp" }, rsync = { owner = true, group = true, perms = true }, ssh = { port = 22 } } end |
Punkt 3: Limit der maximalen inotify Dateien erhöhen
Um das Erreichen des inotify Limit von oftmals nur 8192 Dateien im Vorfeld zu vermeiden, erhöhen wir das Limit. Zuerst prüfen wir aber viele Dateien synchronisiert werden sollen. Dazu verwenden wir ein find auf alle Ordner die wir in der Konfiguration angegeben haben.
1 |
find "/var/www/" "/path/to/whatever/" | wc -l |
Wir erhöhen den Linux Kernel Parameter auf einen Wert der höher ist als unsere Anzahl an Dateien.
1 2 |
#fix lsyncd error terminating since out of inotify watches fs.inotify.max_user_watches = 65536 |
Jetzt übernehmen wir den neuen Wert mit sysctl -p
.
Punkt 4: Logrotate
Je nach Anzahl der Dateiänderungen können die Logfiles schnell anwachsen. Wir räumen somit täglich auf.
1 2 3 4 5 6 7 8 9 10 11 |
/var/log/lsyncd.log /var/log/lsyncd.stat { rotate 7 daily compress missingok notifempty postrotate systemctl restart lsyncd.service > /dev/null endscript } |
Punkt 5: Systemd Service Unit
Lsyncd liefert ein Init Start/Stop Script mit. Wer lieber Systemd verwenden möchte kann meine Unit gerne nutzen.
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=Lsyncd - Live Syncing (Mirror) Daemon After=syslog.target network.target ConditionPathExists=/etc/lsyncd/lsyncd.conf.lua [Service] Type=simple ExecStart=/usr/bin/lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua Restart=on-failure [Install] WantedBy=multi-user.target |
Jetzt reaktivieren wir die neue Unit und deaktivieren somit das alte Init Script, und starten den Dienst.
1 2 |
systemctl reenable lsyncd.service systemctl start lsyncd.service |
Punkt 6: Testen
Wir prüfen ob der Dienst läuft.
1 2 3 |
systemctl status lsyncd.service ... ps auxf | grep lsyncd |
1