Inkrementelle Postgresql-Backups mit pgbackrest – ein Kurs für einen jungen Kämpfer vom Entwickler

Haftungsausschluss

Ich bin Entwickler. Ich schreibe Code und interagiere nur als Benutzer mit der Datenbank. Ich gebe in keiner Weise vor, ein Systemadministrator zu sein, geschweige denn ein Datenbankadministrator. Aber…

Zufällig musste ich ein Backup der Postgresql-Datenbank organisieren. Keine Clouds – nutzen Sie einfach SSH und stellen Sie sicher, dass alles funktioniert, ohne dafür Geld zu verlangen. Was tun wir in solchen Fällen? Das ist richtig, wir pushen pgdump in cron, sichern jeden Tag alles im Archiv, und wenn wir völlig verloren sind, schicken wir dieses Archiv irgendwo weit weg.

Diesmal bestand die Schwierigkeit darin, dass die Datenbank den Plänen zufolge um etwa +- 100 MB pro Tag wachsen sollte. Natürlich wird nach ein paar Wochen der Wunsch verschwinden, alles mit pgdump zu sichern. Hier helfen inkrementelle Backups.

Interessant? Willkommen bei Katze.

Inkrementelles Backup ist eine Art Backup, bei dem nicht alle Quelldateien kopiert werden, sondern nur neue und diejenigen, die seit der Erstellung der vorherigen Kopie geändert wurden.

Wie jeder Entwickler, der (damals) ABSOLUT nicht bereit war, die Feinheiten von Postgres zu verstehen, wollte ich den grünen Knopf finden. Nun, wissen Sie, wie bei AWS, DigitalOcean: Sie haben einen Knopf gedrückt – Sie haben die Replikation erhalten, Sie haben den zweiten gedrückt – Sie haben Backups eingerichtet, den dritten – Sie haben alles ein paar Stunden zurückgesetzt. Ich habe weder eine Schaltfläche noch ein schönes GUI-Tool gefunden. Wenn Sie eines kennen (kostenlos oder günstig), schreiben Sie in den Kommentaren darüber.

Beim Googeln habe ich zwei Tools gefunden pgbarman и pgbackrest. Beim ersten ist es mir einfach nicht gelungen (sehr spärliche Dokumentation, ich habe versucht, alles anhand alter Handbücher herauszufinden), aber beim zweiten stellte sich heraus, dass die Dokumentation auf dem neuesten Stand war, aber nicht ohne Mängel. Um denjenigen, die vor einer ähnlichen Aufgabe stehen, die Arbeit zu erleichtern, wurde dieser Artikel geschrieben.

Nachdem Sie diesen Artikel gelesen haben, erfahren Sie, wie Sie inkrementelle Backups erstellen, diese auf einem Remote-Server (Repository mit Backups) speichern und bei Datenverlust oder anderen Problemen auf dem Hauptserver wiederherstellen.

Training

Um das Handbuch zu reproduzieren, benötigen Sie zwei VPS. Der erste wird der Speicher sein (das Repository, in dem die Backups gespeichert werden) und der zweite tatsächlich der Server selbst mit Postgres (in meinem Fall Version 11 von Postgres).

Es wird davon ausgegangen, dass auf dem Server mit Postgres Root, Sudo-Benutzer, Postgres-Benutzer und Postgres selbst installiert sind (der Postgres-Benutzer wird bei der Installation von Postgresql automatisch erstellt) und auf dem Repository-Server Root und Sudo-Benutzer vorhanden sind (im Handbuch). Es wird der Benutzername pgbackrest verwendet.

Damit Sie weniger Probleme beim Vervielfältigen der Anleitung haben, schreibe ich kursiv Wo, mit welchem ​​Benutzer und mit welchen Rechten habe ich den Befehl ausgeführt beim Schreiben und Überprüfen des Artikels.

pgbackrest installieren

Repository (Benutzer pgbackrest):

1. Laden Sie das Archiv von pgbackrest herunter und übertragen Sie seinen 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 für die Montage erforderlichen Abhängigkeiten:

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

3. Montage der Rückenlehne:

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 erfordert Perl. Installieren:

sudo apt-get install perl

6. Erstellen Sie Verzeichnisse für Protokolle und geben Sie ihnen bestimmte Rechte:

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 Prozess der Installation von pgbackrest auf einem Server mit Postgres ähnelt dem Installationsprozess im Repository (ja, pgbackrest muss auf beiden Servern installiert sein). aber im 6. Absatz der zweite und letzte Befehl:

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

ersetzen mit:

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

Einrichten der Interaktion zwischen Servern über passwortloses SSH

Damit pgbackrest ordnungsgemäß funktioniert, muss die Interaktion zwischen dem Postgres-Server und dem Repository mithilfe der Schlüsseldatei konfiguriert 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! Wir führen die oben genannten Befehle ohne sudo aus.

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@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

In diesem Schritt werden Sie nach dem Passwort für den Root-Benutzer gefragt. Sie müssen das Passwort des Root-Benutzers des Postgres-Servers eingeben!

Postgres-Server (Sudo-Benutzer):

Kopieren Sie den öffentlichen Schlüssel des Repositorys mit postgres auf den Server:

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

In diesem Schritt werden Sie nach dem Passwort für den Root-Benutzer gefragt. Sie müssen genau das Passwort des Root-Benutzers des Repositorys eingeben!

Wir prüfen:

Repository (Root-Benutzer, für die Reinheit des Experiments):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-Server (Root-Benutzer, für die Reinheit des Experiments):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Wir sorgen dafür, dass wir problemlos Zugang erhalten.

Einrichten eines Postgres-Servers

Postgres-Server (Sudo-Benutzer oder Root):

1. Lassen Sie uns das Klopfen auf den Postgres-Server von externen IPs aus zulassen. Bearbeiten Sie dazu die Datei postgresql.conf (befindet sich im Ordner /etc/postgresql/11/main) und fügen Sie die Zeile hinzu:

listen_addresses = '*'

Wenn eine solche Zeile bereits vorhanden ist, entkommentieren Sie sie entweder oder setzen Sie den Parameterwert auf „*“.

Im Ordner pg_hba.conf (befindet sich auch im Ordner /etc/postgresql/11/main) fügen Sie die folgenden Zeilen hinzu:

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

wo:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Nehmen wir die notwendigen Einstellungen vor postgresql.conf (es ist im Ordner /etc/postgresql/11/main), damit pgbackrest funktioniert:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

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

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

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Postgresql neu laden:

sudo service postgresql restart

Einrichten eines Repository-Servers

Repository (pgbackrest-Benutzer):

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

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

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Erstellen eines Repositorys

Repository (pgbackrest-Benutzer):

Erstellen Sie einen neuen Speicher für den Cluster Haupt-:

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

Проверка

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: erfolgreich abgeschlossen“ sehen.

Müde? Kommen wir zum interessantesten Teil.

Erstellen eines Backups

Repository (pgbackrest-Benutzer):

1. Führen Sie ein Backup durch:

sudo -u pgbackrest pgbackrest --stanza=main backup

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

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

Pgbackrest erstellt das erste vollständige Backup. Wenn Sie möchten, können Sie den Sicherungsbefehl erneut ausführen und sicherstellen, dass das System eine inkrementelle Sicherung erstellt.

Wenn Sie erneut eine vollständige Sicherung durchführen möchten, geben Sie ein zusätzliches Flag an:

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

Wenn Sie eine detaillierte Konsolenausgabe wünschen, geben Sie außerdem Folgendes an:

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

Wiederherstellen eines Backups

Postgres-Server (Sudo-Benutzer oder Root):

1. Stoppen Sie den laufenden Cluster:

sudo pg_ctlcluster 11 main stop

2. Wiederherstellung aus Backup:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Um die Datenbank auf den Zustand der letzten VOLLSTÄNDIGEN Sicherung wiederherzustellen, verwenden Sie den Befehl ohne Angabe von „recovery_target“:

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

Wichtig! Nach der Wiederherstellung kann es vorkommen, dass die Datenbank im Wiederherstellungsmodus hängen bleibt (es treten Fehler wie FEHLER auf: DROP DATABASE kann in einer schreibgeschützten Transaktion nicht ausgeführt werden). Ehrlich gesagt habe ich noch nicht verstanden, womit das zusammenhängt. Die Lösung lautet wie folgt (Sie müssen etwas warten, nachdem der Befehl ausgeführt wurde):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

Tatsächlich ist es möglich, ein bestimmtes Backup anhand seines Namens wiederherzustellen. Hier bin ich nur Ich werde einen Link zur Beschreibung dieser Funktion in der Dokumentation bereitstellen. Die Entwickler raten dazu, diese Option mit Vorsicht zu nutzen und erklären, warum. Ich kann von mir selbst hinzufügen, dass ich es verwendet habe. Wenn es wirklich nötig ist, stellen Sie sicher, dass die Datenbank nach der Wiederherstellung den Wiederherstellungsmodus verlässt (select pg_is_in_recovery() sollte „f“ anzeigen) und erstellen Sie für alle Fälle nach der Wiederherstellung eine vollständige Sicherung.

3. Starten Sie den Cluster:

sudo pg_ctlcluster 11 main start

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

Repository (pgbackrest-Benutzer):

sudo pgbackrest --stanza=main backup

Das ist alles. Abschließend möchte ich Sie daran erinnern, dass ich in keiner Weise versuche, mich als leitender DBA auszugeben, und dass ich die Clouds bei jeder Gelegenheit nutzen werde. Derzeit beginne ich selbst, mich mit verschiedenen Themen wie Backup, Replikation, Überwachung usw. zu beschäftigen. und ich schreibe kleine Berichte über die Ergebnisse, um einen kleinen Beitrag für die Community zu leisten und mir selbst kleine Spickzettel zu hinterlassen.

In den folgenden Artikeln werde ich versuchen, über zusätzliche Funktionen zu sprechen – Datenwiederherstellung in einem sauberen Cluster, Verschlüsselung von Backups und Veröffentlichung auf S3, Backups über rsync.

Source: habr.com

Kommentar hinzufügen