Entwicklung für Produktion: Web-Anwendungen — Backups

Einführung

Nachdem Sie einen Wiederherstellungsplan für die verschiedenen Komponenten Ihrer Anwendung erarbeitet haben, sollten Sie das benötigte Backup-System einrichten. Dieser Tutorial konzentriert sich auf die Verwendung von Bacula als Backupsolution. Die Vorteile einer vollen Laufwerksbackupsysteme wie Bacula sind, dass Sie individuell über den Level der Dateien zu backen und wieder herstellen sowie Backups und Wiederherstellungen nach einem Zeitplan zu schaffen, der für Sie am besten ist.

Lösungen wie DigitalOcean Droplet Backups (Snapshots des gesamten Droplets) sind leicht zu setzen und möglicherweise genug für Ihre Bedürfnisse, falls Sie nur wöchentliche Backups benötigen. Falls Sie DigitialOcean Backups auswählen, stellen Sie sicher, dass Sie die Datenbank mit dem Hot Backups erstellen-Abschnitt aktivieren.

In diesem Abschnitt des Leitfadens werden wir Bacula einrichten, um tägliche Backups der erforderlichen Backups der Server zu pflegen, die die Anwendungsstruktur Ihres Setups (db1, app1, app2 und lb1) ausmachen und die wir zuvor in unserem Wiederherstellungsplan definiert haben. Es handelt sich hierbei um ein Leitfaden, der Ihnen zeigt, wie Sie mit Bacula Backups eines LAMP-Stacks erstellen können. Wir werden auch Percona XtraBackup verwenden, um Ihre MySQL-Datenbank hot zu sichern. Schließlich werden wir rsync verwenden, um eine Kopie Ihrer Backups auf einem Server in einem entfernten Rechenzentrum zu erstellen. Dies fügt Ihrem Setup zwei Server hinzu: backups und remotebackups (befindet sich in einem separaten Rechenzentrum).

Lassen Sie uns beginnen.

Installieren Sie Bacula auf dem Backups-Server

Richten Sie Bacula auf Ihrem backups-Server ein, indem Sie diesen Leitfaden befolgen: Wie man Bacula Server auf Ubuntu 14.04 installiert.

Um die Konfiguration des Bacula Directors (Servers) zu organisieren, folgen Sie bitte der Organize Bacula Director Configuration (Server)-Abschnitt dieser Anleitung: How To Back Up an Ubuntu 14.04 Server with Bacula. Sie benötigen dazu den Director Name, wenn Sie das Backup der Servern (die du backen möchtest) einrichten. Wenn Sie den Abschnitt Install and Configure Bacula Client erreichen, stoppen Sie dort. Hinweis: Wir werden für alle Backup Jobs die RemoteFile-Pool verwenden. Mit dem sagten, könnten Sie vor dem Fortfahren einige Einstellungen ändern.

Install Bacula Client on Each Server

Installieren Sie auf jeder gewünschten Server (db1, app1, app2 und lb1) den Bacula-Client, indem Sie die Install and Configure Bacula Client-Abschnitt dieser Anleitung: How To Back Up an Ubuntu 14.04 Server with Bacula folgen. Stoppen Sie bei der Add FileSets (Server)-Abschnitt.

Bitte beachten Sie, dass Sie den DateiDämonennamen (normalerweise die Hostnamensuffix „-fd“) und das Leiterpasswort (das Passwort, das der Bacula-Server zum Herstellen einer Verbindung mit jeder Client-Server verwenden wird) aus dem bacula-fd.conf-Datei auf jeder Server einfügen müssen, auf dem Sie den Bacula-Client installiert haben.

Bacula-Klienten zu Backup-Server hinzufügen

Auf dem Backups-Server, dem Bacula-Server, fügen Sie für jeden Server hinzu, auf dem Sie den Bacula-Client installiert haben, einen Client-Ressourcen zur /etc/bacula/conf.d/clients.conf-Datei hinzu.

Öffnen Sie die clients.conf-Datei:

  1. sudo vi /etc/bacula/conf.d/clients.conf

Hier ist ein Beispiel für die Client-Ressourcedefinition für den Datenbankserver, db1. Die Werte von Name sollten mit dem Namen des FileDaemon-Ressourcen auf dem Client-Server übereinstimmen und die Passwort sollte mit dem Passwort der Director-Ressourcen auf dem Client-Server übereinstimmen; diese Werte finden Sie in /etc/bacula/bacula-fd.conf auf jeder Bacula-Client-Server:

clients.conf — Example Client resource definition
Client {
  Name = db1-fd
  Address = db1.nyc3.example.com
  FDPort = 9102
  Catalog = MyCatalog
  Password = "PDL47XPnjI0QzRpZVJKCDJ_xqlMOp4k46"          # password for Remote FileDaemon
  File Retention = 30 days            # 30 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

Erstellen Sie eine ähnliche Client-Ressource für jede der restlichen Bacula-Client-Servern. Im Beispiel sollen vier Client-Ressourcen erstellt werden: db1-fd, app1-fd, app2-fd, und lb1-fd. Dies konfiguriert den Bacula-Director, auf dem Backups-Server, damit er sich mit jeder Bacula-Client auf jeder Server verbinden kann…

Speichern und Beenden.

Weitere Details zu diesem Abschnitt finden Sie unter Installieren und Konfigurieren des Bacula-Clients im How To Back Up an Ubuntu Server with Bacula Tutorial.

Erstellen Sie heiße Sicherungen Ihrer Datenbank

Um sicherzustellen, dass wir konsistente (d. h. nutzbare) Sicherungen unserer aktiven Datenbank erstellen, muss besonders sorgfältig vorgegangen werden. Eine einfache und effektive Methode, heiße Sicherungen mit MySQL zu erstellen, ist die Verwendung von Percona XtraBackup.

Installieren Sie Percona XtraBackup

Auf Ihrem Datenbankserver, db1, installieren und konfigurieren Sie Percona XtraBackup, indem Sie dieses Tutorial befolgen: How To Create Hot Backups of MySQL Databases with Percona XtraBackup on Ubuntu 14.04. Stoppen Sie, wenn Sie den Abschnitt Perform Full Hot Backup erreichen.

Erstellen Sie ein Skript für XtraBackup

Percona XtraBackup ist bereit, die Datenbanken Ihres MySQL-Servers unter Hot-Bedingungen zu sichern, was schließlich von Bacula (oder DigitalOcean Backups) übernommen wird. Die Hot-Sicherungen müssen jedoch irgendwie automatisiert werden. Wir stellen eine der einfachsten Lösungen ein: Ein Bash-Skript und einen Cron-Job.

Erstellen Sie ein Bash-Skript namens run_extra_backup.sh in /usr/local/bin:

  1. sudo vi /usr/local/bin/run_xtrabackup.sh

Fügen Sie das folgende Skript hinzu. Sicherheitshalber sollten Sie die Benutzername und Password mit denen ersetzen, die Sie bei der Installation von XtraBackup festlegten:

/usr/local/bin/run_xtrabackup.sh
#!/bin/bash

# vor xtrabackup
chown -R mysql: /var/lib/mysql
find /var/lib/mysql -type d -exec chmod 770 "{}" \;

# löschen bestehendes komplettes Backup
rm -r /data/backups/full

# xtrabackup create backup
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup prepare backup
innobackupex --apply-log /data/backups/full

Speichern und Exit. Durch Ausführen dieses Skripts (mit Superuser-Berechtigungen) werden Sie das aktuelle kompletteste Backup von /data/backups/full löschen und ein neues erstellen. Mehr Informationen über die Erstellung von Sicherungen mit XtraBackup finden Sie im Abschnitt Ausführen eines vollen Hot-Backups des XtraBackup-Tutorials.

Machen Sie das Skript ausführbar:

  1. sudo chmod +x /usr/local/bin/run_xtrabackup.sh

Um eine sichere Datenbankbackup zu erstellen, müssen wir vor dem Versuch von Bacula die Datenbankserver zu backen das Skript XtraBackup ausführen. Eine gute Lösung ist es, dieses Skript als „Pre-Backup-Skript“ für Ihr Bacula-Backup-Job zu konfigurieren, aber wir wollen uns hier auf einen einfachen Weg mit einem cron-Job beschränken.

Erstellen Sie eine Cron-Konfigurationsdatei (Dateien im Verzeichnis /etc/cron.d werden automatisch zum Crontab des Benutzers root hinzugefügt):

  1. sudo vi /etc/cron.d/xtrabackup

Fügen Sie folgenden Cron-Job hinzu:

/etc/cron.d/xtrabackup
30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

Dies schreibt das Skript täglich um 22:30 Uhr (22. Stunde, 30. Minute) als root aus. Wir haben diese Zeit gewählt, weil Bacula derzeit täglich um 23:05 Uhr Backup Jobs ausführen lässt—wir sprechen darüber später. Dieser Zeitpunkt erlaubt 35 Minuten, damit das Skript XtraBackup abgeschlossen ist.

Nachdem die Datenbank Hot-Backups eingerichtet sind, schauen wir uns die Bacula-Backup-Dateisets an.

Bacula Dateisets konfigurieren

Bacula erstellt Sicherungen von Dateien, die in den FileSets angegeben sind, die mit den Sicherungsaufträgen verbunden sind, die ausgeführt werden sollen. Dieser Abschnitt behandelt die Erstellung von FileSets, die die erforderlichen Sicherungen enthalten, die wir in unseren Wiederherstellungsplänen identifiziert haben. Weitere Details zur Hinzufügung von FileSets zu Bacula finden Sie im Abschnitt Dateisätze hinzufügen (Server) des Bacula-Tutorials.

Auf Ihrem Sicherungsserver öffnen Sie die Datei filesets.conf:

  1. sudo vi /etc/bacula/conf.d/filesets.conf

Datenbank-Server-FileSet

Die erforderlichen Sicherungen für unseren Datenbank-Server, entsprechend unserem Wiederherstellungsplan für den Datenbank-Server, umfassen:

  • MySQL-Datenbank: Eine Sicherheitskopie wird durch unser XtraBackup-Skript in /data/backups/full täglich um 22:30 Uhr erstellt
  • MySQL-Konfiguration: befindet sich in /etc/mysql

Wir werden auch das XtraBackup-Skript hinzufügen: /usr/local/bin/run_xtrabackup.sh und die zugehörige cron-Datei.

Angesichts unserer erforderlichen Sicherungen fügen wir diesen „MySQL-Datenbank“-FileSet zu unserer Bacula-Konfiguration hinzu:

filesets.conf — MySQL Database
FileSet {
  Name = "MySQL Database"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /data/backups
    File = /etc/mysql/my.cnf
    File = /usr/local/bin/run_xtrabackup.sh
    File = /etc/cron.d/xtrabackup
  }
  Exclude {
    File = /data/backups/exclude
  }
}

Nun gehen wir zur Erstellung des Dateisatzes für den Anwendungsserver über.

Anwendungsserver-Dateisatz

Die erforderlichen Sicherungen unserer Anwendungsserver, gemäß unserem Anwendungsserver-Wiederherstellungsplan, umfassen:

  • Anwendungsdateien: im Beispiel unter /var/www/html

Mit den erforderlichen Sicherungen im Hinblick, schließen wir diesen „Apache-Dokumenteigenschaft“ Dateisatz zu unserer Bacula-Konfiguration hinzu:

filesets.conf — Apache DocumentRoot
FileSet {
  Name = "Apache DocumentRoot"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /var/www/html
  }
  Exclude {
    File = /var/www/html/exclude
  }
}

Sie können auch die Konfigurationsdatei des Apache-Ports einbeziehen, aber sie ist leicht ersetztbar.

Nun gehen wir zur nächsten Schritte mit dem Load Balancer-Server Dateisatz.

Die erforderlichen Sicherungen für unsere Load Balancer-Server, gemäß unserem Load Balancer-Server-Wiederherstellungsplan, umfassen:

  • SSL-Zertifikat (PEM) und zugehörige Dateien: im Beispiel unter /root/certs in unserem Fall
  • HAProxy-Konfigurationsdatei: unter /etc/haproxy

Mit unseren erforderlichen Sicherungen im Hinblick, fügen wir diesen „Apache-Dokumenteigenschaft“ Dateisatz zu unserer Bacula-Konfiguration hinzu:

filesets.conf — SSL Certs and HAProxy Config
FileSet {
  Name = "SSL Certs and HAProxy Config"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /root/certs
    File = /etc/haproxy
  }
  Exclude {
    File = /root/exclude
  }
}

Speichern und Exit.

Jetzt sind unsere Filesets konfiguriert. Schauen wir uns nun an, wie wir die Bacula-Backup-Jobs erstellen, die diese Filesets verwenden werden sollen.

Bacula Backup Jobs erstellen

Wir erstellen Bacula-Backup-Jobs, die auf unseren Servern Backups erstellen werden.

Erstellen Sie ein jobs.conf-Datei im Verzeichnis /etc/bacula/conf.d:

  1. sudo vi /etc/bacula/conf.d/jobs.conf

Datenbank-Server-Backup-Job

Für den Datenbank-Server-Backup-Job erstellen wir einen neuen Job namens „Backup_db1“. Die wichtige Punkte hier sind, dass wir die richtigen Klienten (db1-fd) und Filesets (MySQL-Datenbank) angeben:

jobs.conf — Backup db1
Job {
  Name = "Backup db1"
  JobDefs = "DefaultJob"
  Client = db1-fd
  Pool = RemoteFile
  FileSet="MySQL Database"
}

Nun stellen wir die Backup-Jobs für die Applikationsserver ein.

Anwendungs-Server-Backup-Jobs

Für unsere Anwendungsserver erstellen wir zwei Backup-Jobs namens „Backup_app1“ und „Backup_app2“. Die wichtige Punkte hier sind, dass wir die richtigen Clients (app1-fd und app2-fd) und Filesets (Apache-Dokumentumordner) angeben.

App1-Job:

jobs.conf — Backup app1
Job {
  Name = "Backup app1"
  JobDefs = "DefaultJob"
  Client = app1-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

App2-Aufgabe:

jobs.conf — Backup app2
Job {
  Name = "Backup app2"
  JobDefs = "DefaultJob"
  Client = app2-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

Jetzt werden wir die Aufgabe für den Lastenausgleichsserver einrichten.

Lastenausgleichsserver-Backupauftrag

Für unser Lastenausgleichsserver-Backupauftrag erstellen wir einen neuen Auftrag mit dem Namen „Backup lb1“. Wichtig hier ist, dass wir den richtigen Client (lb1-fd) und das richtige Dateiset (SSL-Zertifikate und HAProxy-Konfiguration) angeben:

jobs.conf — Backup lb1
Job {
  Name = "Backup lb1"
  JobDefs = "DefaultJob"
  Client = lb1-fd
  Pool = RemoteFile
  FileSet="SSL Certs and HAProxy Config"
}

Speichern und beenden.

Jetzt sind unsere Backup-Aufgaben eingerichtet. Der letzte Schritt besteht darin, den Bacula-Director neu zu starten.

Neustart des Bacula-Directors

Auf dem Backup-Server starten Sie den Bacula-Director neu, um alle unsere Änderungen zu übernehmen:

  1. sudo service bacula-director restart

Bitte testen Sie nun Ihre Client-Verbindungen und die Sicherungsjobs, die im Bacula-Tutorial zur Sicherung eines Servers behandelt werden. Dieses Tutorial enthält auch die Schritte für die Wiederherstellung von Bacula-Sicherungen. Beachten Sie dabei, dass die Wiederherstellung der MySQL-Datenbank den Schritt Wiederherstellen von Sicherungen aus dem Percona XtraBackup-Tutorial erfordern wird.

Bewerten Sie die Sicherungsplanung

Die Sicherungsplanung bei Bacula kann durch die Modifikation der Director-Konfiguration (/etc/bacula/bacula-dir.conf) angepasst werden. Alle von uns erstellten Sicherungsjobs verwenden das „DefaultJob“, das die „WeeklyCycle“-Zeitschema benutzt, das definiert ist als:

  • Vollbackup am ersten Sonntag eines Monats um 23:05 Uhr
  • Differenzialbackups an allen anderen Sonntagen um 23:05 Uhr
  • Inkremental-Backups an anderen Tagen, Montag bis Samstag, um 23:05 Uhr

Sie können dies über die Konsole des Directors verifizieren und sollten dort alle Ihre geplanten Jobs anzeigen sehen:

Director Status — Scheduled Jobs
Scheduled Jobs: Level Type Pri Scheduled Name Volume =================================================================================== Incremental Backup 10 20-May-15 23:05 BackupLocalFiles MyVolume Incremental Backup 10 20-May-15 23:05 Backup lb1 Remote-0002 Incremental Backup 10 20-May-15 23:05 Backup app2 Remote-0002 Incremental Backup 10 20-May-15 23:05 Backup app1 Remote-0002 Incremental Backup 10 20-May-15 23:05 Backup db1 Remote-0002

Freuen Sie sich auf die Möglichkeit, die Planung jeder Ihrer Sicherheitsabgaben frei zu gestalten. Es würde sinnvoll sein, den Zeitplan der Applikationsservern zu verändern, damit er mit dem Zeitplan des Percona XtraBackup-Skripts gleichzeitig ausführt wird (um 22:30 Uhr). Dadurch werden die Anwendungs- und Datenbankbackups nicht unterschiedlich von der jeweils anderen sein.

Einstellungen für Remote-Backups

Nun sind wir bereit, einen Remote-Server einzustellen, der Kopien unserer Bacula-Backups aufbewahren sollte. Dieser Remote-Server sollte in einer geografisch getrennten Region sein, damit Sie auch bei einem Katastrophalen Ereignis im Produktionsdatenzentrum eine Kopie Ihrer wichtigen Backups haben. Im Beispiel setzen wir uns für einen DigitalOceans Server in der San Francisco (SFO1) Region für unseren remotebackups-Server fest.

Wir erklären eine einfache Methode, um unsere Backups vom backups-Server an den remotebackups-Server zu senden, indem wir öffentliche SSH-Schlüssel, rsync und cron nutzen.

Auf dem remotebackups-Server erstellen Sie einen Benutzernamen, der für das rsync-Login genutzt werden soll.

Nachdem Sie auf dem Backups-Server als Root ein Password-Less SSH-Key-Pair generiert haben, installieren Sie die öffentliche Schlüssel auf den Benutzer Remotebackups, der Sie gerade erstellt haben. Dies ist im unseren Tutorial zum Setzen von SSH-Schlüsseln beschrieben.

Auf dem Backups-Server schreiben Sie einen Befehl für Rsync, der das Backup-Datenverzeichnis (z.B. /bacula/backup) auf irgendwo auf dem Remotebackups-Server kopiert. Die Verwendung von Rsync ist in unserem Tutorial über Rsync behandelt. Der Befehl sieht wahrscheinlich etwas aus wie dieser:

  1. rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup

Der Befehl schreiben Sie in ein Skript, z.B. /usr/local/bin/rsync_backups.sh und machen Sie es exekutierbar.

Schließlich sollten Sie einen Cron-Job erstellen, der das rsync_backups.sh Skript als Root ausführt, nachdem die Bacula-Backup-Jobs normalerweise abgeschlossen sind. Dies ist in unserem Tutorial über die Planung von Routine-Aufgaben mit Cron beschrieben.

Nachdem Sie alle diese Schritte durchgeführt haben, verifizieren Sie am nächsten Tag, dass Ihre Backups auf dem Remotebackups-Server vorhanden sind.

Weitere Aspekte

Wir haben bisher noch nicht über die Speicheranforderungen für Ihre Sicherungssysteme gesprochen. Sie sollten definitiv überprüfen, wie viel Speicherplatz Ihre Sicherungsdateien benötigen und Ihren Setup und Backup-Plan nach den eigenen Bedürfnissen und Ressourcen anpassen.

Außerdem sollten Sie wahrscheinlich eine Sicherungskonfiguration für weitere Server erstellen, die zu Ihrem Setup hinzugefügt werden. So sollten Sie Bacula so konfigurieren, dass es auch die Daten der Überwachungs- und Zentrallogingserver sowie jeder anderen Server sichern, die Sie hinzufügen.

Zusammenfassung

Sie sollten jetzt täglich Sicherungen haben und eine Remote-Kopie dieser Sicherungen. Stellen Sie sicher, dass Sie die Dateien wiederherstellen können und fügen Sie die Schritte zur Wiederherstellung Ihrer Daten in Ihre Recovery-Plans ein.

Bitte gehen Sie in das nächste Tutorial, um mit dem Aufbau der Überwachung für Ihr Produktionsserver-Setup beginnen: Building for Production: Web Applications — Monitoring.

Source:
https://www.digitalocean.com/community/tutorials/building-for-production-web-applications-backups