Backup
Ansprechpartner |
Contents
Für das Backup benutzen wir burp, eine leichtgewichtige Backup-Software, die dennoch sehr flexibel zu konfigurieren und obendrein noch sehr schnell ist. Der Server läuft auf Unixen, den Client gibts zusätzlich auch für Windows.
Für uns wichtig:
- Verschlüsselte Übertragung der Daten, kann IPv4 und IPv6.
- Inkrementelle Übertragung und Speicherung neuer bzw. geänderter Dateien, damit sind gerade tägliche Backups dennoch sehr schnell
- Im Gegensatz zu rdiff-backup passiert das Datenshuffling (rdiffs anlegen usw.) erst nach der Übertragung der Daten, sodass der Client sehr schnell mit seiner Arbeit fertig ist.
- Deduplikation über mehrere Clients hinweg (extra-Programm, z.B. mit wöchentlichem cron-Skript aufrufbar)
1. Verzeichnisse im Backup (includes)
Wichtig:
- Ich habe mit Absicht kein vollständiges System-Backup konfiguriert, sondern derzeit nur ausgewählte Verzeichnisse!
burp sichert per default nicht über verschiedene Dateisysteme hinweg! Das muss man extra konfigurieren!
Neue Software oder neue Datenverzeichnisse, die wichtig sind: Mir Bescheid geben, damit ich die Konfig anpassen kann.
- Änderung an der Partitionierung oder neue Filesystems: dito.
- Falls Ihr selbst die burp.conf ändert, dokumentiert dies auf dieser Wiki-Seite!
Verzeichnis |
LVM VG |
LVM LV |
Zweck |
/etc |
vg_lugin |
root |
Allgemeine Konfigurationsdateien des Systems |
/home |
Daten der lokalen Shell-User |
||
/root |
Daten des root-Accounts |
||
/usr/local |
manuell erstellte (d.h. nicht von Debian verwaltete) Daten, Programme und Libraries |
||
/var/lib/lug-in-wiki |
Daten des Wiki-Servers (MoinMoin) |
||
/var/local/pgsql_db_dumps |
Datenbankdump von PostgreSQL (für Owncloud) |
||
/var/www |
Daten für den Apache-Webserver |
||
/var/lib/owncloud |
oc_data |
Daten des Owncloud-Servers |
WICHTIG: Falls Ihr nicht wollt, das ein bestimmtes Unterverzeichnis aus den includes gesichert wird, legt einfache eine Datei namens ".nobackup" in das Verzeichnis.
2. /etc/burp.conf - Konfiguration des Burp-Clients
WICHTIG: Falls Ihr nicht wollt, das ein bestimmtes unterverzeichnis aus den includes gesichert wird, legt einfache eine Datei namens ".nobackup" in das Verzeichnis.
burp bringt eine /etc/burp.conf für den Client schon mit, die müssen wir nur noch anpassen. Blöderweise ist die Datei per default world readable, das kann man aber schnell ändern:
chmod og-r /etc/burp/burp.conf
2.1. Geänderte/Hinzugefügte Optionen
Option |
Zweck |
server = 2a01:1e8:e19b:224::cc |
IP-Adresse des Backup-Servers |
cname = lugin-test |
Name des Clients, muss beim Server hinterlegt sein |
passwort = ... |
bleibt natürlich geheim und gibts bei mir |
network_timeout = 600 |
default von 7200s ist zu lang, zumal die IPv6-Anbindung immer noch ab und zu mal hickups hat |
ssl_peer_cn = burp.lug-in.de |
X.509 Common Name des Backup-Servers, prüft der Client beim Login, muss mit der Konfig des Backup-Server matchen |
backup_script_pre=/usr/local/sbin/prepare_burp_backup.sh |
Skript, das vor dem Backup ausgeführt wird. Erstellt die LVM-Snapshots und mounted diese |
backup_script_post=/usr/local/sbin/post_burp_backup.sh |
Skript, das nach dem Backup ausgeführt wird. Umnounted die LVM-Snapshots und entfernt diese |
backup_script_post_run_on_fail=1 |
Das Post-Backup-Skript auch bei Fehlern ausführen, damit die LVM-Snapshots nicht liegenbleiben und vollaufen |
nobackup = .nobackup |
Verzeichnisse, die eine Datei namens .nobackup haben, werden nicht gesichert. |
cross_filesystem = /var/lib/owncloud |
Das Verzeichnis liegt auf einem separatem LVM Logical Volume, also muss burp da crossen |
include = /mnt/burp_snapshot/etc |
Die eigentlichen Includes, damit burp weiß, welche Verzeichnisse gesichert werden sollen. Siehe Verzeichnisse im Backup. Gesichert wird von den LVM-Snapshots aus, damit das Dateisystem während der Sicherung in sich konsistent ist. |
include = /mnt/burp_snapshot/home |
|
include = /mnt/burp_snapshot/root |
|
include = /mnt/burp_snapshot/usr/local |
|
include = /mnt/burp_snapshot/var/lib/lug-in-wiki |
|
include = /mnt/burp_snapshot/var/lib/owncloud |
|
include = /mnt/burp_snapshot/var/local/pgsql_db_dumps |
|
include = /mnt/burp_snapshot/var/lib/www |
2.2. Entfernte Optionen
Option |
Zweck |
server_can_restore = 0 |
auskommentiert, vorsichtshalber lassen wir zu, dass vom Backup-Server aus ein Restore möglich ist |
Ich habe allgemein mal die Datei entschlackt und alle unnötigen Kommentare und auskommentierten Optionen entfernt. Das macht die burp.conf ein wenig übersichtlicher. Die manpage hat eine ausführliche Liste aller möglichen Optionen.
3. LVM Snapshots / Dump Datenbank
LVM snapshots sind aktuell deaktiviert. Alle paar Wochen hängt sich der Server beim erstellen des LVM-Snapshots des Root-Volumes auf. |
Damit der Zustand des Dateisystems in sich konsistent ist, wenn wir das Backup machen, erstellen wir vor dem Backup LVM-Snapshots der zu sichernden Volumes. Die Liste der zu sicherenden Logical Volumes ergibt sich aus LVM.
Die Snapshots werden dann read-only gemounted und burp sichert dann vom snapshot-mountpoint aus. Nach dem Backzup muss dann der snapshot unmounted und wieder entfernt werden. Also brauchen wir ein Skript vor dem Backup und eins danach.
Direkt vor der Erstellung der LVM-Snapshots machen wir noch einen Dump der PostgreSQL-Datenbank, damit wir die Datenbank nach einem etwaigen Ausfall ebenfalls wiederherstellen können.
- /usr/local/sbin/prepare_burp_backup.sh (Auszug)
su -c "pg_dump -f /var/local/pgsql_db_dumps/oc_dump.out owncloud" postgres /sbin/lvcreate --snapshot -l 5%ORIGIN --name burp_snapshot_root /dev/vg_lugin/root /sbin/lvcreate --snapshot -l 5%ORIGIN --name burp_snapshot_oc_data /dev/vg_lugin/oc_data mount -r -o nouuid,noatime /dev/vg_lugin/burp_snapshot_root /mnt/burp_snapshot/ mount -r -o nouuid,noatime /dev/vg_lugin/burp_snapshot_root /mnt/burp_snapshot/var/lib/owncloud/
- -l 5%ORIGIN
- der Snapshot belegt maximal 5% des Physical Volumes
Da das /-Volume ja während des Backups weiterarbeitet, werden in dem reservierten Platz die Änderungen auf dem original-Volume gespeichert. Da die Backups aber nicht lange dauern, sollten 5% erst einmal ausreichen.
Der mount-Befehl ist schon ein wenig komplizierter
- -o nouuid
- braucht man, damit xfs sich nicht darüber beschwert, dass der snapshot die selbe uuid hat, wie das Original. Normalerweise sind die uuids pro System ja nur einmal vergeben.
- -o noatime
- macht Sinn, um beim lesen des snapshots nicht die Access-Times im Dateisystem zu ändern, wäre für unsere Zwecke sinnlos und würde nur unnötig Speicherplatz im reservierten Volume verschwenden.
- -r
- macht Sinn, da wir vom Snapshot nur lesen wollen, aber nicht draufschreiben.
- /usr/local/sbin/post_burp_backup.sh (Auszug)
umount -f /mnt/burp_snapshot/var/lib/owncloud umount -f /mnt/burp_snapshot /sbin/lvremove --force /dev/vg_lugin/burp_snapshot_oc_data /sbin/lvremove --force /dev/vg_lugin/burp_snapshot_root
- die -f bzw. --force Optionen erwzingen die Aktionen, damit sich die Snapshots nicht stapeln, wenn mal was schiefgeht.
Die Skripte werden dann in die burp.conf eingebunden, somit kümmert sich burp darum, diese zur richtigen Zeit auszuführen. Das hat z.B. den Vorteil, dass bei den stündlichen Backup-Versuchen ( siehe Cron-Skript ) nicht ständig snapshots erzeugt werden. burp weiß, dass es die Skripte nur dann laufen lassen braucht, wenn der Server ein Backup zulässt.
4. Cron-Skript
burp bringt schon ein skript in /etc/cron.d/ mit, aber die eigentliche Backup-Operation ist noch auskommentiert. Ich habe das Skript auch noch ein wenig angepasst, hier ein Auszug:
@hourly root [ -x /usr/sbin/burp ] && /usr/sbin/burp -a t >>/var/log/burp-client 2>&1
- Das Cronskript ruft jede Stunde den burp-Client auf und sichert dessen Meldungen in /var/log/burp-client.
- Der Server entscheidet anhand seiner Konfiguration (timer_arg), wann und wie oft er den Client tatsächlich eine Sicherung durchführen lässt.
- Derzeit ist der Server so eingestellt, dass frühestens 23 h nach dem letzten Backup ein weiteres Backup erlaubt wurd. Außerdem lässt der Server Backups nur zwischen 0:00 und 5:59 Uhr zu.
5. Tests
- Manueller Test inklusive lvm-snapshots
- am 07.02.2014 durchgeführt, war erfolgreich und ging obendrein sehr schnell.
- Tests des Cron-Skripts
- erledigt, die turnusmäßigen Backups laufen.
6. TODO
Email-Benachrichtigungen einrichten und testen |
erledigt |
Datenbankdumps vor dem Backup |
erledigt für postgresql |
den Backup-Server sollte ich bei Gelegenheit auch dokumentieren |
ausstehend |
7. Veraltete Inhalte (nicht mehr aktuell für Debian 8)
Debian 8 (jessie) bringt burp 1.3.48 direkt als offizielles Paket mit. Die Erstellung des Backports ist somit nicht mehr notwendig |
7.1. Backport des burp-Pakets für Debian 7.x
Da Burp in Debian wheezy nur die Version 1.3.8 hat, die aber nicht vernünftig IPv6 kann, habe ich kurzerhand mit git-buildpackage i.V.m. cowbuilder einen Backport der Version 1.3.46 für Debian stable (aktuell ist das wheezy bzw. 7.x) erstellt.
Das erstellte .deb habe ich dann per scp in das /root-Verzeichnis hochgeladen und dort mit
dpkg -i burp_1.3.48-1_amd64.deb
installiert. Genau so auch auf dem Backup-Server.
burp 1.3.46 ist vom Entwickler als Upstream-Release-Candidate bezeichnet. D.h. die 1.3.x-Serie wird hauptsächlich mit Bugfixes usw. aktualiert, bis dann irgendwann eine 1.3.y als Stable Release bezeichnet wird.
Es macht also Sinn, für unseren Server die 1.3.46 zu verwenden, und von Fall zu Fall zu entscheiden, ob wir auf eine aktueller 1.3.y updaten oder nicht.
Ich werde per Email (via freecode.com) über neue Releases benachrichtigt und werde mich dann zeitnah um die Updates kümmern.
7.2. Erstellung des Backports
burp Version 1.3.48 ist in unstable. Daher müssen wir von diesem Paket einen Backport nach wheezy erstellen.
7.2.1. Pakete
Zum Erstellen des Backports verwende ich das Paket git-buildpackage (gbp) in Debian. Das hat den Vorteil, dass das Paket ordentlich versioniert ist und die notwendigen Abhängigkeiten zum Paketbau gleich mitgezogen werden. Die Pakete werden in einer stable-chroot-Umgebung gebaut, wofür git-buildpackage das Paket cowbuilder empfiehlt, welches wir auch benutzen.
Paketname |
Zweck |
git-buildpackage |
Das Hauptwerkzeug |
cowbuilder |
chroot-Umgebung für den Paketbau |
pristine-tar |
ebenfalls von gbp empfohlen, für uns an sich nicht wichtig, aber wir installieren es vorsichtshalber auch |
7.2.2. Setup git-buildpackage
mkdir /home/username/devel cd /home/username/devel ### folgender Befehl muss auf einem System mit debian unstable ausgeführt werden, damit man die richtigen Dateien bekommen. ### Alternativ kann man sich die Dateien direkt von einem debian-Mirror runterladen apt-get -t=unstable --download-only --source burp git-import-dsc burp_1.3.48-2.dsc
Damit haben wir ein git-repo erstellt, welches zwei branches hat: upstream und master. Das soll uns aber nicht weiter interessieren, da wir das Paket selbst nicht weiter verändern.
7.2.3. Setup cowbuilder
gbp arbeitet sehr gut mit cowbuilder zusammen, daher müssen wir jetzt die chroot-Umgebung initialiseren.
DIST=wheezy git-pbuilder create
Damit die chroot-Umgebung aktuell bleibt, macht man ab und zu folgendes:
DIST=wheezy git-pbuilder update
7.2.4. Paket erstellen
Jetzt haben wir unsere lokale git-repo mit den Debian-Sourcen des burp-Pakets und die chroot-Umgebung installiert. Jetzt müssen wir nur noch den Backport erstellen.
cd /home/devel/burp DIST=wheezy git-pbuilder ### Einen Kaffee trinken gehen, das dauert ein paar Minuten
7.2.5. Paket auf den Zielsystem installieren
Die von gbp erzeugte .deb wird auf das Zielsystem kopiert (z.B. mit scp).
Auf dem Zielsystem installiert man am besten das Paket gdebi-core, dann werden bei Installation des burp-debs gleich die Abhängigkeiten mitinstalliert.
# Als superuser apt-get install gdebi-core gdebi burp_1.3.48-2_amd64.deb
8. Borg
Ab Debian 10 setzten wir auf Borg Backup.