Sichern, Wiederherstellen und Migrieren von PostgreSQL-Datenbanken mit Barman unter CentOS 7

Einführung

  • PostgreSQL * ist eine Open-Source-Datenbankplattform, die bei Entwicklern von Web- und Mobilanwendungen aufgrund ihrer einfachen Wartung, Kosteneffizienz und einfachen Integration mit anderen Open-Source-Technologien sehr beliebt ist.

Eine wichtige Aufgabe bei der Wartung einer PostgreSQL-Umgebung ist die regelmäßige Sicherung der Datenbanken. Backups sind Teil des Disaster Recovery (DR) -Prozesses für jede Organisation. Dies ist aus mehreren Gründen wichtig:

  • Schutz vor Datenverlust durch Ausfall zugrunde liegender Infrastrukturkomponenten wie Speicher oder Server

  • Schutz vor Datenkorruption und unerwünschtem oder böswilligem Datenverlust

  • Migrieren von Produktionsdatenbanken in Entwicklungs- oder Testumgebungen

Normalerweise liegt die Verantwortung für die Sicherung und Wiederherstellung der Datenbank bei einem DBA. In kleineren Organisationen oder Startups müssen Systemadministratoren, DevOps-Ingenieure oder Programmierer jedoch häufig ihre eigenen Datenbank-Backends erstellen. Daher ist es wichtig, dass jeder, der PostgreSQL verwendet, versteht, wie Sicherungen funktionieren und wie sie aus einer Sicherung wiederhergestellt werden.

In diesem Lernprogramm richten Sie den Barman-Sicherungsserver ein, erstellen eine Sicherung von einem primären Datenbankserver und stellen sie auf einem Standby-Server wieder her.

Eine kurze Einführung in die PostgreSQL-Sicherungsmethoden

Bevor Sie mit Ihrem Barman-Setup beginnen, nehmen wir uns einen Moment Zeit, um die für PostgreSQL verfügbaren Sicherungstypen und ihre Verwendung zu überprüfen. (Für eine noch umfassendere Übersicht über Sicherungsstrategien lesen Sie unseren Artikel über effective backups .)

PostgreSQL bietet zwei Arten von Sicherungsmethoden:

  • Logische Sicherungen

  • Physische Backups

Logische Sicherungen sind wie Momentaufnahmen einer Datenbank. Diese werden mit dem Hilfsprogramm "+ pg_dump " oder " pg_dumpall +" erstellt, das im Lieferumfang von PostgreSQL enthalten ist. Logische Sicherungen:

  • Sichern Sie einzelne Datenbanken oder alle Datenbanken

  • Sichern Sie nur die Schemas, nur die Daten, einzelne Tabellen oder die gesamte Datenbank (Schemas und Daten).

  • Erstellen Sie die Sicherungsdatei im proprietären Binärformat oder in einem einfachen SQL-Skript

  • Kann mit dem Hilfsprogramm + pg_restore + wiederhergestellt werden, das auch mit PostgreSQL geliefert wird

  • * Point-in-Time-Recovery (PITR) nicht anbieten *

Wenn Sie also morgens um 2:00 Uhr eine logische Sicherung Ihrer Datenbank (en) erstellen, bleibt die wiederhergestellte Datenbank beim Wiederherstellen um 2:00 Uhr erhalten. Es gibt keine Möglichkeit, die Wiederherstellung zu einem bestimmten Zeitpunkt, z. B. um 1:30 Uhr, zu beenden. Wenn Sie die Sicherung um 10:00 Uhr wiederherstellen, haben Sie Daten im Wert von acht Stunden verloren.

Physische Sicherungen unterscheiden sich von logischen Sicherungen, da sie nur das Binärformat verarbeiten und Sicherungen auf Dateiebene durchführen. Physische Backups:

  • Bieten Sie eine Wiederherstellung zu einem bestimmten Zeitpunkt an

  • Sichern Sie den Inhalt des PostgreSQL-Datenverzeichnisses und der WAL-Dateien (Write Ahead Log)

  • Nehmen Sie mehr Speicherplatz in Anspruch

  • Verwenden Sie die PostgreSQL-Befehle + pg_start_backup + und + pg_stop_backup +. Diese Befehle müssen jedoch per Skript erstellt werden, was physische Sicherungen zu einem komplexeren Prozess macht

  • Sichern Sie nicht nur einzelne Datenbanken, Schemas usw. Es ist ein Alles-oder-Nichts-Ansatz

WAL-Dateien enthalten Listen von Transaktionen (INSERT, UPDATE oder DELETE), die in einer Datenbank vorkommen. Die eigentlichen Datenbankdateien mit den Daten befinden sich im Datenverzeichnis. Wenn es also darum geht, aus einer physischen Sicherung zu einem bestimmten Zeitpunkt wiederherzustellen, stellt PostgreSQL zuerst den Inhalt des Datenverzeichnisses wieder her und spielt dann die darüber liegenden Transaktionen aus den WAL-Dateien ab. Dies bringt die Datenbanken rechtzeitig in einen konsistenten Zustand.

  • Wie Barman Backups funktionieren *

Traditionell haben PostgreSQL-Datenbankadministratoren ihre eigenen Sicherungsskripten geschrieben und Cron-Jobs geplant, um physische Sicherungen zu implementieren. Der Barmann tut dies auf standardisierte Weise.

  • Barman * oder * Backup and Recovery Manager * ist ein kostenloses Open-Source-Tool für PostgreSQL-Backups von 2ndQuadrant - einem professionellen Anbieter von Postgres-Lösungen. Barman wurde in Python geschrieben und bietet eine einfache, intuitive Methode zur physischen Sicherung und Wiederherstellung Ihrer PostgreSQL-Instanz. Einige Vorteile der Verwendung von Barman sind:

  • Es ist völlig kostenlos

  • Es handelt sich um eine gut gepflegte Anwendung, die vom Anbieter professionell unterstützt wird

  • Befreit den DBA / Sysadmin vom Schreiben und Testen komplexer Skripte und Cron-Jobs

  • Kann mehrere PostgreSQL-Instanzen an einem zentralen Ort sichern

  • Kann auf derselben PostgreSQL-Instanz oder auf einer anderen Instanz wiederherstellen

  • Bietet Komprimierungsmechanismen zur Minimierung des Netzwerkverkehrs und des Speicherplatzes

Tore

In diesem Tutorial erstellen wir drei DigitalOcean Droplets, installieren PostgreSQL 9.4 auf zwei dieser Maschinen und Barman auf der dritten.

Einer der PostgreSQL-Server wird unser Hauptdatenbankserver sein: Hier werden wir unsere Produktionsdatenbank erstellen. Die zweite PostgreSQL-Instanz ist leer und wird als Standby-Maschine behandelt, auf der wir aus dem Backup wiederherstellen können.

Der Barman-Server kommuniziert mit dem Hauptdatenbankserver und führt physische Sicherungen und WAL-Archivierungen durch.

Wir werden dann eine "Katastrophe" emulieren, indem wir eine Tabelle aus unserer Live-Datenbank löschen.

Zuletzt stellen wir die gesicherte PostgreSQL-Instanz vom Barman-Server auf den Standby-Server wieder her.

Voraussetzungen

Um diesem Tutorial zu folgen, müssen Sie drei DigitalOcean Droplets (oder Ihre eigenen Linux-Server) mit jeweils mindestens * 2 GB RAM * und 2 CPU-Kernen erstellen. Wir werden nicht auf die Details der Erstellung eines Droplets eingehen. Weitere Informationen finden Sie unter here.

Alle drei Server sollten dasselbe Betriebssystem haben (* CentOS 7 * x64-Bit).

Wir werden die Maschinen wie folgt benennen:

  • * main-db-server * (wir bezeichnen seine IP-Adresse als)

  • * standby-db-server * (wir bezeichnen seine IP-Adresse als)

  • * Barmann-Backup-Server * (wir bezeichnen seine IP-Adresse als)

Die tatsächlichen IP-Adressen der Geräte finden Sie in der DigitalOcean-Systemsteuerung.

Sie sollten außerdem auf jedem Server einen sudo-Benutzer einrichten und diesen für den allgemeinen Zugriff verwenden. Die meisten Befehle werden als zwei verschiedene Benutzer ausgeführt (* postgres * und * barman *), aber Sie benötigen auch einen sudo-Benutzer auf jedem Server, damit Sie zu diesen Konten wechseln können. Informationen zur Funktionsweise von sudo-Berechtigungen finden Sie in diesem DigitalOcean-Tutorial zum Aktivieren des sudo-Zugriffs .

Schritt 1 - Installieren der PostgreSQL-Datenbankserver

Wir werden zuerst unsere Datenbankumgebung einrichten, indem wir PostgreSQL 9.4 auf dem * main-db-server * und dem * standby-db-server * installieren.

Bitte führen Sie die PostgreSQL-Installationsschritte unter dieses LEPP-Stack-Lernprogramms aus. . In diesem Tutorial müssen Sie:

  • Befolgen Sie den Abschnitt * Erster Schritt - Installieren von PostgreSQL *

  • Befolgen Sie den Abschnitt * Zweiter Schritt - Konfigurieren von PostgreSQL *

Fügen Sie in * Schritt 2 - Konfigurieren von PostgreSQL * anstelle von Änderungen an der Datei + pg_hba.conf +, die den Zugriff auf die Datenbank für einen Webserver ermöglichen, diese Zeile hinzu, damit der Barman-Server mit dem * Barman-Backup-Befehl eine Verbindung herstellen kann. Server * IP-Adresse, gefolgt von "+ / 32 +":

host    all     all     /32        trust

Dadurch wird PostgreSQL so konfiguriert, dass Verbindungen vom Barman-Server akzeptiert werden.

Die restlichen Anweisungen in diesem Abschnitt können unverändert befolgt werden.

Stellen Sie sicher, dass Sie PostgreSQL sowohl auf dem * main-db-server * als auch auf dem * standby-db-server * installiert haben und dass Sie auf beiden vom * barman-backup-server * aus Zugriff haben.

Als Nächstes fügen wir dem Hauptdatenbankserver einige Beispieldaten hinzu.

Schritt 2 - PostgreSQL-Datenbank und -Tabellen erstellen

Sobald PostgreSQL auf beiden Computern installiert und konfiguriert ist, fügen wir dem * main-db-server * einige Beispieldaten hinzu, um eine Produktionsumgebung zu simulieren.

Wechseln Sie auf dem * main-db-server * zum Benutzer * postgres *:

sudo su - postgres

Starten Sie das Dienstprogramm + psql +, um auf den Datenbankserver zuzugreifen:

psql

Führen Sie an der Eingabeaufforderung + psql + die folgenden Befehle aus, um eine Datenbank zu erstellen und zu dieser zu wechseln:

CREATE DATABASE mytestdb;
\connect mytestdb;

In einer Ausgabemeldung wird Ihnen mitgeteilt, dass Sie jetzt als Benutzer "+ postgres " mit der Datenbank " mytestdb +" verbunden sind.

Fügen Sie als Nächstes zwei Tabellen in die Datenbank ein:

CREATE TABLE mytesttable1 (id integer NULL);
CREATE TABLE mytesttable2 (id integer NULL);

Diese heißen "+ mytesttable1 " und " mytesttable2 +".

Beenden Sie das Client-Tool, indem Sie "+ \ q " eingeben und " ENTER +" drücken.

Schritt 3 - Barman installieren

Jetzt installieren wir Barman auf dem Sicherungsserver, der unsere Sicherungen sowohl steuert als auch speichert.

Führen Sie diesen Schritt auf dem * Barmann-Backup-Server * aus.

Dazu müssen Sie zuerst die folgenden Repositorys installieren:

  • Zusätzliche Pakete für das Enterprise Linux (EPEL) -Repository

  • RPM-Repository der PostgreSQL Global Development Group

Führen Sie den folgenden Befehl aus, um EPEL zu installieren:

sudo yum -y install epel-release

Führen Sie diese Befehle aus, um das PostgreSQL-Repository zu installieren:

sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm
sudo rpm -ivh pgdg-centos94-9.4-1.noarch.rpm

Führen Sie schließlich diesen Befehl aus, um Barman zu installieren:

sudo yum -y install barman

Barmann ist installiert! Stellen wir nun sicher, dass die Server sicher miteinander verbunden werden können.

Schritt 4 - Konfigurieren der SSH-Konnektivität zwischen Servern

In diesem Abschnitt werden SSH-Schlüssel für eine sichere, kennwortlose Verbindung zwischen dem * main-db-server * und dem * barman-backup-server * eingerichtet und umgekehrt.

Ebenso richten wir SSH-Schlüssel zwischen dem * Standby-DB-Server * und dem * Barmann-Backup-Server * ein und umgekehrt.

Dies soll sicherstellen, dass PostgreSQL (auf beiden Datenbankservern) und Barman während Sicherungen und Wiederherstellungen miteinander kommunizieren können.

Für dieses Tutorial müssen Sie Folgendes sicherstellen:

  • Benutzer * postgres * kann eine Remote-Verbindung vom * main-db-server * zum * barman-backup-server * herstellen

  • Benutzer * postgres * kann eine Remote-Verbindung vom * Standby-DB-Server * zum * Barmann-Backup-Server * herstellen

  • Benutzer * barman * kann eine Remote-Verbindung vom * barman-backup-server * zum * main-db-server * herstellen

  • Benutzer * barman * kann eine Remote-Verbindung vom * barman-backup-server * zum * standby-db-server * herstellen

Wir werden nicht näher darauf eingehen, wie SSH funktioniert. Es gibt einen https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys, der einen sehr guten Artikel über DigitalOcean enthält.

Alle Befehle, die Sie benötigen, sind hier enthalten.

Wir zeigen Ihnen, wie Sie dies einmal tun, um die Verbindung für den Benutzer * postgres * herzustellen, der eine Verbindung vom * main-db-server * zum * barman-backup-server * herstellen soll.

Wechseln Sie vom * main-db-server * zu Benutzer * postgres *, wenn es nicht bereits der aktuelle Benutzer ist:

sudo su - postgres

Führen Sie den folgenden Befehl aus, um ein SSH-Schlüsselpaar zu generieren:

ssh-keygen -t rsa

Übernehmen Sie den Standardspeicherort und -namen für die Schlüsseldateien, indem Sie auf "+ ENTER" drücken.

Drücken Sie zweimal + ENTER +, um den privaten Schlüssel ohne Passphrase zu erstellen.

Sobald die Schlüssel generiert sind, wird ein "+ .ssh +" - Verzeichnis mit den Schlüsseln im Ausgangsverzeichnis des * postgres * -Benutzers erstellt.

Sie müssen nun den öffentlichen SSH-Schlüssel in die Datei "+ authorized_keys " im Verzeichnis " .ssh +" des * barman * -Benutzers auf dem * barman-backup-server * kopieren.

Führen Sie den folgenden Befehl aus, um den Inhalt des öffentlichen Schlüssels des Benutzers * postgres * auszugeben:

cat ~/.ssh/id_rsa.pub

Kopieren Sie den Inhalt der Ausgabe.

Wechseln Sie zu der Konsole, die mit dem Server * barman-backup-server * verbunden ist, und wechseln Sie zum Benutzer * barman *:

sudo su - barman

Führen Sie die folgenden Befehle aus, um ein Verzeichnis "+ .ssh " zu erstellen, seine Berechtigungen festzulegen, den Inhalt des öffentlichen Schlüssels in die Datei " authorized_keys +" zu kopieren und diese Datei schließlich lesbar und schreibbar zu machen:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Stellen Sie sicher, dass Sie die lange öffentliche Schlüsselzeichenfolge, die mit "+ ssh-rsa " beginnt, zwischen die Anführungszeichen und nicht zwischen "+" setzen.

Sie haben den Schlüssel auf den Remote-Server kopiert.

Um nun die Verbindung zu testen, wechseln Sie zurück zum * main-db-server * und testen Sie die Konnektivität von dort aus:

ssh barman@

Nach der ersten Warnung, dass die Authentizität des Remote-Servers nicht bekannt ist und Sie die Aufforderung akzeptieren, sollte eine Verbindung vom * main-db-server * -Server zum * barman-backup-server * hergestellt werden. Bei Erfolg melden Sie sich von der Sitzung ab, indem Sie den Befehl + exit + ausführen.

exit
  • Sie müssen die SSH-Schlüsselverbindungen noch dreimal einrichten. * Sie können die Erstellung des Verzeichnisses "+ .ssh +" überspringen, wenn dies bereits erfolgt ist (obwohl dies nicht erforderlich ist).

  • Führen Sie dieselben Befehle erneut aus, diesmal vom * Standby-DB-Server * zum * Barmann-Backup-Server *

  • Führen Sie sie ein drittes Mal aus, diesmal vom * Barmann * -Benutzer auf dem * Barmann-Backup-Server * und vom * Postgres * -Benutzer auf dem * Haupt-DB-Server *.

  • Führen Sie abschließend die Befehle aus, um den Schlüssel vom * Barmann * -Benutzer auf dem * Barmann-Backup-Server * auf den * Postgres * -Benutzer auf dem * Standby-DB-Server * zu kopieren.

Stellen Sie sicher, dass Sie die Verbindung auf jede Weise testen, damit Sie die erste Warnung über die neue Verbindung akzeptieren können.

Vom * Standby-DB-Server *:

ssh barman@

Vom * Barmann-Backup-Server *:

ssh postgres@

Vom * Barmann-Backup-Server *:

ssh postgres@

Schritt 5 - Barman für Backups konfigurieren

Sie konfigurieren Barman nun so, dass Ihr PostgreSQL-Hauptserver gesichert wird.

Die Hauptkonfigurationsdatei für BARMAN ist + / etc / barman.conf +. Die Datei enthält einen Abschnitt für globale Parameter und separate Abschnitte für jeden Server, den Sie sichern möchten. Die Standarddatei enthält einen Abschnitt für einen PostgreSQL-Beispielserver mit dem Namen * main *, der auskommentiert ist. Sie können es als Leitfaden zum Einrichten anderer Server verwenden, die Sie sichern möchten.

Öffne + / etc / barman.conf + in einem Texteditor als dein * sudo-Benutzer * (Benutzer * barman * hat nur Lesezugriff darauf):

sudo vi /etc/barman.conf

Die globalen Parameter werden im Abschnitt "+ [Barmann] +" definiert. Nehmen Sie in diesem Abschnitt die folgenden Änderungen vor. Die fertigen Werte werden unter den Aufzählungspunkten angezeigt:

  • Deaktivieren Sie die Zeile für "+ compression " und behalten Sie den Standardwert von " gzip" bei. + "Dies bedeutet, dass die PostgreSQL-WAL-Dateien - wenn sie in das Sicherungsverzeichnis kopiert werden - in komprimierter Form gespeichert werden

  • Kommentieren Sie die Zeile für "+ reuse_backup " aus und behalten Sie den Standardwert von " link +" bei. Beim Erstellen vollständiger Sicherungen des PostgreSQL-Servers versucht Barman, Speicherplatz im Sicherungsverzeichnis zu sparen, indem inkrementelle Sicherungen auf Dateiebene erstellt werden. Dies verwendet Rsync und Hardlinks. Das Erstellen inkrementeller vollständiger Sicherungen bietet den gleichen Vorteil wie jede Datendeduplizierungsmethode: Zeit- und Speichereinsparungen

  • Kommentieren Sie die Zeile für "+ instant_checkpoint " aus und setzen Sie den Wert auf " true ". Diese Parametereinstellung stellt sicher, dass PostgreSQL beim Start eines vollständigen Backups aufgefordert wird, ein ` CHECKPOINT +` auszuführen. Checkpointing stellt sicher, dass alle geänderten Daten im PostgreSQL-Cache in Datendateien geschrieben werden. Aus der Sicht der Datensicherung kann dies einen Mehrwert schaffen, da BARMAN die neuesten Datenänderungen sichern kann

  • Kommentieren Sie die Zeile für "+ basebackup_retry_times " aus und setzen Sie einen Wert von " 3 +". Beim Erstellen eines vollständigen Backups versucht Barman dreimal, eine Verbindung zum PostgreSQL-Server herzustellen, wenn der Kopiervorgang aus irgendeinem Grund fehlschlägt

  • Kommentieren Sie die Zeile für "+ basebackup_retry_sleep " aus und behalten Sie den Standardwert von " 30 +" bei. Zwischen jedem erneuten Versuch liegt eine Verzögerung von 30 Sekunden

  • Kommentieren Sie die Zeile für "+ last_backup_maximum_age +" aus und setzen Sie den Wert auf "+1 DAYS +"

Die neuen Einstellungen sollten genau so aussehen:

Auszüge aus /etc/barman.conf

[barman]
barman_home = /var/lib/barman

. . .

barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
reuse_backup = link

. . .

immediate_checkpoint = true

. . .

basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS

Was wir hier machen, ist folgendes:

  • Behalten Sie den Standard-Sicherungsspeicherort bei

  • Angeben, dass der Sicherungsspeicherplatz gespeichert werden soll. WAL-Protokolle werden komprimiert und bei Basissicherungen werden inkrementelle Daten kopiert

  • Der Barmann wird es dreimal wiederholen, wenn die vollständige Sicherung aus irgendeinem Grund zur Hälfte fehlschlägt

  • Das Alter der letzten vollständigen Sicherung für einen PostgreSQL-Server sollte nicht älter als 1 Tag sein

Fügen Sie am Ende der Datei einen neuen Abschnitt hinzu. In der Kopfzeile sollte in eckigen Klammern "+ [main-db-server] +" stehen. (Wenn Sie mehr Datenbankserver mit Barman sichern möchten, können Sie für jeden Server einen solchen Block erstellen und für jeden einen eindeutigen Headernamen verwenden.)

Dieser Abschnitt enthält die Verbindungsinformationen für den Datenbankserver sowie einige eindeutige Sicherungseinstellungen.

Fügen Sie diese Parameter in den neuen Block ein:

Auszug aus /etc/barman.conf

[main-db-server]
description = "Main DB Server"
ssh_command = ssh postgres@
conninfo = host= user=postgres
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF  days
wal_retention_policy = main

Die Einstellungen für "+ retention_policy +" bedeuten, dass Barman ältere vollständige Sicherungsdateien und WAL-Protokolle automatisch überschreibt, während genügend Sicherungen für ein Wiederherstellungsfenster von 7 Tagen aufbewahrt werden. Das heißt, wir können den gesamten Datenbankserver zu jedem Zeitpunkt in den letzten sieben Tagen wiederherstellen. * Für ein Produktionssystem sollten Sie diesen Wert wahrscheinlich höher einstellen, damit Sie ältere Backups zur Hand haben. *

Sie müssen die IP-Adresse des * main-db-Servers * in den Parametern "+ ssh_command " und " conninfo +" verwenden. Ansonsten können Sie die obigen Einstellungen exakt kopieren.

Die endgültige Version der geänderten Datei sollte ohne alle Kommentare und unveränderten Einstellungen so aussehen:

Auszüge aus /etc/barman.conf

[barman]
barman_home = /var/lib/barman

. . .

barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
reuse_backup = link

. . .

immediate_checkpoint = true

. . .

basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS

. . .

[main-db-server]
description = "Main DB Server"
ssh_command = ssh postgres@
conninfo = host= user=postgres
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

Speichern und schließen Sie die Datei.

Als nächstes stellen wir sicher, dass unser * main-db-server * für das Erstellen von Backups konfiguriert ist.

Schritt 6 - Konfigurieren der postgresql.conf-Datei

Auf dem * main-db-server * muss noch eine letzte Konfiguration vorgenommen werden, um den Sicherungs- (oder Archivierungs-) Modus zu aktivieren.

Zuerst müssen wir den Wert des eingehenden Sicherungsverzeichnisses vom * Barman-Backup-Server * ermitteln. Wechseln Sie auf dem Barmann-Server zum Benutzer * Barmann *:

sudo su - barman

Führen Sie diesen Befehl aus, um das eingehende Sicherungsverzeichnis zu suchen:

barman show-server main-db-server | grep incoming_wals_directory

Dies sollte ungefähr so ​​aussehen:

barman show-server command outputincoming_wals_directory: /var/lib/barman/main-db-server/incoming

Notieren Sie den Wert von + incoming_wals_directory +; In diesem Beispiel ist es "+ / var / lib / barman / main-db-server / incoming +".

Wechseln Sie nun zur Konsole * main-db-server *.

Wechseln Sie zum Benutzer * postgres *, wenn es sich nicht bereits um den aktuellen Benutzer handelt.

Öffnen Sie die Datei + postgresql.conf in einem Texteditor:

vi $PGDATA/postgresql.conf

Nehmen Sie die folgenden Änderungen an der Datei vor:

  • Kommentieren Sie den Parameter "+ wal_level " aus und setzen Sie seinen Wert auf " archive " anstelle von " minimal +"

  • Kommentieren Sie den Parameter "+ archive_mode " aus und setzen Sie seinen Wert auf " on " anstelle von " off +"

  • Deaktivieren Sie den Parameter "+ archive_command " und setzen Sie seinen Wert auf "" rsync -a% p barman @: /% f "" anstelle von "" + ". Verwenden Sie die IP-Adresse des Barman-Servers. Wenn Sie einen anderen Wert für "+ incoming_wals_directory +" haben, verwenden Sie stattdessen diesen

Auszüge aus der postgresql.conf

wal_level = archive                     # minimal, archive, hot_standby, or logical

. . .

archive_mode = on               # allows archiving to be done

. . .

archive_command = 'rsync -a %p barman@:/%f'                # command to use to archive a logfile segment

Wechseln Sie zurück zu Ihrem * sudo-Benutzer *.

Starten Sie PostgreSQL neu:

sudo systemctl restart postgresql-9.4.service

Schritt 7 - Barmann testen

Nun ist es an der Zeit zu überprüfen, ob Barman alle Konfigurationen korrekt eingestellt hat und eine Verbindung zum * main-db-server * herstellen kann.

Wechseln Sie auf dem * Barmann-Backup-Server * zum Benutzer * Barmann *, wenn es sich nicht um den aktuellen Benutzer handelt. Führen Sie den folgenden Befehl aus, um die Verbindung zu Ihrem Hauptdatenbankserver zu testen:

barman check

Beachten Sie, dass Sie diesen Namen verwenden sollten, wenn Sie in Schritt 5 einen anderen Namen zwischen den eckigen Klammern für den Serverblock in der Datei "+ / etc / barman.conf +" eingegeben haben.

Wenn alles in Ordnung ist, sollte die Ausgabe folgendermaßen aussehen:

barman check command outputServer main-db-server:
       PostgreSQL: OK
       archive_mode: OK
       wal_level: OK
       archive_command: OK
       continuous archiving: OK
       directories: OK
       retention policy settings: OK
       backup maximum age: FAILED (interval provided: 1 day, latest backup age: No available backups)
       compression settings: OK
       minimum redundancy requirements: OK (have 0 backups, expected at least 0)
       ssh: OK (PostgreSQL server)
       not in recovery: OK

Machen Sie sich keine Gedanken über das maximale Alter des Backups (+ FAILED). Dies geschieht, weil wir Barman so konfiguriert haben, dass das neueste Backup nicht älter als 1 Tag sein sollte. Es wurde noch kein Backup erstellt, daher schlägt die Überprüfung fehl.

Wenn sich einer der anderen Parameter im Status "+ FEHLGESCHLAGEN" befindet, sollten Sie weitere Untersuchungen durchführen und das Problem beheben, bevor Sie fortfahren.

Es kann mehrere Gründe dafür geben, dass eine Überprüfung fehlschlägt: Barmann kann sich nicht bei der Postgres-Instanz anmelden, Postgres ist nicht für die WAL-Archivierung konfiguriert, SSH funktioniert nicht zwischen den Servern usw. Was auch immer der Grund sein mag, es muss behoben werden, bevor Backups durchgeführt werden können. Führen Sie die vorherigen Schritte aus und stellen Sie sicher, dass alle Verbindungen funktionieren.

Führen Sie den folgenden Befehl aus, um eine Liste der mit Barman konfigurierten PostgreSQL-Server abzurufen:

barman list-server

Im Moment sollte es nur zeigen:

Ausgabe

main-db-server - Main DB Server

Schritt 8 - Erstes Backup erstellen

Nachdem Sie Barman bereit haben, erstellen wir ein manuelles Backup.

Führen Sie den folgenden Befehl als Benutzer * barman * auf dem * barman-backup-server * aus, um Ihre erste Sicherung durchzuführen:

barman backup

Wieder ist der Wert "+" das, was Sie als Kopf des Serverblocks in der Datei " / etc / barman.conf +" in Schritt 5 eingegeben haben.

Dadurch wird eine vollständige Sicherung des PostgreSQL-Datenverzeichnisses gestartet. Da unsere Instanz nur eine kleine Datenbank mit zwei Tabellen hat, sollte sie sehr schnell beendet werden.

Ausgabe

Starting backup for server  in /var/lib/barman/main-db-server/base/20151111T051954
Backup start at xlog location: 0/2000028 (000000010000000000000002, 00000028)
Copying files.
Copy done.
Asking PostgreSQL server to finalize the backup.
Backup size: 26.9 MiB. Actual size on disk: 26.9 MiB (-0.00% deduplication ratio).
Backup end at xlog location: 0/20000B8 (000000010000000000000002, 000000B8)
Backup completed
Processing xlog segments for
       Older than first backup. Trashing file 000000010000000000000001 from server
       000000010000000000000002
       000000010000000000000002.00000028.backup

Speicherort der Sicherungsdatei

Wo wird das Backup gespeichert? Um die Antwort zu finden, listen Sie den Inhalt des Verzeichnisses "+ / var / lib / barman +" auf:

ls -l /var/lib/barman

Dort wird es ein Verzeichnis geben: + main-db-server +. Das ist der Server, für den Barman derzeit zum Sichern konfiguriert ist, und seine Sicherungen befinden sich dort. (Wenn Sie Barman für die Sicherung anderer Server konfigurieren, wird pro Server ein Verzeichnis erstellt.) Unter dem Verzeichnis + main-db-server + befinden sich drei Unterverzeichnisse:

  • + base +: Hier werden die Basissicherungsdateien gespeichert

  • + incoming +: PostgreSQL sendet seine fertigen WAL-Dateien zur Archivierung in dieses Verzeichnis

  • + wals +: Der Barmann kopiert den Inhalt des Verzeichnisses + incoming + in das Verzeichnis + wals +

Während einer Wiederherstellung stellt Barman Inhalte aus dem Verzeichnis "+ base " in das Datenverzeichnis des Zielservers wieder her. Anschließend werden Dateien aus dem Verzeichnis " wals +" verwendet, um Transaktionsänderungen anzuwenden und den Zielserver in einen konsistenten Zustand zu versetzen.

Backups auflisten

Es gibt einen bestimmten Barman-Befehl, um alle Sicherungen für einen Server aufzulisten. Dieser Befehl lautet "+ barman list-backup ". Führen Sie den folgenden Befehl aus, um zu sehen, was er für unser `+` zurückgibt:

barman list-backup
Outputmain-db-server 20151111T051954 - Wed Nov 11 05:19:46 2015 - Size: 26.9 MiB - WAL Size: 0 B
  • Der erste Teil der Ausgabe ist der Name des Servers. In diesem Fall "+ main-db-server +"

  • Der zweite Teil - ein langer alphanumerischer Wert - ist die Sicherungs-ID für die Sicherung. Eine Backup-ID wird verwendet, um Backup-Barmann eindeutig zu identifizieren. In diesem Fall ist es "++". * Sie benötigen die Backup-ID für die nächsten Schritte *

  • Die dritte Information gibt Auskunft darüber, wann die Sicherung durchgeführt wurde

  • Der vierte Teil ist die Größe des Basis-Backups (in diesem Fall 26,9 MB).

  • Der fünfte und letzte Teil der Zeichenfolge gibt die Größe des gesicherten WAL-Archivs an

Um weitere Details zur Sicherung anzuzeigen, führen Sie diesen Befehl mit dem Namen des Servers und der Sicherungs-ID (in unserem Beispiel "++") aus dem vorherigen Befehl aus:

barman show-backup

Eine detaillierte Reihe von Informationen wird angezeigt:

OutputBackup :
 Server Name            :
 Status                 : DONE
 PostgreSQL Version     : 90405
 PGDATA directory       : /var/lib/pgsql/9.4/data

 Base backup information:
   Disk usage           : 26.9 MiB (26.9 MiB with WALs)
   Incremental size     : 26.9 MiB (-0.00%)
   Timeline             : 1
   Begin WAL            : 000000010000000000000002
   End WAL              : 000000010000000000000002
   WAL number           : 1
   WAL compression ratio: 99.84%
   Begin time           : 2015-11-11 05:19:44.438072-05:00
   End time             : 2015-11-11 05:19:46.839589-05:00
   Begin Offset         : 40
   End Offset           : 184
   Begin XLOG           : 0/2000028
   End XLOG             : 0/20000B8

 WAL information:
   No of files          : 0
   Disk usage           : 0 B
   Last available       : 000000010000000000000002

 Catalog information:
   Retention Policy     : VALID
   Previous Backup      : - (this is the oldest base backup)
   Next Backup          : - (this is the latest base backup)

Führen Sie den folgenden Befehl aus, um weitere Informationen zu den Dateien zu erhalten, die in die Sicherung aufgenommen werden:

barman list-files

Dadurch wird eine Liste der Basissicherungs- und WAL-Protokolldateien angezeigt, die für die Wiederherstellung aus dieser bestimmten Sicherung erforderlich sind.

Schritt 9 - Planen von Sicherungen

Idealerweise sollten Ihre Backups automatisch nach einem Zeitplan erstellt werden.

In diesem Schritt automatisieren wir unsere Sicherungen und weisen Barman an, die Sicherungen zu warten, damit Dateien gelöscht werden, die älter als die Aufbewahrungsrichtlinie sind. Um die Zeitplanung zu aktivieren, führen Sie diesen Befehl als * barman * Benutzer auf dem * barman-backup-Server * aus (wechseln Sie bei Bedarf zu diesem Benutzer):

crontab -e

Dies öffnet eine + crontab + Datei für den Benutzer * barman *. Bearbeiten Sie die Datei, fügen Sie diese Zeilen hinzu, speichern Sie sie und beenden Sie sie:

cron

30 23 * * * /usr/bin/barman backup
* * * * * /usr/bin/barman cron

Mit dem ersten Befehl wird jede Nacht um 23:30 Uhr eine vollständige Sicherung des * main-db-server * ausgeführt. (Wenn Sie in der Datei "+ / etc / barman.conf +" einen anderen Namen für den Server verwendet haben, verwenden Sie stattdessen diesen Namen.)

Der zweite Befehl wird jede Minute ausgeführt und führt Wartungsvorgänge sowohl für WAL-Dateien als auch für Basissicherungsdateien durch.

Schritt 10 - Eine "Katastrophe" simulieren

Sie werden nun sehen, wie Sie aus der soeben erstellten Sicherung wiederherstellen können. Um die Wiederherstellung zu testen, simulieren wir zunächst ein "Katastrophen" -Szenario, in dem Sie einige Daten verloren haben.

  • Wir lassen hier einen Tisch fallen. Tun Sie dies nicht in einer Produktionsdatenbank! *

Kehren Sie zur * main-db-server * -Konsole zurück und wechseln Sie zum Benutzer * postgres *, falls dies nicht bereits der aktuelle Benutzer ist.

Starten Sie das Dienstprogramm + psql +:

psql

Führen Sie an der Eingabeaufforderung "+ psql " den folgenden Befehl aus, um den Datenbankkontext auf " mytestdb +" zu ändern:

\connect mytestdb;

Listen Sie als Nächstes die Tabellen in der Datenbank auf:

\dt

In der Ausgabe werden die Tabellen angezeigt, die Sie zu Beginn dieses Lernprogramms erstellt haben:

Output            List of relations
Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
public | mytesttable1 | table | postgres
public | mytesttable2 | table | postgres

Führen Sie nun diesen Befehl aus, um eine der Tabellen zu löschen:

drop table mytesttable2;

Wenn Sie jetzt den Befehl + \ dt + erneut ausführen:

\dt

Sie werden sehen, dass nur noch + mytesttable1 + übrig bleibt.

Dies ist die Art von Datenverlust, in der Sie Daten aus einer Sicherung wiederherstellen möchten. In diesem Fall stellen Sie die Sicherung auf einem separaten Server wieder her: dem * Standby-DB-Server *.

Schritt 11 - Wiederherstellen oder Migrieren auf einen Remote-Server

Sie können diesem Abschnitt folgen, um ein Backup wiederherzustellen oder Ihr aktuelles PostgreSQL-Backup auf einen neuen Server zu migrieren.

Gehe zum * standby-db-server *.

Beenden Sie zunächst den PostgreSQL-Dienst als sudo-Benutzer. (Der Neustart wird unterbrochen, wenn Sie versuchen, die Wiederherstellung auszuführen, während der Dienst ausgeführt wird.)

sudo systemctl stop postgresql-9.4.service

Sobald der Dienst beendet ist, gehen Sie zum * Barmann-Backup-Server *. Wechseln Sie zum Benutzer * Barmann *, wenn er nicht bereits der aktuelle Benutzer ist.

Suchen wir die Details für das neueste Backup:

barman show-backup  latest

Ausgabe

Backup :
 Server Name            :
 Status                 : DONE
 PostgreSQL Version     : 90405
 PGDATA directory       : /var/lib/pgsql/9.4/data

 Base backup information:

. . .

   Begin time           :
   End time             : 2016-01-14 17:35:55.054673-05:00

Notieren Sie in der Ausgabe die Sicherungs-ID, die in der ersten Zeile (++ oben) angegeben ist. Wenn die "+ letzte " Sicherung die gewünschten Daten enthält, können Sie " letzte +" als Sicherungs-ID verwenden.

Überprüfen Sie auch, wann die Sicherung erstellt wurde, und zwar aus dem Feld "+ Startzeit " ("+" oben).

Führen Sie als Nächstes diesen Befehl aus, um die angegebene Sicherung vom * Barmann-Sicherungsserver * auf dem * Standby-Datenbankserver * wiederherzustellen:

barman recover --target-time ""  --remote-ssh-command "ssh postgres@"         /var/lib/pgsql/9.4/data

Hier gibt es eine ganze Reihe von Optionen, Argumenten und Variablen. Lassen Sie uns diese erläutern.

  • + - Zielzeit" "+: Verwenden Sie die Startzeit aus dem Befehl + show-backup +

  • + - remote-ssh-befehl" ssh postgres @ "+: Verwenden Sie die IP-Adresse des * standby-db-server *

  • ++: Verwenden Sie den Namen des Datenbankservers aus Ihrer + / etc / barman.conf + Datei

  • ++: Verwenden Sie die Sicherungs-ID aus dem Befehl "+ show-backup " oder verwenden Sie " latest +", wenn dies die gewünschte ist

  • + / var / lib / pgsql / 9.4 / data +: Der Pfad, in dem die Sicherung wiederhergestellt werden soll. Dieser Pfad wird zum neuen Datenverzeichnis für Postgres auf dem Standby-Server. Hier haben wir das Standarddatenverzeichnis für Postgres in CentOS ausgewählt. Wählen Sie für reale Anwendungsfälle den entsprechenden Pfad

Für eine erfolgreiche Wiederherstellung sollten Sie die folgende Ausgabe erhalten:

Ausgabe von Barman Recovery

Starting remote restore for server   using backup
Destination directory: /var/lib/pgsql/9.4/data
Doing PITR. Recovery target time:
Copying the base backup.
Copying required WAL segments.
Generating recovery.conf
Identify dangerous settings in destination directory.

IMPORTANT
These settings have been modified to prevent data losses

postgresql.conf line 207: archive_command = false

Your PostgreSQL server has been successfully prepared for recovery!

Wechseln Sie nun wieder zur Konsole * standby-db-server *. Starten Sie als * sudo-Benutzer * den PostgreSQL-Dienst:

sudo systemctl start postgresql-9.4.service

Das sollte es sein!

Vergewissern wir uns, dass unsere Datenbank verfügbar ist. Wechseln Sie zu Benutzer * postgres * und starten Sie das Dienstprogramm + psql +:

sudo su - postgres
psql

Wechseln Sie den Datenbankkontext zu "+ mytestdb +" und listen Sie die darin enthaltenen Tabellen auf:

\connect mytestdb;
\dt

Ausgabe

           List of relations
Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
public | mytesttable1 | table | postgres
public | mytesttable2 | table | postgres
(2 rows)

Die Liste sollte zwei Tabellen in der Datenbank enthalten. Mit anderen Worten, Sie haben gerade die abgelegte Tabelle wiederhergestellt.

Abhängig von Ihrer größeren Wiederherstellungsstrategie möchten Sie möglicherweise jetzt ein Failover auf den * standby-db-server * durchführen oder überprüfen, ob die wiederhergestellte Datenbank funktioniert, und anschließend diesen Abschnitt erneut ausführen, um die Wiederherstellung auf dem * main durchzuführen -db-server *.

Vergewissern Sie sich zum Wiederherstellen auf einem anderen Server, dass PostgreSQL installiert und die entsprechenden Verbindungen zum Barman-Server hergestellt wurden, und befolgen Sie diesen Abschnitt unter Verwendung der IP-Adresse Ihres Ziel-Wiederherstellungsservers.

Fazit

In diesem Tutorial haben wir gesehen, wie Barman installiert und konfiguriert wird, um einen PostgreSQL-Server zu sichern. Wir haben auch gelernt, wie diese Sicherungen wiederhergestellt oder migriert werden.

Mit Bedacht kann Barman das zentrale Repository für alle Ihre PostgresQL-Datenbanken werden. Es bietet einen robusten Backup-Mechanismus und einen einfachen Befehlssatz. Das Erstellen von Backups ist jedoch nur die halbe Miete. Sie sollten Ihre Backups immer validieren, indem Sie sie an einem anderen Ort wiederherstellen. Diese Übung sollte regelmäßig durchgeführt werden.

Einige Fragen zum Einpassen von Barman in Ihre Sicherungsstrategie:

  • Wie viele PostgreSQL-Instanzen werden gesichert?

  • Ist auf dem Barman-Server genügend Speicherplatz vorhanden, um alle Sicherungen für einen bestimmten Aufbewahrungszeitraum zu hosten? Wie können Sie den Server auf Speicherplatznutzung überwachen?

  • Sollten alle Sicherungen für verschiedene Server zur gleichen Zeit gestartet werden oder können sie außerhalb der Spitzenzeiten gestaffelt werden? Das gleichzeitige Starten von Sicherungen aller Server kann den Barman-Server und das Netzwerk unnötig belasten

  • Ist die Netzwerkgeschwindigkeit zwischen dem Barman-Server und den Postgres-Servern zuverlässig?

Ein weiterer wichtiger Punkt ist, dass der Barmann einzelne Datenbanken nicht sichern und wiederherstellen kann. Es funktioniert auf Dateisystemebene und verwendet einen Alles-oder-Nichts-Ansatz. Während einer Sicherung wird die gesamte Instanz mit all ihren Datendateien gesichert. Beim Wiederherstellen werden alle diese Dateien wiederhergestellt. Ebenso können Sie mit Barman keine Nur-Schema- oder Nur-Daten-Backups durchführen.

Wir empfehlen Ihnen daher, Ihre Sicherungsstrategie so zu gestalten, dass sowohl logische Sicherungen mit "+ pg_dump " oder " pg_dumpall " als auch physische Sicherungen mit Barman verwendet werden. Auf diese Weise können Sie, wenn Sie einzelne Datenbanken schnell wiederherstellen müssen, " pg_dump +" - Sicherungen verwenden. Verwenden Sie für die Wiederherstellung zu einem bestimmten Zeitpunkt Barman-Sicherungen.