HaftungsausschlussIch bin ein Entwickler. Ich schreibe Code, interagiere nur als Benutzer mit der Datenbank. In keinem Fall gebe ich vor, ein Systemadministrator und insbesondere dba zu sein. Aber ...
Es passierte, dass ich eine Sicherung der postgresql-Datenbank organisieren musste. Keine Wolken - behalte SSH und lass es funktionieren und bitte nicht um Geld. Was machen wir in solchen Fällen? Richtig, wir haben pgdump in cron gepusht, jeden Tag sichern wir alles im Archiv und wenn wir völlig verstreut sind, senden wir dieses Archiv irgendwohin in die Hölle.
Diesmal bestand die Schwierigkeit darin, dass die Basis laut Plan um etwa + - 100 MB pro Tag wachsen sollte. Natürlich wird der Wunsch, alles mit pgdump zu sichern, in ein paar Wochen verschwinden. Hier kommen inkrementelle Backups zum Einsatz.
Interessant? Willkommen bei Katze.
Inkrementelle Sicherung ist eine Sicherungsart, bei der nicht alle Quelldateien gesichert werden, sondern nur neue und geänderte aus dem Moment der vorherigen Sicherung.
Wie jeder Entwickler, der (zu dieser Zeit) die Feinheiten von Postgres nicht verstehen wollte, wollte ich einen grünen Knopf finden. Nun, Sie wissen, wie in AWS, DigitalOcean: Klicken Sie auf eine Schaltfläche - Replikation erhalten, klicken Sie auf die zweite - Backups einrichten, die dritte - es wurde vor ein paar Stunden zurückgesetzt. Schaltflächen und ein schönes GUI-Tool habe ich nicht gefunden. Wenn Sie dies wissen (kostenlos oder günstig) - schreiben Sie darüber in den Kommentaren.
Googeln, fand ich zwei Werkzeuge
pgbarman und
pgbackrest . Ich hatte gerade kein Problem mit der ersten (sehr dürftige Dokumentation, ich habe versucht, alles gemäß alten Handbüchern zu erhöhen), aber die zweite erwies sich als auf dem Niveau, aber nicht ohne Mängel. Um die Arbeit für diejenigen, die mit einer ähnlichen Aufgabe konfrontiert sind, zu vereinfachen, wurde dieser Artikel verfasst.
Nachdem Sie diesen Artikel gelesen haben, erfahren Sie, wie Sie inkrementelle Sicherungen erstellen, auf einem Remoteserver (einem Repository mit Sicherungen) speichern und bei Datenverlust oder anderen Problemen auf dem Hauptserver wiederherstellen.
Vorbereitung
Um das Handbuch zu spielen, benötigen Sie zwei VPS. Das erste ist das Repository (das Repository, in dem sich die Sicherungen befinden) und das zweite der Server selbst mit postgres (in meinem Fall Version 11 von postgres).
Es wird davon ausgegangen, dass auf dem Server mit postgres root, sudo user, postgres user und postgres selbst installiert sind (postgres user wird bei der Installation von postgresql automatisch erstellt) und auf dem Repository-Server root und sudo user vorhanden sind (im Handbuch wird der Benutzername pgbackrest verwendet). .
Damit Sie bei der Wiedergabe der Anleitung weniger Probleme haben - ich schreibe kursiv auf,
wo, von welchem Benutzer und mit welchen Rechten ich den Befehl beim Schreiben und Prüfen des Artikels ausgeführt habe.
Installieren Sie die Rückenlehne
Repository (Benutzer pgbackrest):1. Laden Sie das Archiv mit pgbackrest herunter und übertragen Sie den 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 Assembly erforderlichen Abhängigkeiten:
sudo apt-get update sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev \ libpq-dev
3. Wir sammeln 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:
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):Die Installation von pgbackrest auf einem Server mit postgres ähnelt der Installation auf einem Repository (ja, pgbackrest sollte sich auf beiden Servern befinden),
aber im sechsten Absatz lautet
der zweite und letzte Befehl: sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
ersetzen durch: sudo chown postgres:postgres /var/log/pgbackrest sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
Konfiguration der Kommunikation zwischen Servern über passwortloses SSH
Damit pgbackrest ordnungsgemäß funktioniert, müssen Sie die Interaktion zwischen dem Postgres-Server und dem Repository mithilfe der Schlüsseldatei konfigurieren.
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 obigen 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 vom Root-Benutzer nach dem Passwort gefragt. Sie müssen das root-Passwort des postgres-Serverbenutzers 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 vom Root-Benutzer nach dem Passwort gefragt. Sie müssen das Root-Passwort des Repository-Benutzers 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 ohne Probleme Zugang bekommen.
Postgres server einrichten
Postgres-Server (sudo-Benutzer oder root):1. Lass uns von einer externen IP auf dem Postgres-Server "klopfen". Bearbeiten Sie dazu die Datei
postgresql.conf (im Ordner / etc / postgresql / 11 / main) und fügen Sie die folgende Zeile hinzu:
listen_addresses = '*'
Wenn eine solche Zeile bereits vorhanden ist, entfernen Sie das Kommentarzeichen oder setzen Sie den Parameterwert auf '*'.
Fügen Sie in der Datei pg_hba.conf (die sich ebenfalls im Ordner
/ etc / postgresql / 11 / main befindet ) 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. Wir nehmen die erforderlichen Einstellungen in
postgresql.conf vor (diese befinden sich im Ordner
/ etc / postgresql / 11 / main ), damit pgbackrest funktioniert:
archive_command = 'pgbackrest --stanza=main archive-push %p'
3. Nehmen Sie 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=<repository_server_ip>
4. Starten Sie postgresql neu:
sudo service postgresql restart
Repository-Server konfigurieren
Repository (pgbackrest-Benutzer):Nehmen Sie die erforderlichen Einstellungen in der Konfigurationsdatei von
pgbackrest vor(
/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
Speichererstellung
Repository (pgbackrest-Benutzer):Erstellen Sie einen neuen Speicher für den Hauptcluster:
sudo mkdir -m 770 /var/lib/pgbackrest sudo chown -R pgbackrest /var/lib/pgbackrest/ sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Überprüfen Sie
Postgres-Server (sudo-Benutzer oder root):Überprüfen Sie auf dem Postgres-Server:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info check
Repository (pgbackrest-Benutzer):Überprüfen Sie auf dem Repository-Server:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check
Wir stellen sicher, dass in der Ausgabe die Zeile "check command end: completed successful" erscheint.
Bist du müde Wir gehen zu den interessantesten über.Backup erstellen
Repository (pgbackrest-Benutzer):
1. Wir sichern:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Wir stellen sicher, dass das Backup erstellt wurde:
ls /var/lib/pgbackrest/backup/main/
Pgbackrest erstellt die erste vollständige Sicherung. Wenn Sie möchten, können Sie den Sicherungsbefehl erneut ausführen und sicherstellen, dass das System eine Teilsicherung 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 Ausgabe an die Konsole wünschen, geben Sie außerdem Folgendes 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 Arbeitscluster:
sudo pg_ctlcluster 11 main stop
2. Wir erholen uns von der Sicherung:
sudo -u postgres pgbackrest --stanza=main --delta restore
3. Führen Sie den Cluster aus:
sudo pg_ctlcluster 11 main start
Nach dem Wiederherstellen der Sicherung müssen wir eine zweite Sicherung durchführen:
Repository (pgbackrest-Benutzer): sudo pgbackrest --stanza=main backup
Das ist alles. Abschließend möchte ich Sie daran erinnern, dass ich in keinem Fall versuche, eine Senior-DBA aufzubauen, und bei der geringsten Gelegenheit Clouds verwenden werde. Derzeit fange ich selbst an, mich mit verschiedenen Themen wie Sicherung, Replikation, Überwachung usw. zu befassen. und ich schreibe kleine berichte über die ergebnisse, um einen kleinen beitrag für die gemeinschaft zu leisten und kleine krippen für mich zu hinterlassen.
In den folgenden Artikeln werde ich versuchen, über zusätzliche Funktionen zu sprechen - Datenwiederherstellung auf einem sauberen Cluster, Verschlüsselung von Sicherungen und Veröffentlichung auf S3, Sicherungen über rsync.