Hallo, ich bin Alexander Nikitin, Chef-Systemadministrator der BARS Group. In diesem Artikel möchte ich Ihnen das Tool pg_probackup vorstellen .
Pg_probackup ist eine Entwicklung von Postgres Professional, mit der Sicherungskopien von PostgreSQL DBMS erstellt werden können. Im Gegensatz zum Standarddienstprogramm pg_basebackup können Sie mit diesem Tool inkrementelle Sicherungen auf Datenblockebene (standardmäßig 8 KB) erstellen, Sicherungen und DBMS validieren, Speicherrichtlinien festlegen und vieles mehr.
In diesem Artikel möchte ich nicht alle möglichen Aspekte der Arbeit mit pg_probackup beschreiben. Ich möchte nur ein Verständnis dafür vermitteln, wie Sie dieses Tool in Ihrer Arbeit verwenden können.
Die folgenden Anwendungsfälle werden berücksichtigt:
- wal-
1
Gegeben: Wir haben zwei Server (OS CentOS 7), auf dem ersten haben wir unsere Datenbank (Hostname srv_db1, Benutzer postgres, PostgreSQL 12.4 installiert) und auf dem zweiten speichern wir Backups (Hostname srv_bkp, Benutzer backup_user).
Sie müssen die Sicherung so konfigurieren, dass Kopien des PostgreSQL-Clusters auf dem srv_bkp-Server gespeichert werden.
Lösung:
pg_probackup kann über ssh arbeiten und Agenten auf einem Remote-Host starten, die eine ssh-Verbindung als Kommunikations- und Transportkanal verwenden. Dementsprechend müssen Sie sicherstellen, dass der backup_user auf dem srv_bkp-Host eine Verbindung zum postgres-Benutzer auf dem srv_db1-Host herstellen kann.
1) Stellen Sie mit backup_user eine Verbindung zu srv_bkp her und führen Sie die folgenden Befehle aus:
ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1
Aktivieren Sie den paranoiden Modus und bearbeiten Sie die Datei ~ / .ssh / authorized_keys auf dem srv_db1-Server. Fügen Sie
vor der Zeile mit den Schlüsseln Folgendes ein:
command="pg_probackup-12 agent"
Sie sollten also so etwas haben:
command="pg_probackup-12 agent" ssh-rsa AAAA....
Damit sagen wir, dass nichts als der "pg_probackup-12-Agent" über SSH gestartet werden kann (mehr dazu hier ).
2) Wir installieren pg_probackup auf beiden Computern (im Beispiel arbeiten wir unter CentOS, aber für andere Distributionen wird der Installationsprozess in der Dokumentation beschrieben ):
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo
Die neueste verfügbare Version von pg_probackup wird zum Zeitpunkt dieses Schreibens installiert - 2.4.2.
3) Erstellen Sie einen Alias für srv_bkp (dies ist nicht erforderlich, aber bequemer) und definieren Sie eine Variable, die den Pfad zum Verzeichnis mit Sicherungen enthält (nachdem Sie dieses Verzeichnis zuvor erstellt haben):
mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile
Laden Sie das Profil
. .bash_profile
4) Initialisieren Sie auf srv_bkp das Sicherungsverzeichnis und fügen Sie eine neue Instanz hinzu:
pg_probackup init
Fügen Sie die PostgreSQL-Instanz zum Verzeichnis hinzu, geben Sie ihr den Namen db1, geben Sie die ssh-Verbindungsparameter an - Host, Benutzername und Pfad zu PGDATA.
pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data
Wenn die Zeile angezeigt wird
INFO: Instance 'db1' successfully inited
Die Initialisierung war also erfolgreich.
Definieren wir eine Richtlinie für die Aufbewahrung von Sicherungen:
pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2
Die resultierende Richtlinie
läuft auf Folgendes hinaus: Es ist erforderlich, alle Sicherungen unter 7 Tagen aufzubewahren,
während die Anzahl der vollständigen Sicherungen mindestens zwei betragen muss.
5) Um Sicherungen zu erstellen, müssen Sie eine Verbindung zum DBMS herstellen. Daher erstellen wir eine Datenbank im PostgreSQL-Cluster, zu dem die Verbindung hergestellt wird Um den Sicherungsprozess zu verwalten (aus Sicherheitsgründen ist dies besser als eine Verbindung zu einer Produktdatenbank herzustellen) und die Datenbankparameter zu ändern:
$ createdb backupdb
Beitritt zu einer neuen Datenbank
psql -d backupdb
Erstellen Sie eine Datenbankrolle, für die der Sicherungsprozess verwaltet wird:
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
Achten wir auf den Parameter listen_addresses:
show listen_addresses;
Wenn localhost, wechseln Sie zu *
alter system set listen_addresses='*';
Wenn Sie listen_addresses geändert haben, muss PostgreSQL neu gestartet werden.
Mal sehen, wo wir die Datei pg_hba.conf gefunden haben
psql –c 'show hba_file'
Fügen Sie pg_hba.conf die folgenden Regeln hinzu:
# pg_probackup access permission
host backupdb backup srv_bkp md5
host replication backup srv_bkp md5
Wir haben die Konfiguration erneut gelesen:
psql -c 'select pg_reload_conf()'
Wir prüfen, ob Tippfehler aufgetreten sind:
psql -c 'select * from pg_hba_file_rules'
Erstellen Sie unter srv_bkp im Ausgangsverzeichnis des Benutzers backup_user eine Datei, in die wir den Servernamen oder dessen IP-Adresse, Port, Datenbanknamen, Benutzernamen und Kennwort schreiben. Diese Datei wird benötigt, damit das Passwort beim Erstellen eines Backups automatisch eingegeben wird.
echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass
Legen Sie die erforderlichen Zugriffsrechte für diese Datei fest
chmod 600 ~/.pgpass
Und erstellen Sie das erste Backup:
pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres
Wenn wir alles richtig gemacht haben, erscheint so etwas auf dem Bildschirm:
INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy
Beachten Sie die Warnung von pg_probackup - die Prüfsummenprüfung ist in unserem Cluster nicht aktiviert, sodass Datenblöcke nicht auf Richtigkeit überprüft werden können. Mit anderen Worten, Sie sind nicht vor der Tatsache geschützt, dass fehlerhafte Datenblöcke nicht in die Sicherung gelangen.
Sehen wir uns die aktuellen Einstellungen an:
pg_probackup show-config --instance db1
Kürzen wir nun den Befehl zum Erstellen von Backups - wir werden einige Parameter in die Konfiguration der db1-Instanz schreiben:
pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log
Vergleichen wir: wie es war und wie es wurde
pg_probackup show-config --instance db1
| Es war | Wurde |
|---|---|
| # Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backup_user # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = OFF log-filename = pg_probackup.log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Compression parameters compress-algorithm = none compress-level = 1 # Remote access parameters remote-proto = ssh |
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backupdb pghost = srv_db1 pguser = backup # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = LOG log-filename = backup_cron.log log-directory = /home/backup_user/backup_db/log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 Wal-Tiefe = 0 # Komprimierungsparameter Komprimierungsalgorithmus = Keine Komprimierungsstufe = 1 # RAS - Parameter Remote-Proto = SSH Remote-Host = srv_db1 Remote-Benutzer = Postgres |
Erstellen wir eine inkrementelle Kopie im DELTA-Modus, ohne die in der Konfiguration festgelegten Parameter anzugeben:
pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired
Mal sehen, was wir haben
BACKUP INSTANCE 'db1'
=====================================================================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
=====================================================================================================================================
db1 12 QFERKZ 2020-08-21 05:55:52-04 DELTA STREAM 1/1 9s 136kB 32MB 1.00 0/B0000028 0/B0000168 OK
db1 12 QFERC9 2020-08-21 05:51:34-04 FULL STREAM 1/0 1m:3s 959MB 16MB 3.52 0/AE000028 0/AE0001A0 OK
Es gibt eine Menge von Informationen, eine ausführliche Beschreibung finden Sie in der zu finden Dokumentation , dennoch wollen wir auf einige Punkte wohnen:
Erholzeit - die Mindestzeit , für die Sie wiederherstellen können diese Sicherung mit
Modus - dem Modus , in dem die Kopie gemacht wurde, zur Zeit 4 verfügbar Modi - ein voller (FULL) und drei inkrementeller (PAGE, DELTA und PTRACK)
WAL-Modus- hier sind folgende Optionen möglich - STREAM und ARCHIVE. Im STREAM-Modus erstellte Kopien enthalten alle Dateien, die für die Wiederherstellung in einen konsistenten WAL-Status erforderlich sind. Damit dieser Modus funktioniert, musste unserem Backup-Benutzer die Rolle REPLICATION zugewiesen werden. Im ARCHIVE-Modus wird davon ausgegangen, dass wir die WAL-Archivierung konfiguriert haben. Die erforderlichen WAL-Dateien befinden sich dann in dem Pfad, der pg_probackup bekannt ist.
Status - Es gibt viele Status, die alle in der Dokumentation beschrieben sind. Wenn wir jedoch etwas anderes als OK sehen, ist es sinnvoll, in die Dokumentation zu gehen und zu sehen, was schief gelaufen ist.
Wie Sie vielleicht erraten haben, können wir die Ausgabe des Befehls pg_probackup show analysieren und den Status der zuletzt erstellten Sicherung abrufen, verarbeiten und an das Überwachungssystem senden. Dort können wir bereits die Regeln festlegen, nach denen die Benachrichtigung der für das DBMS verantwortlichen Mitarbeiter ausgelöst wird.
Erstellen wir ein Skript bkp_base.sh, das die Sicherung startet und das Ergebnis an das Überwachungssystem sendet:
#! /bin/sh
#
. /home/backup_user/.bash_profile
# , (FULL, DELTA ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired
# zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
result=0;
else
result=1;
fi
# zabbix zabbix_trapper pg.db_backup
# , , , .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result
Wir schreiben einen Aufruf an das resultierende Skript in crontab. Sie können beispielsweise den folgenden Zeitplan festlegen:
00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA
Damit ist die Lösung der ersten Aufgabe abgeschlossen. Wir haben die Sicherung konfiguriert und die Richtlinie zur Aufbewahrung von Kopien definiert. Wir senden auch den Status von Backups an das Überwachungssystem.
Im nächsten Teil werden wir uns mit dem Erstellen eines Wal-Dateiarchivs und dem Erstellen von Archivsicherungen befassen.