Lsyncd – Lokale Dateien mit mehreren Servern synchronisieren

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 Rhyth­mus.

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.

apt-get install lsyncd

Legen den Konfigurationsordner an.

mkdir /etc/lsyncd/

Erstellen einen SSH-Key ohne Passphrase.

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.

settings {
        logfile = "/var/log/lsyncd.log",
        statusFile = "/var/log/lsyncd.stat",
        statusIntervall = 1,
        maxProcesses = 10,
        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:

settings {
        logfile = "/var/log/lsyncd.log",
        statusFile = "/var/log/lsyncd.stat",
        statusIntervall = 1,
        maxProcesses = 10,
        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.

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.

#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.

/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.

[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.

systemctl reenable lsyncd.service
systemctl start lsyncd.service

Punkt 6: Testen

Wir prüfen ob der Dienst läuft.

systemctl status lsyncd.service
...
ps auxf | grep lsyncd

 

Dominion

Dominion

Linux Systemadministrator

Das könnte Dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.