Backup

Ansprechpartner

sabine

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:

1. Verzeichnisse im Backup (includes)

Wichtig:

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

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


CategoryDocumentation

Dokumentation/Backup (last edited 2015-11-07 12:16:22 by sabine)