Einführung in das Backup-System wal-g für PostgreSQL

WAL-G — ein einfaches und effektives Werkzeug für das Backup von PostgreSQL in die Cloud. Funktional ist es der Nachfolger des beliebten Werkzeugs WAL-E, jedoch in Go neu geschrieben. Eine wichtige neue Funktion von WAL-G sind jedoch die Delta-Backups. Delta-Backups WAL-G speichern die Seiten von Dateien, die sich seit der letzten Version des Backups geändert haben. WAL-G implementiert viele Technologien zur Parallelisierung von Backups. WAL-G arbeitet deutlich schneller als WAL-E.

Details zur Funktionsweise von wal-g finden Sie im Artikel: Backup beschleunigen. Vortrag von Yandex

Das S3-Speicherprotokoll hat sich zur beliebten Lösung für die Datenspeicherung entwickelt. Ein Vorteil von S3 ist der API-Zugang, der eine flexible Interaktion mit dem Speicher ermöglicht, einschließlich öffentlicher Leserechte, während Informationen im Speicher nur von autorisierten Personen aktualisiert werden.

Es gibt sowohl offene als auch private Implementierungen von Speichern, die das S3-Protokoll unterstützen. Heute betrachten wir das beliebte Lösung für kleine Speicher - Minio.

Für die Testphase von wal-g benötigt man einen PostgreSQL-Server, während Minio als Ersatz für S3 verwendet wird.

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.conf

Wenn Sie nginx nicht vor Minio verwenden, müssen Sie ändern

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Starten Sie Minio

systemctl start minio

Greifen Sie auf die Web-Oberfläche von Minio zu http://ip-adresse-des-minio-servers:9000 und erstellen Sie einen Bucket (zum Beispiel pg-backups).

DB-Server

WAL-G baue ich in rpm (Anton Patsev). Github, Fedora COPR.

Für diejenigen ohne RPM-basierte Systeme verwenden Sie die offizielle Anleitung Installationsanleitung.

Zusammen mit dem wal-g-Binary liegen in rpm Skripte vor, 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.sh

Installieren Sie wal-g.

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.14

Bearbeiten Sie /etc/wal-g.d/server-s3.conf nach Ihren Bedürfnissen.

Konfigurationsdateien und Daten, die vom Datenbankcluster verwendet werden, werden traditionell im Datenverzeichnis des Clusters gespeichert, das üblicherweise als 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, um die sich das Delta-Backup von dem Basis-Backup entfernt, und definieren die Delta-Kopie-Richtlinie. Sie können entweder ein Backup von der letzten vorhandenen Delta-Kopie erstellen oder ein Delta vom ursprünglichen vollständigen Backup machen. Dies ist wichtig, wenn sich in Ihrer Datenbank immer dasselbe Datenbankelement oder dieselben Daten ständig ändern.

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 mc

Datenbank initialisieren.

/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK

Wenn 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 10 und höher umstellen.

wal_level = archive

Wir konfigurieren die Sicherung der WAL-Archive alle 60 Sekunden mithilfe von PostgreSQL selbst. In der Produktion werden Sie einen anderen Wert für archive_timeout haben.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Der archive_command wird alle 60 Sekunden ausgeführt.

PostgreSQL starten.

systemctl start postgresql-9.6

In einer separaten Konsole die PostgreSQL-Protokolle auf Fehler überprüfen: (Ändern Sie postgresql-Wed.log entsprechend.)

tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

In psql einloggen.

su - postgres
psql

In psql erstellen wir eine DB.

Wir erstellen eine Tabelle in der DB test1.

create database test1;

Wir wechseln zur DB test.

postgres=# c test1;

Wir erstellen die Tabelle indexing_table.

test1=# CREATE TABLE indexing_table(created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW());

Daten hinzufügen.

Wir starten das Einfügen von Daten. 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;
done

Wir erstellen unbedingt ein vollständiges Backup.

su - postgres
/usr/local/bin/backup-push.sh

Wir schauen die Einträge in der Tabelle der DB test1 an.

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.

Wir schauen die Liste der vollständigen Backups an.

/usr/local/bin/backup-list.sh

Wiederherstellungstest

Vollständige Wiederherstellung mit allen verfügbaren WAL anwenden.

Wir stoppen PostgreSQL.

Wir löschen alles aus dem Ordner /var/lib/pgsql/9.6/data.

Wir starten das Skript /usr/local/bin/backup-fetch.sh mit dem Benutzer postgres.

su - postgres
/usr/local/bin/backup-fetch.sh

Backup-Extraktion abgeschlossen.

Wir fügen recovery.conf in den Ordner /var/lib/pgsql/9.6/data mit folgendem Inhalt hinzu.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'

Wir starten PostgreSQL. PostgreSQL wird den Wiederherstellungsprozess aus archivierten WAL starten, und erst dann wird die DB geöffnet.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Wiederherstellung auf einen 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, zu welcher Zeit 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+00

Wir starten PostgreSQL. PostgreSQL wird den Wiederherstellungsprozess aus archivierten WAL starten, und erst dann wird die DB geöffnet.

systemctl start postgresql-9.6
tail -fn100 /var/lib/pgsql/9.6/data/pg_log/postgresql-Wed.log

Testen

Wir generieren eine 1GB-Datenbank, wie hier beschrieben. https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

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 MB

s4cmd ist ein kostenloses Kommandozeilen-Tool zur Arbeit mit in Amazon S3 gespeicherten Daten. 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 s4cmd

LZ4

s4cmd --endpoint-url=http://ip-адрес-сервера-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 MB im lz4-Format nur für WAL-Logs

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 Backup.

LZMA

Nach der Erstellung von 1 GB Daten
338413694       s3://pg-backups/wal_005/
338 MB an Logs im LZMA-Format

Dauer der vollständigen Backup-Erstellung
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/

Das vollständige Backup im LZMA-Format benötigt 270 MB.

Brotli

Nach der Erstellung von 1 GB Daten
459229886       s3://pg-backups/wal_005/
459 MB an Logs im Brotli-Format

Dauer der vollständigen Backup-Erstellung
real    0m23.408s

Größe des Buckets in S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

Das vollständige Backup im Brotli-Format benötigt 312 MB.

Vergleich der Ergebnisse im Diagramm.

Einführung in das Backup-System wal-g für PostgreSQL

Wie wir sehen, ist Brotli in der Größenordnung mit LZMA vergleichbar, aber das Backup wird in der Zeit von LZ4 erstellt.

Chat der russischsprachigen PostgreSQL-Community: https://t.me/pgsql

Bitte geben Sie ein Sternchen auf Github, wenn Sie verwenden wal-g

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