Benutzer-Werkzeuge

Webseiten-Werkzeuge


adminstoriesdasbackuptechnisch

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

adminstoriesdasbackuptechnisch [20120920 08:20] (aktuell)
Dirk Deimeke angelegt
Zeile 1: Zeile 1:
 +====== Das Backup, technisch ======
 +
 +  * Urspruenglicher Autor: Ramon Kukla
 +  * Urspruengliches Datum: 24.02.2012
 +
 +Hatten wir das noch nicht? Wir hatten vor ein paar Tagen was zum [[http://​adminstories.de/​index.php?/​archives/​125-Das-Backup.html|menschlichen Backup]] erzaehlt, aber ich sehe, wir haben noch nichts dazu gesagt, wie wir auf unseren Servern das Backup machen. Verrueckt :)
 +
 +Wir haben ja zwei Server und verteilen dort die Dienste etwas. Auf Server foo haben wir in erster Linie Mail und Dokumentation. Auf dem Server bar haben wir dann primaer Web, bzw. die Webseiten von uns und einigen Bekannten. Wir sind bekennende Weicheier und erstellen daher taeglich auch immer ein komplettes Backup der fuer uns wichtigen Daten. Ein grosser Teil des Artikels wird aus den beiden Scripts bestehen, die wir zur Sicherung nutzen.
 +
 +Wie wir die Daten zwischen den Servern synchronisieren hatte wir ja vor einiger Zeit schon [[http://​adminstories.de/​index.php?/​archives/​45-Serversynchronisation.html"​ title="​http://​adminstories.de/​index.php?/​archives/​45-Serversynchronisation.html|mal beschrieben]]. Und auch der log4bash-Teil wurde schon [[http://​adminstories.de/​index.php?/​archives/​55-Logging-in-Skripten.html|mal beschrieben]]. Daher gehe ich nachfolgend nicht weiter drauf ein.
 +
 +Fangen wir also mal mit einer Sicherung der wichtigen Dinge an:
 +
 +<code bash>#​!/​bin/​bash
 +
 +logger -t hotcopy.bash -i "​Starting backup"​
 +
 +TIMESTAMP=$(date "​+%Y%m%d-%H%M"​)
 +TARGET_DIRECTORY="/​srv/​bak/​backup-md1"​
 +DB_PREFIX="​db."​
 +DIR_PREFIX="​dir"​
 +TRC_PREFIX="​trc."​
 +
 +DIRECTORIES_TO_COPY="/​root /etc /var/log /var/mail /var/vmail /var/spool /var/www /​home/&​lowast;​ /srv/pwd /​srv/​www/&​lowast;​ /​usr/​local/​src/​scripts /​usr/​share/​munin/​plugins /​var/​run/​munin /​var/​spool/​cron/​crontabs/&​lowast;​ /​srv/​trc/&​lowast;/​attachments"​
 +
 +DATABASE_USERNAME="​deruser"​
 +DATABASE_PASSWORD="​daspasswort"​
 +DATABASE_TO_COPY=$(mysqlshow -u $DATABASE_USERNAME -p$DATABASE_PASSWORD | awk '​!/​Databases|--/​ {print $2}' | grep -v information_schema)
 +
 +cd /srv/trc
 +TRAC_WIKIS=$(ls)
 +cd ->/​dev/​null
 +
 +logger -t hotcopy.bash -i "save a list of installed packets"​
 +if [ -x /​usr/​bin/​dpkg ]
 +then
 +        dpkg --get-selections | bzip2 -9 > $TARGET_DIRECTORY/​dpkg-selections-$TIMESTAMP.bz2
 +fi
 +if [ -x /bin/rpm ]
 +then
 +        rpm -qa | bzip2 -9 > $TARGET_DIRECTORY/​rpm-selections-$TIMESTAMP.bz2
 +fi
 +
 +for i in $DIRECTORIES_TO_COPY
 +do
 +# vim backups entfernen
 +find $i -iname '​*~'​ | xargs -r rm
 +FILENAME=$TARGET_DIRECTORY/​$(echo $DIR_PREFIX$i-$TIMESTAMP.tar.bz2 | sed "​s/​^\///​g ; s/​\//​./​g"​)
 +        find $i -type s > /​usr/​local/​src/​scripts/​sockets.lst
 +        cat /​usr/​local/​src/​scripts/​sockets.lst /​usr/​local/​src/​scripts/​exclude.lst > /​usr/​local/​src/​scripts/​excludesum.lst
 +        tar -Pcjf ${FILENAME} ${i} -X /​usr/​local/​src/​scripts/​excludesum.lst
 +        logger -t hotcopy.bash -i "save $FILENAME"​
 +done
 +
 +for i in $DATABASE_TO_COPY
 +do
 +        FILENAME=$TARGET_DIRECTORY/​$DB_PREFIX$i-$TIMESTAMP.sql.bz2
 +        mysqldump -c --databases --add-drop-database -u $DATABASE_USERNAME -p$DATABASE_PASSWORD $i | bzip2 -9 > $FILENAME
 +        logger -t hotcopy.bash -i "save $FILENAME"​
 +done
 +
 +for i in $TRAC_WIKIS
 +do
 +        /​usr/​local/​bin/​trac-admin /​srv/​trc/​${i} hotcopy $TARGET_DIRECTORY/​$TRC_PREFIX${i}-$TIMESTAMP
 +        tar -Pcjf $TARGET_DIRECTORY/​$TRC_PREFIX${i}-$TIMESTAMP.tar.bz2 $TARGET_DIRECTORY/​$TRC_PREFIX${i}-$TIMESTAMP
 +        logger -t hotcopy.bash -i "save $i"
 +        rm -r $TARGET_DIRECTORY/​$TRC_PREFIX${i}-$TIMESTAMP 1>/​dev/​null
 +done
 +
 +find $TARGET_DIRECTORY -mtime +6 | xargs rm -f
 +
 +logger -t hotcopy.bash -i "​ending backup"​
 +
 +/​usr/​local/​src/​scripts/​ftpbackup.bash 2>&​1</​code>​
 +Sieht vielleicht wild aus, ist es aber nicht. Zu Anfang definieren wir ein paar Dinge wie Benutzername und Kennwort fuer den Datenbankzugriff,​ zu sichernde Vezeichnisse und so weiter. Wichtig fuer uns ist ''​TIMESTAMP''​. Diesen nutzen wir sowohl fuer die Logeintraege,​ als auch als Teil des Dateinamens fuer die Sicherungsdateien.
 +
 +Zu Beginn erstellen wir erst mal eine Liste aller installierten Pakete. Das hilft ungemein wenn der Server, warum auch immer, neu aufgesetzt werden muss. Oder man moechte einen Server identisch installieren. Dann holt man sich die Liste, setzt ein ''​sudo dpkg --set-selections < Liste''​ gefolgt von einem ''​sudo apt-get -u dselect-upgrade''​ ab und hat kurze Zeit spaeter alle benoetigten/​gewuenschten Pakete installiert.
 +
 +Mit einer einfachen Schleife erstellen wir anschliessend Sicherungsdateien von den fuer uns wichtigen Verzeichnissen. Vorab generieren wir die Datei ''​excludesum.lst''​. Dies ist eine Liste aller zu ignorierenden Dateitypen/​Verzeichnisse (*.mp3, etc.) und den zur Laufzeit in dem zu sichernden Verzeichnis zu findenden [[http://​tldp.org/​LDP/​intro-linux/​html/​sect_03_01.html|Sockets]].
 +
 +Die Datenbanken und die Tracdaten holen wir uns auch ueber eine einfache Schleife und erstellen auch hier eine Sicherungsdatei. Wobei bei Trac ''​[[http://​trac.edgewall.org/​wiki/​TracAdmin|trac-admin]]''​ als Bestandteil der Trac-Installation zum Einsatz kommt.
 +
 +Damit haben wir nun ein Haufen Dateien (es sind etwas ueber 90 Dateien mit insgesamt etwa 18 GB) die wir nun sinnvollerweise von der Maschine weg sichern. Vorab loeschen wir auf dem Server mit ''​find $TARGET_DIRECTORY -mtime +6 | xargs rm -f''​ alle Sicherungsdateien,​ die aelter als die angegebenen Tage sind. Ja, es gibt -exec fuer find :-)
 +
 +Jetzt aber erst mal alles weggesichert. Rufen wir also ''/​usr/​local/​src/​scripts/​ftpbackup.bash 2>&​1''​ auf. Damit die aufgerufene Sicherung auch laueft und wir keine Credentials in dem Script eintragen muessen, nutzen wir die Datei ''/​root/​.netrc''​.
 +
 +<code bash>​machine zielserver
 +    login ulopa
 +    password vollkomplex</​code>​
 +Diese Datei wird beim Aufruf von ftp gezogen und genutzt.
 +
 +<code bash>#​!/​bin/​bash
 +logger -t ftpbackup.bash -i "​Starting ftpbackup"​
 +
 +BACKUPDIR=/​srv/​bak/​backup-md1
 +BACKUPDIRFTP=/​
 +KEYFROMUSER=root
 +HOST=zielserver
 +
 +########################################################################​
 +# declare -a L4B_LABEL=(DEBUG INFO WARN ERROR CRITICAL FATAL ENDOFWORLD)
 +
 +source /​usr/​local/​src/​scripts/​log4bash.sh
 +
 +# L4B_DEBUGLVL=1
 +# L4B_DELIM="/"​
 +# L4B_DATE="​date"​
 +# L4B_DATEFORMAT="​+%Y%m%d-%H%M%S.%N"​
 +# L4B_VERBOSE=true
 +# L4B_LOGFILE="​skript.log"​
 +########################################################################​
 +
 +cd $BACKUPDIR
 +
 +for FILENAME in *$(date +%Y%m%d)*
 +do
 +        logger -t ftpbackup.bash -i "​encrypt $FILENAME"​
 +        gpg -e -o $FILENAME.gpg -r $KEYFROMUSER $FILENAME
 +done
 +
 +logger -t ftpbackup.bash -i "copy files"
 +
 +ftp -i << EOF
 +open $HOST
 +bin
 +lcd $BACKUPDIR
 +cd $BACKUPDIRFTP
 +mput *.gpg
 +quit
 +EOF
 +
 +logger -t ftpbackup.bash -i "​delete enrcypted files in $BACKUPDIR"​
 +
 +rm *.gpg
 +
 +
 +logger -t ftpbackup.bash -i "​delete files older 7 days in $BACKUPDIRFTP"​
 +
 +ftp -i <<EOF
 +open $HOST
 +cd $BACKUPDIRFTP
 +mdelete *$(date -d "7 days ago" +%Y%m%d)*
 +quit
 +EOF
 +
 +logger -t ftpbackup.bash -i "​Finishing ftpbackup"</​code>​
 +Wie im oberen Job definieren wir auch hier erst mal ein paar Dinge. Da wir die Daten via FTP uebertragen muessen (gibt nichts anderes) verschluesseln wir diese vorab noch mit PGP. Nach der Verschluesselung werden dann alle Dateien auf den Backupserver uebertragen. Anschliessend werden alle lokal liegenden verschluesselten Dateien geloescht und auch auf dem FTP-Server werden alle Dateien, die aelter als sieben Tage sind, entfernt.
 +
 +Das Backup starten wir um 01:05 Uhr am Morgen und es dauert, mit dem Uebertragen der Daten, knapp ueber 2 Stunden. Das ist fuer uns wichtig zu wissen, da wir anschliessend ja noch den Synchronisationsjob laufen haben. Wenn der zu frueh startet koennen Dateien vielleicht nicht abgeholt werden, da diese im Rahmen des Backups noch nicht erstellt wurden.
 +
 +Wir werden im Zusammenhang mit dem Umzug auf die neuen Server vermutlich etwas am Backup aendern. Aber dazu dann spaeter mehr.
 +
 +Vielleicht ist fuer den ein oder anderen noch [[http://​www.deimeke.net/​dirk/​blog/​index.php?/​pages/​ubucon2010-baremetal.html|unser Vortrag ]]interessant,​ den wir auf der Ubucon 2010 zum Thema "​Restore"​ gehalten hatten. Hintergrund war, dass uns Anfang 2010 unser damals noch singulaer ausgelegter Server abgeraucht ist. Das hatte hohen Unterhaltungswert! :)
 +
 +
 +[[adminstoriesartikel|Zurück zur Uebersicht]]
  
adminstoriesdasbackuptechnisch.txt · Zuletzt geändert: 20120920 08:20 von Dirk Deimeke