sophisticated Backups mit Rsync
Backups sind wichtig.
Jeder der einmal vor einer kaputten, ratternden Festplatte gesessen hat, weiß wie frustrierend das Wissen ist, alle seine Daten ins informationstechnische Nirwana entschwinden zu sehen.
Ist ein Backup der persönlichen Daten noch mit relativ geringem Aufwand möglich (so es denn regelmäßig veranstaltet wird), so wird ein Backup eines Server-Systems in vielen Dingen anspruchsvoller.
Dies fängt damit an, dass reinen Datenmengen oftmals das Vielfache eines Ein-Benutzer-Systems betragen. Okay in heutige Zeit, wo ein jeder zig GBs an Musik und Videos auf dem Rechner hat, muss man das natürlich relativieren.
In diesem Beitrag möchte ich ein Bash-Script vorstellen, welches folgende Dinge leistet:
1. Sichern von N-Hosts über RSYNC
2. Sichern von N-Verzeichnissen auf jedem Host
3. Inkrementelles Sichern (es werden nur Unterschiede gesichert/übertragen)
4. Zusammenführen von täglichen (inkrementellen) Backups zu wöchentlichen Vollbackups.
5. die aktuellen Backups sind jeweils unter einem Hardlink "latest" erreichbar.
Nachfolgend erfolgt eine Beschreibung über den Ablauf des Scriptes.
Es wird Momentan durch eine Sicherung von 3 Serversystemen und ca. 20 GB an reinen Nutzdaten getestet.
1. Stelle sicher, dass alle notwendigen Verzeichnisse vorhanden sind:
1. Verzeichnis "log" für log-Dateien der Sicherungen
2. Verzeichnis "backup" für die eigentlichen Sicherungen
1. Je Backupquelle ein Verzeichnis
2. Innerhalb jedes Quellverzeichnisses ein Verzeichnis für tägliche und eines für wöchentliche Sicherungen
2. Stelle sicher, dass alle Config-Dateien vorhanden sind:
1. sources.txt mit den Namen der zu sichernden Hosts/Verzeichnisse
2. exclude.txt mit den Dateien, welche nicht gesichert werden sollten (z.B. Thumbs.db)
3. innerhalb jedes Quellverzeichnisses eine Datei namens src-root.txt (mit dem ROOT der Sicherung)
und src-folders.txt (mit den einzelnen Verzeichnissen)
Der Aufbau des Root-Verzeichnisses sieht nun wie folgt aus.
ROOT
|
|-log
|-sources.txt
|-exclude.txt
|-backup
|-host1.de
|-host2.de
|-src-root.txt
|-src-folders.txt
|-daily
|-weekly
Ein Beispiel für eine sources.txt sieht wie folgt aus:
host1.de
host2.de
Ein Beispiel für eine exclude.txt sieht wie folgt aus:
Thumbs.db
.DS_Store
Eine src-root.txt könnte so aussehen:
Eine src-folders.txt könnte so aussehen:
/home
/etc
/var/log
/var/www
Ablauf der Sicherung:
Generiere Log-Datei.
Iteriere über alle Quellen aus sources.txt
Überprüfe ob alle Quellen Verzeichnisse zum Sichern enthalten.
Überprüfe ob lokal Verzeichnisse für die Sicherung existieren - wenn nicht lege sie an.
Erstelle tägliches Backup:
Existiert ein vorheriges Backup, so sichere nur die Änderungen.
Dies passiert mit folgendem Befehl:
rsync -zrva --exclude-from=exclude.txt --link-dest=<hardlink-zu-altem-backup> <sourcefolder>/ <backupfolder>/daily/<tag>/<zu-sicherndes-Verzeichnis>
Hierbei werden alle Benutzerrechte mitgesichert.
Setzte Hardlink vom letztem täglichen Backup auf aktuelles tägliches Backup.
Überprüfe ob Sonntag ist ( date +%w = 0)
Wenn ja, synchronisiere letztes tägliches Backup mit wöchentlichem (neuen) Backup.
Setzte Hardlink vom letztem wöchentlichen Backup auf aktuelles wöchentliches Backup.
Lösche alle täglichen Backups.
Setzte Hardlink vom letztem täglichen Backup auf aktuelles wöchentliches Backup.
So werden maximal 7 incrementelle tägliche Backups erstellt und pro Jahr 52 wöchentliche.
Das Backup-Script ist im Anhang zu finden :-).