Inkrementelle PostgreSQL-Backups mit pgbackrest – ein Einsteigerkurs vom Entwickler

Haftungsausschluss

Ich bin ein Entwickler. Ich schreibe Code und interagiere mit der Datenbank nur als Benutzer. Ich beanspruche auf keinen Fall die Position eines Systemadministrators und schon gar nicht eines DBA. Aber...

Es kam der Moment, in dem ich ein Backup für eine PostgreSQL-Datenbank organisieren musste. Keine Clouds – halte SSH bereit und stelle sicher, dass alles funktioniert, ohne Geld zu verlangen. Was tun wir in solchen Fällen? Richtig, wir schieben pgdump in cron, machen jeden Tag ein Backup und wenn es wirklich schiefgeht – schicken wir dieses Archiv irgendwohin weit weg.

Diesmal bestand die Herausforderung darin, dass die Datenbank voraussichtlich um ungefähr 100 MB pro Tag wachsen sollte. Natürlich wird nach ein paar Wochen der Wunsch, alles mit pgdump zu sichern, schwinden. Hier kommen die inkrementellen Backups ins Spiel.

Interessiert? Willkommen unter dem Cut.

Ein inkrementelles Backup ist eine Art Backup, bei dem nicht alle Dateien der Quelle kopiert werden, sondern nur die neuen und geänderten seit der Erstellung der vorherigen Kopie.

Wie jeder Entwickler, der nicht wirklich (zu diesem Zeitpunkt) in die Feinheiten von Postgres eintauchen wollte, suchte ich nach dem grünen Knopf. Na ja, wissen Sie, wie bei AWS oder DigitalOcean: Ein Knopfdruck — und ich habe die Replikation, ein weiterer — ich habe Backups eingerichtet, und mit dem dritten — habe ich alles vor ein paar Stunden zurückgesetzt. Ein paar Knöpfe und ein schöner GUI-Tool fand ich nicht. Wenn Sie so etwas kennen (kostenlos oder günstig) — schreiben Sie das bitte in die Kommentare.

Nach ein wenig Googeln fand ich zwei Werkzeuge pgbarman und pgbackrest. Mit dem ersten klappte es einfach nicht (sehr spärliche Dokumentation, ich versuchte alles nach alten Handbüchern einzurichten), aber die Dokumentation des zweiten war auf Niveau, hatte jedoch auch ihre Mängel. Um die Arbeit für diejenigen zu erleichtern, die mit einer ähnlichen Aufgabe konfrontiert sind, wurde dieser Artikel verfasst.

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

Vorbereitung

Für die Wiederherstellung des Manuals benötigen Sie zwei VPS. Der erste dient als Speicher (Repository, auf dem die Backups liegen), der zweite ist der Server mit PostgreSQL (in meinem Fall Version 11 von PostgreSQL).

Es wird vorausgesetzt, dass Sie auf dem Server mit PostgreSQL über root, einen sudo-Benutzer, den Benutzer postgres und eine installierte PostgreSQL verfügen (der Benutzer postgres wird während der Installation von PostgreSQL automatisch erstellt), und dass auf dem Repository-Server root und ein sudo-Benutzer vorhanden sind (im Manual wird der Benutzername pgbackrest verwendet).

Um Ihnen bei der Durchführung der Anleitung weniger Probleme zu bereiten — schreibe ich kursiv, wo, mit welchem Benutzer und mit welchen Rechten ich den Befehl ausgeführt habe während des Schreibens und Testens des Artikels.

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 erforderlichen Abhängigkeiten für den Build:

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

3. Bauen Sie pgbackrest:

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

4. Wir kopieren 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 wir:

sudo apt-get install perl

6. Wir erstellen Verzeichnisse für die Protokolle und weisen ihnen bestimmte Berechtigungen zu:

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 wir:

pgbackrest version

Postgres-Server (sudo-Benutzer oder root):

Der Installationsprozess von pgbackrest auf dem Server mit Postgres ist ähnlich dem Installationsprozess im Repository (ja, pgbackrest sollte auf beiden Servern installiert sein), aber in Punkt 6 ersetzen wir den zweiten und letzten Befehl:

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

durch:

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

Einrichtung der Interaktion zwischen Servern über passwordless SSH

Damit pgbackrest korrekt funktioniert, muss die Interaktion zwischen dem Postgres-Server und dem Repository über eine Schlüsseldatei eingerichtet werden.

Repository (Benutzer pgbackrest):

Wir erstellen 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 führen wir ohne sudo aus.

Postgres-Server (sudo-Benutzer oder root):

Wir erstellen 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 user):

We copy the public key from the postgres server to the 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

This step will prompt for the root user's password. You need to enter the root password of the postgres server!

Postgres server (sudo user):

We copy the public key from the repository to the postgres 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 /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

This step will prompt for the root user's password. You need to enter the root password of the repository!

Überprüfen wir:

Repository (root user, for clarity of the experiment):

sudo -u pgbackrest ssh postgres@

Postgres server (root user, for clarity of the experiment):

sudo -u postgres ssh pgbackrest@

We ensure that access is granted without issues.

Postgres server configuration

Postgres-Server (sudo-Benutzer oder root):

1. Lassen Sie uns den Zugriff auf den PostgreSQL-Server von externen IPs ermöglichen. Dazu bearbeiten wir die Datei postgresql.conf (sie befindet sich im Ordner /etc/postgresql/11/main) und fügen folgende Zeile hinzu:

listen_addresses = '*'

Falls diese Zeile bereits vorhanden ist, kommentieren Sie sie entweder aus oder setzen Sie den Parameterwert auf '*' ein.

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

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

wo:

hostssl/host - Verbindung über SSL herstellen (oder nicht)
all - Verbindung zu allen Datenbanken zulassen
all - der Benutzername, dem der Zugriff erlaubt wird (alle)
0.0.0.0/0 - Netzmaske, von der aus eine Verbindung hergestellt werden kann
md5 - Verschlüsselungsmethode für das Passwort

2. Wir nehmen die erforderlichen Einstellungen in postgresql.conf (sie befindet sich im Ordner /etc/postgresql/11/main) für den Betrieb von pgbackrest vor:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Wo main der Name des Clusters ist. Bei der Installation erstellt PostgreSQL automatisiert den Cluster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Wir nehmen die erforderlichen Einstellungen in der Konfigurationsdatei pgbackrest (/etc/pgbackrest/pgbackrest.conf) vor:

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

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

4. Starten Sie PostgreSQL neu:

sudo service postgresql restart

Einrichtung des Repository-Servers

Repository (pgbackrest-Benutzer):

Wir nehmen die erforderlichen Einstellungen in der 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. Das heißt, wenn Sie zwei vollständige Backups haben und ein drittes erstellen - werden die ersten beiden zusammen mit den Inkrementen gelöscht.
start-fast=y # Startet die Sicherung sofort, mehr zu diesem Parameter erfahren Sie hier https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Speicher erstellen

Repository (pgbackrest-Benutzer):

Wir erstellen einen neuen Speicher 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):

Wir überprüfen auf dem Postgres-Server:

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

Repository (pgbackrest-Benutzer):

Wir überprüfen auf dem Repository-Server:

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

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

Müde? Kommen wir zu dem Interessantesten.

Wir machen ein Backup

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 wird das erste vollständige Backup erstellen. Wenn gewünscht, können Sie den Backup-Befehl erneut ausführen und überprüfen, dass das System ein inkrementelles Backup erstellt.

Wenn Sie ein vollständiges Backup erneut erstellen möchten, geben Sie bitte das zusätzliche Flag an:

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

Wenn Sie eine detaillierte Ausgabe in der Konsole wünschen, geben Sie ebenfalls 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 den laufenden Cluster:

sudo pg_ctlcluster 11 main stop

2. Wiederherstellung aus dem Backup:

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

3. Starten Sie den Cluster:

sudo pg_ctlcluster 11 main start

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

Repository (pgbackrest-Benutzer):

sudo pgbackrest --stanza=main backup

Das ist alles. Zum Schluss möchte ich daran erinnern, dass ich mich auf keinen Fall als Senior DBA ausgeben will und ich bei jeder Gelegenheit die Cloud nutzen werde. Momentan beginne ich, verschiedene Themen wie Backup, Replikation, Monitoring usw. zu lernen und schreibe kleine Berichte über die Ergebnisse, um einen kleinen Beitrag zur Gemeinschaft zu leisten und mir selbst kleine Spickzettel zu hinterlassen.

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

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster