Inkrementelle Backups von PostgreSQL mit pgbackrest – Ein Kurs für den jungen Kämpfer vom Entwickler

Haftungsausschluss

Ich bin Entwickler. Ich schreibe Code und interagiere mit der Datenbank nur als Benutzer. Ich strebe auf keinen Fall die Position eines Systemadministrators oder gar eines DBA an. Aber…

Es kam dazu, dass ich ein Backup der PostgreSQL-Datenbank organisieren musste. Keine Clouds – halte SSH bereit und sorge dafür, dass alles funktioniert und kein Geld verlangt wird. Was tun wir in solchen Fällen? Richtig, wir packen pg_dump in cron, sichern jeden Tag alles ins Archiv und wenn wir es ganz übertreiben – schicken wir dieses Archiv irgendwo weit weg.

Dieses Mal bestand die Schwierigkeit darin, dass die Datenbank laut Plan etwa 100 MB pro Tag wachsen sollte. Natürlich wird nach ein paar Wochen der Wunsch, alles mit pg_dump zu sichern, verschwinden. Hier kommen inkrementelle Backups ins Spiel.

Interessiert? Willkommen unter dem Schnitt.

Ein inkrementelles Backup ist eine Art von Sicherung, bei der nicht alle Dateien der Quelle kopiert werden, sondern nur neue und geänderte seit der Erstellung der vorherigen Kopie.

Wie jeder Entwickler, der ZU EINEM DAMALIGEN MOMENT keine Lust hatte, sich mit den Feinheiten von PostgreSQL auseinanderzusetzen, wollte ich einen grünen Knopf finden. Nun, wissen Sie, wie bei AWS oder DigitalOcean: einen Knopf drücken – Replikation erhalten, den anderen – Backups einrichten, den dritten – alles auf ein paar Stunden zurücksetzen. Solche Knöpfe und ein schönes GUI-Tool habe ich nicht gefunden. Wenn Sie so etwas (kostenlos oder günstig) kennen – hinterlassen Sie bitte einen Kommentar.

Nachdem ich gegoogelt habe, fand ich zwei Werkzeuge pgbarman und pgbackrest. Mit dem ersten hatte ich einfach kein Glück (sehr spärliche Dokumentation, ich versuchte alles nach alten Handbüchern aufzustellen), aber die Dokumentation des zweiten war auf dem Niveau, hatte jedoch auch ihre Mängel. Um die Arbeit für diejenigen zu erleichtern, die mit einer ähnlichen Aufgabe konfrontiert werden, wurde dieser Artikel verfasst.

Nachdem Sie diesen Artikel gelesen haben, werden Sie lernen, inkrementelle Backups zu erstellen, sie auf einem Remote-Server (Repository für Backups) zu speichern und sie im Falle von Datenverlust oder anderen Problemen auf dem Hauptserver wiederherzustellen.

Vorbereitung

Für die Nachstellung des Handbuchs benötigen Sie zwei VPS. Der erste wird als Speicher (Repository, auf dem die Backups abgelegt werden) dienen, der zweite ist tatsächlich der Server mit PostgreSQL (in meinem Fall die Version 11 von PostgreSQL).

Es wird davon ausgegangen, dass Sie auf dem Server mit Postgres einen root- und sudo-Benutzer sowie den Postgres-Benutzer haben und dass PostgreSQL installiert ist (der Postgres-Benutzer wird bei der Installation von PostgreSQL automatisch erstellt), und dass der Repository-Server über einen root- und sudo-Benutzer verfügt (im Handbuch wird der Benutzername pgbackrest verwendet).

Um Ihnen die Durchführung der Anleitung zu erleichtern, schreibe ich kursiv wo, mit welchem Benutzer und mit welchen Rechten ich den Befehl ausgeführt habe während ich den Artikel geschrieben und überprüft habe.

Installation von pgbackrest

Repository (Benutzer pgbackrest):

1. Laden Sie das Archiv mit pgbackrest herunter und verschieben Sie dessen Inhalt in den Ordner /build:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Installieren Sie die benötigten Abhängigkeiten für die Kompilierung:

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. Kompilieren Sie pgbackrest:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. Kopieren Sie die ausführbare Datei in das Verzeichnis /usr/bin:

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. Pgbackrest benötigt Perl. Installieren Sie es:

sudo apt-get install perl

6. Erstellen Sie Verzeichnisse für Logs und setzen Sie die entsprechenden Berechtigungen:

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

7. Überprüfen Sie:

pgbackrest version

Postgres-Server (sudo-Benutzer oder root):

Der Installationsprozess von pgbackrest auf dem Postgres-Server ist ähnlich wie der Installationsprozess auf dem Repository (ja, pgbackrest muss auf beiden Servern installiert sein), aber in Schritt 6 ersetzen Sie die zweit- und letztgenannten Befehle durch:

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

durch folgende Befehle:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Einrichtung der Interaktion zwischen den Servern über passwordless SSH

Damit pgbackrest ordnungsgemäß funktioniert, muss die Interaktion zwischen dem Postgres-Server und dem Repository durch eine Schlüsseldatei eingerichtet werden.

Repository (Benutzer pgbackrest):

Erstellen Sie ein Schlüsselpaar:

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Achtung! Die oben genannten Befehle werden ohne sudo ausgeführt.

Postgres-Server (sudo-Benutzer oder root):

Erstellen Sie ein Schlüsselpaar:

sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Repository (sudo-Benutzer):

Kopieren Sie den öffentlichen Schlüssel des Postgres-Servers auf den Repository-Server:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@ cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

An dieser Stelle wird nach dem Passwort des root-Benutzers gefragt. Es muss das Passwort des root-Benutzers des Postgres-Servers eingegeben werden!

Postgres-Server (sudo-Benutzer):

Wir kopieren den öffentlichen Schlüssel des Repositories auf den Server mit Postgres:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@ cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

An dieser Stelle wird nach dem Passwort des root-Benutzers gefragt. Es muss das Passwort des root-Benutzers des Repositories eingegeben werden!

Überprüfen:

Repository (root-Benutzer, zur Vereinfachung des Experiments):

sudo -u pgbackrest ssh postgres@

Postgres-Server (root-Benutzer, zur Vereinfachung des Experiments):

sudo -u postgres ssh pgbackrest@

Stellen Sie sicher, dass der Zugriff ohne Probleme funktioniert.

Konfiguration des Postgres-Servers

Postgres-Server (sudo-Benutzer oder root):

1. Erlauben wir den Zugriff auf den Postgres-Server von externen IP-Adressen. Dazu bearbeiten wir die Datei postgresql.conf (befindet sich im Ordner /etc/postgresql/11/main), fügen Sie folgende Zeile hinzu:

listen_addresses = '*'

Falls eine solche Zeile bereits vorhanden ist, kommentieren Sie sie entweder wieder ein oder setzen Sie den Wert des Parameters auf '*'.

In der Datei pg_hba.conf (befindet sich ebenfalls im Ordner /etc/postgresql/11/main) fügen wir die folgenden Zeilen hinzu:

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

{REPOSITORY_ABSOLUTE_PATH}

hostssl/host - Verbindet sich über SSL (oder nicht)
all - Erlaubt die Verbindung zu allen Datenbanken
all - Benutzername, dem die Verbindung erlaubt wird (allen)
0.0.0.0/0 - Subnetzmaske, von der aus eine Verbindung hergestellt werden kann
md5 - Verschlüsselungsmethode des Passworts

2. Nehmen wir die notwendigen Einstellungen in die postgresql.conf (sie befindet sich im Ordner /etc/postgresql/11/main) damit pgbackrest funktioniert:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Wo main der Name des Clusters ist. Bei der Installation von Postgres wird automatisch ein Cluster namens main erstellt.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Nehmen wir die notwendigen Einstellungen in die Konfigurationsdatei von pgbackrest (/etc/pgbackrest/pgbackrest.conf) vor:

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=

4. Starten wir PostgreSQL neu:

sudo service postgresql restart

Konfiguration des Repository-Servers

Repository (pgbackrest-Benutzer):

Nehmen wir die notwendigen Einstellungen in die Konfigurationsdatei vor. pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Parameter, der angibt, wie viele vollständige Backups aufbewahrt werden sollen. Das heißt, wenn Sie zwei vollständige Backups haben und ein drittes erstellen, werden die ersten beiden zusammen mit den inkrementellen Backups gelöscht.
start-fast=y # Beginnt mit der Sicherung sofort, über dieses Parameter kann hier gelesen werden https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Erstellen eines Repositories

Repository (pgbackrest-Benutzer):

Wir erstellen ein neues Repository für das Cluster main:

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Überprüfung

Postgres-Server (sudo-Benutzer oder root):

Überprüfung auf dem PostgreSQL-Server:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Repository (pgbackrest-Benutzer):

Überprüfung auf dem Repository-Server:

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

Wir stellen sicher, dass wir die Zeile „check command end: completed successfully“ in der Ausgabe sehen.

Müde? Kommen wir zum Interessantesten.

Backup erstellen

Repository (pgbackrest-Benutzer):

1. Führen Sie die Sicherung durch:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Stellen Sie sicher, dass das Backup erstellt wurde:

ls /var/lib/pgbackrest/backup/main/

Pgbackrest erstellt das erste vollständige Backup. Bei Bedarf können Sie den Backup-Befehl erneut ausführen und sicherstellen, dass das System ein inkrementelles Backup erstellt.

Wenn Sie ein vollständiges Backup erneut erstellen möchten, geben Sie den zusätzlichen Schalter an:

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

Wenn Sie detaillierte Ausgaben in der Konsole möchten, geben Sie auch an:

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

Backup wiederherstellen

Postgres-Server (sudo-Benutzer oder root):

1. Stoppen Sie das laufende Cluster:

sudo pg_ctlcluster 11 main stop

2. Stellen Sie aus dem Backup wiederher:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Starten Sie das Cluster:

sudo pg_ctlcluster 11 main start

Nach der Wiederherstellung des Backups müssen wir ein weiteres Backup durchführen:

Repository (pgbackrest-Benutzer):

sudo pgbackrest --stanza=main backup

Das war's. Zum Schluss möchte ich daran erinnern, dass ich auf keinen Fall versuche, mich als Senior DBA auszugeben und bei der kleinsten Gelegenheit Cloud-Dienste nutzen werde. Aktuell beginne ich selbst, verschiedene Themen wie Backup, Replikation, Überwachung usw. zu lernen und schreibe kleine Berichte über die Ergebnisse, um einen kleinen Beitrag zur Community zu leisten und mir kleine Spickzettel zu hinterlassen.

In den nächsten Artikeln werde ich versuchen, über zusätzliche Funktionen zu berichten – Wiederherstellung von Daten auf ein leeres Cluster, Verschlüsselung von Backups und Veröffentlichung auf S3, Backups über rsync.

Quelle: habr.com

60GB SSD 8Gb DDR4