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

WAL-G — 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 WAL-E, aber in Go neu geschrieben. Aber WAL-G hat eine wichtige neue Funktion — Delta-Kopien. Delta-Kopien WAL-G 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: Backup optimieren. Yandex-Vorlesung

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

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

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Minio starten

systemctl start minio

Gehen Sie zur Weboberfläche von Minio http://ip-adresse-des-minio-servers:9000 und erstellen Sie einen Bucket (z. B. pg-backups).

Datenbank-Server

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

Für Systeme, die nicht auf RPM basieren, verwenden Sie das offizielle Anleitung 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.sh

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

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

wal_level = archive

Wir 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.6

In 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.log

In psql einloggen.

su - postgres
psql

Eine 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;
done

Unbedingt ein vollständiges Backup durchführen.

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

Einstellungen 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.sh

Wiederherstellung 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.sh

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

Wiederherstellung 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+00

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

Tests

Wir generieren eine 1GB große 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 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 s4cmd

LZ4

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 Backup

LZMA

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-Format

Brotli

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.

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

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: https://t.me/pgsql

Bitte geben Sie uns einen Stern auf Github, wenn Sie es verwenden. wal-g

Quelle: habr.com

60GB SSD 8Gb DDR4