— ein einfaches und effektives Tool zur Sicherung von PostgreSQL in der Cloud. In Bezug auf die grundlegenden Funktionen ist es der beliebte Nachfolger des Tools , aber in Go neu geschrieben. Aber WAL-G hat eine wichtige neue Funktion — Delta-Kopien. Delta-Kopien speichern die Seiten von Dateien, die sich seit der vorherigen Version der Sicherung geändert haben. In WAL-G sind viele Technologien zur Parallelisierung von Backups implementiert. WAL-G arbeitet viel schneller als WAL-E.
Details zur Funktionsweise von wal-g finden Sie im Artikel:
Das S3-Speicherprotokoll hat sich als populär zur Datenspeicherung etabliert. Einer der Vorteile von S3 ist die API-Zugänglichkeit, die ein flexibles Zusammenspiel mit dem Speicher ermöglicht, einschließlich öffentlichem Lesezugriff, während die Aktualisierung von Informationen im Speicher nur durch autorisierte Personen erfolgt.
Es gibt sowohl offene als auch private Implementierungen von Speichern, die nach dem S3-Protokoll funktionieren. Heute betrachten wir eine beliebte Lösung zur Organisation kleiner Speicher — Minio.
Für Tests mit wal-g reicht ein PostgreSQL-Server aus, und als Ersatz für S3 verwenden wir Minio.
Minio-Server
Minio installieren
yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minioÄndern Sie AccessKey und SecretKey in /etc/minio/minio.conf
vi /etc/minio/minio.confWenn Sie nicht nginx vor Minio verwenden, müssen Sie ändern
--address 127.0.0.1:9000--address 0.0.0.0:9000Minio starten
systemctl start minioGehen Sie zur Weboberfläche von Minio und erstellen Sie einen Bucket (z. B. pg-backups).
Datenbank-Server
WAL-G baue ich (Anton Patsev) in rpm. , .
Für Systeme, die nicht auf RPM basieren, verwenden Sie das offizielle zur Installation.
Zusammen mit dem wal-g-Binary in rpm sind Skripte enthalten, die Variablen aus der Datei /etc/wal-g.d/server-s3.conf importieren.
backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.shwal-g installieren.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gÜberprüfen Sie die Version von wal-g.
wal-g --version
wal-g version v0.2.14Bearbeiten Sie /etc/wal-g.d/server-s3.conf nach Ihren Bedürfnissen.
Konfigurationsdateien und von der Datenbank-Cluster verwendete Datendateien werden traditionell im gleichen Verzeichnis wie das Datenverzeichnis des Clusters gespeichert, das normalerweise genannt wird PGDATA
#!/bin/bash
export PG_VER="9.6"
export WALE_S3_PREFIX="s3://pg-backups" # бакет, который мы создали в S3
export AWS_ACCESS_KEY_ID="xxxx" # AccessKey из /etc/minio/minio.conf
export AWS_ENDPOINT="http://ip-адрес-сервера-minio:9000"
export AWS_S3_FORCE_PATH_STYLE="true"
export AWS_SECRET_ACCESS_KEY="yyyy" # SecretKey из /etc/minio/minio.conf
export PGDATA=/var/lib/pgsql/$PG_VER/data/
export PGHOST=/var/run/postgresql/.s.PGSQL.5432 # Сокет для подключения к PostgreSQL
export WALG_UPLOAD_CONCURRENCY=2 # Кол-во потоков для закачки
export WALG_DOWNLOAD_CONCURRENCY=2 # Кол-во потоков для скачивания
export WALG_UPLOAD_DISK_CONCURRENCY=2 # Кол-во потоков на диске для закачки
export WALG_DELTA_MAX_STEPS=7
export WALG_COMPRESSION_METHOD=brotli # Какой метод сжатия использовать.
Bei der Konfiguration von WAL-G geben Sie WALG_DELTA_MAX_STEPS an – die maximale Anzahl an Schritten, die der Delta-Backup vom Basis-Backup entfernt sein darf, und legen die Delta-Kopierpolitik fest. Entweder erstellen Sie eine Kopie von der letzten verfügbaren Delta-Version oder Sie erstellen ein Delta vom ursprünglichen vollständigen Backup. Dies ist nötig, falls sich in Ihrer Datenbank immer dieselbe Komponente der DB ändert, also dieselben Daten ständig bearbeitet werden.
Datenbank installieren.
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql96 postgresql96-server mcDatenbank initialisieren.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKWenn Sie auf einem Server testen, müssen Sie den Parameter wal_level auf archive für PostgreSQL-Versionen unter 10 und auf replica für PostgreSQL-Version 10 und höher umstellen.
wal_level = archiveWir werden alle 60 Sekunden eine Sicherung der WAL-Archive mithilfe von PostgreSQL durchführen. In der Produktionsumgebung haben Sie möglicherweise einen anderen Wert für archive_timeout.
archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Alle 60 Sekunden wird der Befehl archive_command ausgeführt.PostgreSQL starten
systemctl start postgresql-9.6In einer separaten Konsole die PostgreSQL-Logs auf Fehler überprüfen: (postgresql-Wed.log durch die aktuelle Datei ersetzen).
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logIn psql einloggen.
su - postgres
psqlEine Datenbank in psql erstellen.
Tabelle in der Datenbank test1 erstellen.
create database test1;Wechseln zur Datenbank test.
postgres=# c test1;Tabelle indexing_table erstellen.
test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());Daten hinzufügen.
Daten einfügen. Warten Sie 10-20 Minuten.
#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
doneUnbedingt ein vollständiges Backup durchführen.
su - postgres
/usr/local/bin/backup-push.shEinstellungen in der Tabelle in der Datenbank test1 überprüfen.
select * from indexing_table;
2020-01-29 09:41:25.226198+
2020-01-29 09:42:25.336989+
2020-01-29 09:43:25.356069+
2020-01-29 09:44:25.37381+
2020-01-29 09:45:25.392944+
2020-01-29 09:46:25.412327+
2020-01-29 09:47:25.432564+
2020-01-29 09:48:25.451985+
2020-01-29 09:49:25.472653+
2020-01-29 09:50:25.491974+
2020-01-29 09:51:25.510178+Die Zeile zeigt die aktuelle Zeit.
Die Liste der vollständigen Backups überprüfen
/usr/local/bin/backup-list.shWiederherstellung testen
Vollständige Wiederherstellung unter Verwendung aller verfügbaren WALs.
PostgreSQL stoppen.
Alles im Ordner /var/lib/pgsql/9.6/data löschen.
Das Skript /usr/local/bin/backup-fetch.sh als Benutzer postgres ausführen.
su - postgres
/usr/local/bin/backup-fetch.shBackup-Extraktion abgeschlossen.
Die recovery.conf mit folgendem Inhalt in den Ordner /var/lib/pgsql/9.6/data hinzufügen.
restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'PostgreSQL starten. PostgreSQL wird den Wiederherstellungsprozess aus den archivierten WALs starten, und erst danach wird die Datenbank geöffnet.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logWiederherstellung zu einem bestimmten Zeitpunkt.
Wenn wir die Datenbank zu einem bestimmten Zeitpunkt wiederherstellen möchten, fügen wir in die recovery.conf den Parameter recovery_target_time hinzu – wir geben an, auf wann die Datenbank wiederhergestellt werden soll.
restore_command = 'usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'Nach der Wiederherstellung schauen wir uns die Tabelle indexing_table an.
2020-01-29 09:41:25.226198+00
2020-01-29 09:42:25.336989+00
2020-01-29 09:43:25.356069+00
2020-01-29 09:44:25.37381+00
2020-01-29 09:45:25.392944+00PostgreSQL starten. PostgreSQL wird den Wiederherstellungsprozess aus den archivierten WALs starten, und erst danach wird die Datenbank geöffnet.
systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.logTests
Wir generieren eine 1GB große Datenbank, wie hier beschrieben.
Wir fragen die Größe des Buckets nach der Generierung von 1GB Daten an.
postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MBs4cmd ist ein kostenloses Befehlszeilen-Tool zum Arbeiten mit Daten, die im Amazon S3-Speicher abgelegt sind. Das Tool ist in der Programmiersprache Python geschrieben und kann daher sowohl in Windows- als auch in Linux-Betriebssystemen verwendet werden.
Wir installieren s4cmd.
pip install s4cmdLZ4
s4cmd --endpoint-url=http://ip-adresse-des-minio-servers:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822 s3://pg-backups/wal_005/
840 MB im lz4-Format nur WAL-Log-Dateien
Vollständiges Backup mit lz4 - 1GB Daten
time backup_push.sh
real 0m18.582s
Größe des S3-Buckets nach vollständigem Backup
581480085 s3://pg-backups/basebackups_005/
842374424 s3://pg-backups/wal_005
581 MB belegt das vollständige BackupLZMA
Nach der Generierung von 1GB Daten
338413694 s3://pg-backups/wal_005/
338 MB Logs im lzma-Format
Dauer der Generierung des vollständigen Backups
time backup_push.sh
real 5m25.054s
Größe des Buckets in S3
270310495 s3://pg-backups/basebackups_005/
433485092 s3://pg-backups/wal_005/
270 MB belegt das vollständige Backup im lzma-FormatBrotli
Nach der Generierung von 1GB Daten
459229886 s3://pg-backups/wal_005/
459 MB Logs im brotli-Format
Dauer der Generierung des vollständigen Backups
real 0m23.408s
Größe des Buckets in S3
312960942 s3://pg-backups/basebackups_005/
459309262 s3://pg-backups/wal_005/
312 MB belegt das vollständige Backup im brotli-Format
Vergleich der Ergebnisse in einem Diagramm.

Wie wir sehen, ist Brotli in der Größe mit LZMA vergleichbar, aber das Backup wird in der Zeit von LZ4 durchgeführt.
Chat der russischsprachigen PostgreSQL-Community:
Bitte geben Sie uns einen Stern auf Github, wenn Sie es verwenden.
Quelle: habr.com
