Die nächste Evolutionsstufe nach Copy-Paste und rsync basiert auf dem inotify Kernel Subsystem und heisst (bei mir) lsyncd. Das ist ein Programm, das Dateisystemänderungen überwacht und ereignisgesteuert Dinge tun kann.
Die Konfiguration ist in lua geschrieben, was der eine oder andere vielleicht auch schon von OpenWRT oder anderen Projekten, bei denen es auf Datensparsamkeit und Geschwindigkeit ankommt, kennt.
Ich empfehle die sparsame aber dennoch lehrreiche Lsyncd-Dokumentation auf Github.
Mit lsyncd gehört das manuelle Synchronisieren von Config-Files der Vergangenheit an. Darüber hinaus können nach dem Ändern und Synchronisieren auch Skripte laufen, die dann zum Beispiel die betreffenden Programme neu starten. Bei manchen Kunden habe ich das so im Einsatz. Spart echt Zeit und verhindert Fehler.
Anwendungsbeispiel
Einfaches Anwendungsbeispiel: Ich synchronisiere das Intranet und meinen Wiki-Content mit lsyncd und das funktioniert erstaunlich gut. Dafür habe ich auf beiden Intranet/Wiki Systemen (selbstverständlich Debian 11 Container) neben Apache und Dokuwiki noch rsync und lsyncd installiert. Angesteuert wird der Webserver über einen haproxy Loadbalancer.
Aktuell hab ich das Ganze als Master/Slave Konstrukt gebaut.
Loadbalancer-Konfiguration
frontend fo-intra
bind 192.168.12.13:80
mode http
default_backend intra
backend intra
balance source
hash-type consistent
option forwardfor
option httpchk
http-check send meth GET uri /server-status
option http-server-close
server hopi 192.168.10.31:80 check
server yuma 192.168.10.32:80 check backup
frontend fo-wiki
bind 192.168.12.15:80
mode http
option accept-invalid-http-request
acl is_wiki path_beg /dokuwiki/
http-request redirect code 301 prefix /dokuwiki unless is_wiki
default_backend wiki
backend wiki
balance source
hash-type consistent
option forwardfor
option httpchk
http-check send meth GET uri /dokuwiki/doku.php
option http-server-close
server hopi 192.168.10.31:80 check
server yuma 192.168.10.32:80 check backup
Später mal mache ich das Two-Way, da muss ich aber noch ein bisschen hirnen.
Die lsyncd Konfiguration muss man sich komplett selber bauen, das Paket bringt keine mit und auch keine Examples so wie ich das sehe. Aber wozu gibts das Internet. ;)
lsyncd Konfiguration (lsyncd.conf.lua)
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd.stat",
statusInterval = 1,
maxProcesses = 1,
maxDelays = 1,
insist = false
}
targetList = {
"yuma"
}
targetDirs = {
"/etc/apache2/",
"/var/www/",
"/etc/dokuwiki/",
"/var/lib/dokuwiki/"
}
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" },
excludeFrom = "/etc/lsyncd/lsyncd.exclude",
rsync = {
owner = true,
group = true,
perms = true
},
ssh = {
port = 22
}
}
end
end
Dann müssen noch ein paar Verzeichnisse ausgeschlossen werden, sonst passieren (in Dokuwiki) komische Dinge.
Exclude File (lsyncd.exclude)
/var/lib/dokuwiki/data/cache/
/var/lib/dokuwiki/data/index/
/var/lib/dokuwiki/data/locks/
/var/lib/dokuwiki/data/tmp/
/var/lib/dokuwiki//data/locks
/data/cache/
/data/index/
/data/locks/
/data/tmp/
Und eine Service Unit muss man auch noch selber machen. :-/
Systemd Service Unit (lsyncd.service)
[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