Bauen für die Produktion: Webanwendungen - Backups

Einführung

Nachdem Sie einen Wiederherstellungsplan für die verschiedenen Komponenten Ihrer Anwendung erstellt haben, sollten Sie das Backup-System einrichten, das für die Unterstützung erforderlich ist. Dieses Tutorial konzentriert sich auf die Verwendung von Bacula als Backup-Lösung. Der Vorteil eines umfassenden Backup-Systems wie Bacula besteht darin, dass Sie die vollständige Kontrolle darüber haben, was Sie auf der Ebene der einzelnen Dateien sichern und wiederherstellen. Außerdem können Sie Backups und Wiederherstellungen so planen, wie es für Sie am besten ist.

Backup Diagram

Lösungen wieDigitalOcean Droplet Backups (Snapshot-Backups Ihres gesamten Droplets) sind einfach einzurichten und können für Ihre Anforderungen ausreichen, wenn Sie nur wöchentliche Backups benötigen. Wenn Sie sich für DigitalOcean-Sicherungen entscheiden, müssen Sie Hot-Backups Ihrer Datenbank einrichten, indem Sie dem AbschnittCreate Hot Backups of Your Databasefolgen.

In diesem Teil des Tutorials richten wir eine Bacula ein, um tägliche Sicherungen derrequired backups der Server zu verwalten, aus denen Ihr Anwendungssetup (db1, app1, app2 und lb1) besteht, das zuvor in unserem Wiederherstellungsplan definiert wurde. Im Wesentlichen ist dies ein Tutorial, das Ihnen zeigt, wie Sie mit Bacula Backups eines LAMP-Stacks erstellen. Wir werden auch Percona XtraBackup verwenden, um Hot-Backups Ihrer MySQL-Datenbank zu erstellen. Zuletzt erstellen wir mit rsync eine Kopie Ihrer Sicherungen auf einem Server in einem Remote-Rechenzentrum. Dadurch werden Ihrem Setup zwei Server hinzugefügt:backups undremotebackups (in einem separaten Rechenzentrum).

Lass uns anfangen.

Installieren Sie Bacula auf dem Backup-Server

Richten Sie Bacula auf Ihrembackups-Server ein, indem Sie diesem Tutorial folgen:How To Install Bacula Server on Ubuntu 14.04.

Folgen Sie dann dem AbschnittOrganize Bacula Director Configuration (Server) in diesem Lernprogramm:How To Back Up an Ubuntu 14.04 Server with Bacula. Sie benötigen den Director-Namen zum Einrichten der Bacula-Clients (auf den Servern, die Sie sichern möchten). Halten Sie an, wenn Sie den AbschnittInstall and Configure Bacula Client erreichen.

Beachten Sie, dass wir den RemoteFile-Pool für alle Sicherungsjobs verwenden, die wir einrichten werden. Vor diesem Hintergrund möchten Sie möglicherweise einige Einstellungen ändern, bevor Sie fortfahren.

Installieren Sie Bacula Client auf jedem Server

Installieren Sie den Bacula-Client auf jedem Server, den Sie sichern möchten (db1, app1, app2 und lb1), indem Sie dem AbschnittInstall and Configure Bacula Client dieses Lernprogramms folgen:How To Back Up an Ubuntu 14.04 Server with Bacula. Halten Sie an, wenn Sie den AbschnittAdd FileSets (Server) erreichen.

Beachten Sie, dass Sie dieFileDaemon Name (normalerweise der durch "-fd" angehängte Hostname) und dieDirector Password (das Kennwort, mit dem der Bacula-Server eine Verbindung zu jedem Client herstellt) vonbacula-fd.confbenötigen. s Datei auf jedem Server.

Fügen Sie Bacula-Clients zum Sicherungsserver hinzu

Fügen Sie aufbackups, dem Bacula-Server, der/etc/bacula/conf.d/clients.conf-Datei für jeden Server, auf dem Sie den Bacula-Client installiert haben, einClient resource hinzu.

Öffnen Sie die Dateiclients.conf:

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

Hier ist ein Beispiel für die Client-Ressourcendefinition für den Datenbankserverdb1. Beachten Sie, dass der Wert vonName mit dem Namen der RessourceFileDaemonund der Wert vonPasswordmit dem Kennwort der RessourceDirectorauf dem Client-Server übereinstimmen sollte - diese Werte kann in/etc/bacula/bacula-fd.conf auf jedem Bacula-Client-Server gefunden werden:

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 für jeden verbleibenden Bacula-Client-Server eine ähnliche Client-Ressource. In unserem Beispiel sollten vier Client-Ressourcen vorhanden sein, wenn wir fertig sind:db1-fd,app1-fd,app2-fd undlb1-fd. Dadurch wird der Bacula Director auf dembackups-Server so konfiguriert, dass er auf jedem Server eine Verbindung zum Bacula-Client herstellen kann.

Speichern und schließen.

Weitere Details zu diesem Abschnitt finden Sie inInstall and Configure Bacula Client inHow To Back Up an Ubuntu Server with Bacula tutorial.

Erstellen Sie Sicherungskopien Ihrer Datenbank

Um sicherzustellen, dass wir konsistente (d. H. nutzbare) Sicherungen unserer aktiven Datenbank sind mit besonderer Sorgfalt durchzuführen. Eine einfache und effektive Möglichkeit zum Erstellen von Hot-Backups mit MySQL ist die Verwendung von Percona XtraBackup.

Installieren Sie Percona XtraBackup

Installieren und konfigurieren Sie Percona XtraBackup auf Ihrem Datenbankserverdb1, indem Sie diesem Tutorial folgen:How To Create Hot Backups of MySQL Databases with Percona XtraBackup on Ubuntu 14.04. Halten Sie an, wenn Sie den AbschnittPerform Full Hot Backup erreichen.

XtraBackup-Skript erstellen

Percona XtraBackup ist bereit, Hot-Backups Ihrer MySQL-Datenbank zu erstellen, die letztendlich von Bacula (oder DigitalOcean Backups) gesichert werden. Die Hot-Backups müssen jedoch irgendwie geplant werden. Wir werden die einfachste Lösung einrichten: ein Bash-Skript und einen Cron-Job.

Erstellen Sie ein Bash-Skript mit dem Namenrun_extra_backup.sh in/usr/local/bin:

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

Fügen Sie das folgende Skript hinzu. Stellen Sie sicher, dass Sie den Benutzer und das Kennwort durch das ersetzen, was Sie bei der Installation von XtraBackup eingerichtet haben:

/usr/local/bin/run_xtrabackup.sh

#!/bin/bash

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

# delete existing full 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 schließen. Durch Ausführen dieses Skripts (mit Superuser-Berechtigungen) wird die vorhandene XtraBackup-Sicherung bei/data/backups/full gelöscht und eine neue vollständige Sicherung erstellt. Weitere Informationen zum Erstellen von Backups mit XtraBackup finden Sie im AbschnittPerform Full Hot Backup des XtraBackup-Tutorials.

Machen Sie das Skript ausführbar:

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

Um unsere Datenbank ordnungsgemäß zu sichern, müssen wir das XtraBackup-Skript ausführen (und abschließen), bevor Bacula versucht, den Datenbankserver zu sichern. Eine gute Lösung besteht darin, Ihren Bacula-Sicherungsjob so zu konfigurieren, dass das Skript als "Pre-Backup-Skript" ausgeführt wird. Wir werden uns jedoch dafür entscheiden,cron job zu verwenden, um es einfach zu halten.

Erstellen Sie eine Cron-Konfigurationsdatei (Dateien in/etc/cron.dwerden zur crontab von root hinzugefügt):

sudo vi /etc/cron.d/xtrabackup

Fügen Sie den folgenden Cron-Job hinzu:

/etc/cron.d/xtrabackup

30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

Dadurch wird das Skript so geplant, dass es jeden Tag um 22:30 Uhr (22. Stunde, 30. Minute) als root ausgeführt wird. Wir haben diese Zeit gewählt, da Bacula derzeit täglich um 23:05 Uhr seine Sicherungsjobs ausführen soll - wir werden dies später besprechen. Auf diese Weise kann das XtraBackup-Skript innerhalb von 35 Minuten ausgeführt werden.

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

Konfigurieren Sie Bacula FileSets

Bacula erstellt Sicherungen von Dateien, die in den Dateisätzen angegeben sind, die den Sicherungsjobs zugeordnet sind, die ausgeführt werden. In diesem Abschnitt wird das Erstellen von FileSets behandelt, die dierequired backupsenthalten, die wir in unseren Wiederherstellungsplänen angegeben haben. Weitere Informationen zum Hinzufügen von FileSets zu Bacula finden Sie im AbschnittAdd FileSets (Server) des Bacula-Tutorials.

Öffnen Sie auf dem Server Ihresbackupsdie Dateifilesets.conf:

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

Database Server FileSet

Die erforderlichen Sicherungen für unseren Datenbankserver gemäß unserem Datenbankserver-Wiederherstellungsplan umfassen:

  • MySQL database: Eine Sicherungskopie wird von unserem XtraBackup-Skript in/data/backups/full täglich um 22:30 Uhr erstellt

  • MySQL configuration: befindet sich in/etc/mysql

Wir werden auch das XtraBackup-Skript/usr/local/bin/run_xtrabackup.sh und die zugehörige Cron-Datei einschließen.

In Anbetracht unserer erforderlichen Backups werden wir dieses "MySQL-Datenbank" -Dateiset zu unserer Bacula-Konfiguration hinzufügen:

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

Fahren wir nun mit dem Anwendungsserver FileSet fort.

Anwendungsserver-Dateigruppe

Die erforderlichen Sicherungen für Ihre Anwendungsserver gemäß Ihrem Wiederherstellungsplan für Anwendungsserver umfassen Folgendes:

  • Application Files: befindet sich in unserem Beispiel in/var/www/html

In Anbetracht unserer erforderlichen Backups werden wir dieses "Apache DocumentRoot" -Dateiset zu unserer Bacula-Konfiguration hinzufügen:

filesets.conf — Apache DocumentRoot

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

Möglicherweise möchten Sie auch die Konfigurationsdatei für Apache-Ports einschließen, diese kann jedoch problemlos ersetzt werden.

Gehen wir nun zum Load-Balancer-Server FileSet über.

Load Balancer Server FileSet

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

  • SSL Certificate (PEM) and related files: befindet sich in unserem Beispiel in/root/certs

  • HAProxy configuration file: befindet sich in/etc/haproxy

In Anbetracht unserer erforderlichen Backups werden wir dieses "Apache DocumentRoot" -Dateiset zu unserer Bacula-Konfiguration hinzufügen:

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 schließen.

Jetzt sind unsere FileSets konfiguriert. Fahren wir mit der Erstellung der Bacula-Sicherungsjobs fort, die diese FileSets verwenden.

Erstellen Sie Bacula-Sicherungsjobs

Wir werden Bacula-Backup-Jobs erstellen, die ausgeführt werden, und Backups unserer Server erstellen.

Erstellen Sie einejobs.conf-Datei in/etc/bacula/conf.d:

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

Datenbankserver-Sicherungsjob

Für unseren Datenbankserver-Sicherungsjob erstellen wir einen neuen Job mit dem Namen "Backup db1". Wichtig hierbei ist, dass wir die richtigenClient (db1-fd) undFileSet (MySQL-Datenbank) angeben:

jobs.conf — Backup db1

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

Jetzt richten wir die Sicherungsjobs für den Anwendungsserver ein.

Anwendungsserver-Sicherungsjobs

Für unsere Anwendungsserver erstellen wir zwei Sicherungsjobs mit den Namen "Sicherungs-App1" und "Sicherungs-App2". Wichtig hierbei ist, dass wir die richtigenClients (app1-fd und app2-fd) undFileSet (Apache DocumentRoot) angeben.

App1 Job:

jobs.conf — Backup app1

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

App2-Job:

jobs.conf — Backup app2

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

Jetzt richten wir den Sicherungsjob für den Load Balancer-Server ein.

Load Balancer Server-Sicherungsjob

Für unseren Lastausgleichsserver-Sicherungsjob erstellen wir einen neuen Job mit dem Namen "Backup lb1". Wichtig hierbei ist, dass wir die richtigenClient (lb1-fd) undFileSet (SSL Certs und HAProxy Config) angeben:

jobs.conf — Backup lb1

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

Speichern und schließen.

Jetzt sind unsere Backup-Jobs konfiguriert. Der letzte Schritt ist der Neustart des Bacula Director.

Starten Sie Bacula Director neu

Starten Sie auf dembackups-Server den Bacula Director neu, um alle unsere Änderungen zu übernehmen:

sudo service bacula-director restart

An diesem Punkt möchten Sie Ihre Clientverbindungen und Sicherungsjobs testen, die beide inHow To Back Up a Server with Bacula tutorial behandelt werden. In diesem Tutorial erfahren Sie auch, wie Sie Bacula-Backups wiederherstellen. Beachten Sie, dass Sie zum Wiederherstellen der MySQL-Datenbank den SchrittPerform Backup Restoration im Percona XtraBackup-Lernprogramm ausführen müssen.

Überprüfen Sie den Sicherungszeitplan

Der Bacula-Sicherungsplan kann durch Ändern der Bacula Director-Konfiguration (/etc/bacula/bacula-dir.conf) angepasst werden. Alle von uns erstellten Sicherungsjobs verwenden das JobDef "DefaultJob", das den Zeitplan "WeeklyCycle" verwendet, der wie folgt definiert ist:

  • Vollständige Sicherung am ersten Sonntag eines Monats um 23:05 Uhr

  • Differenzielle Backups an allen anderen Sonntagen um 23:05 Uhr

  • Inkrementelle Backups an anderen Tagen, Montag bis Samstag, um 23:05 Uhr

Sie können dies überprüfen, indem Sie mit der Bacula-Konsole den Status des Directors überprüfen. Es sollte alle geplanten Jobs ausgeben:

Director Status — Scheduled JobsScheduled 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

Sie können den Zeitplan für Ihre Sicherungsjobs jederzeit ändern oder hinzufügen. Es ist sinnvoll, den Zeitplan der Anwendungsserver so zu ändern, dass er zur gleichen Zeit ausgeführt wird, zu der das Percona XtraBackup-Skript ausgeführt wird (22.30 Uhr). Dies verhindert, dass die Sicherungen der Anwendung und der Datenbank inkonsistent sind.

Einrichten von Remote-Sicherungen

Jetzt können wir einen Remote-Server einrichten, auf dem Kopien unserer Bacula-Backups gespeichert werden. Dieser Remoteserver sollte sich in einer geografisch getrennten Region befinden, damit Sie eine Kopie Ihrer wichtigen Sicherungen haben, auch wenn sich in Ihrem Produktionsdatenzentrum ein Notfall ereignet. In unserem Beispiel verwenden wir die Region San Francisco (SFO1) von DigitalOcean für den Serverremotebackups.

Wir werden eine einfache Methode erklären, um unsere Backups von unserembackups-Server mit öffentlichen SSH-Schlüsseln, rsync und cron an unserenremotebackups-Server zu senden.

Auf dem Server vonremotebackupscreate a user, die für die rsync-Anmeldung verwendet werden.

Generieren Sie als Nächstes auf dembackups-Server ein SSH-Schlüsselpaar ohne Kennwort als Root. Installieren Sie den öffentlichen Schlüssel auf dem Benutzer vonremotebackups, den Sie gerade erstellt haben. Dies wird in unseremHow To Set Up SSH KeysTutorial behandelt.

Schreiben Sie auf dembackups-Server einen rsync-Befehl, der die Bacula-Sicherungsdaten (/bacula/backup) irgendwo auf denremotebackups-Server kopiert. Die Rsync-Nutzung wird inHow To Use Rsync tutorial abgedeckt. Der Befehl sieht wahrscheinlich so aus:

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

Fügen Sie den Befehl einem Skript hinzu, z. B./usr/local/bin/rsync_backups.sh, und machen Sie ihn ausführbar.

Zuletzt möchten Sie einen Cron-Job einrichten, der dasrsync_backups.sh-Skript als Root ausführt, nachdem die Bacula-Sicherungsjobs normalerweise abgeschlossen sind. Dies ist in unserenHow To Schedule Routine Tasks With Cron tutorial abgedeckt.

Nachdem Sie dies alles eingerichtet haben, stellen Sie sicher, dass am nächsten Tag eine Kopie Ihrer Sicherungen auf dem Server vonremotebackupsvorhanden ist.

Andere Überlegungen

Wir haben nicht über die Festplattenanforderungen für Ihre Sicherungen gesprochen. Sie sollten auf jeden Fall überprüfen, wie viel Speicherplatz Ihre Backups belegen, und Ihren Setup- und Backup-Zeitplan entsprechend Ihren Anforderungen und Ressourcen überarbeiten.

Möglicherweise möchten Sie nicht nur Sicherungen Ihrer Anwendungsserver erstellen, sondern auch Sicherungen für alle anderen Server einrichten, die Ihrem Setup hinzugefügt wurden. Sie sollten Bacula beispielsweise so konfigurieren, dass Backups Ihrer Überwachungs- und zentralen Protokollierungsserver erstellt werden, sobald Sie diese in Betrieb genommen haben.

Fazit

Sie sollten jetzt über tägliche Sicherungen und eine Remote-Kopie dieser Sicherungen Ihrer Produktionsanwendungsserver verfügen. Stellen Sie sicher, dass Sie die Dateien wiederherstellen können, und fügen Sie die Schritte zum Wiederherstellen Ihrer Daten zu Ihren Wiederherstellungsplänen hinzu.

Fahren Sie mit dem nächsten Lernprogramm fort, um die Überwachung für Ihr Produktionsserver-Setup einzurichten:Building for Production: Web Applications — Monitoring.