— ein einfaches und effektives Werkzeug für das Backup von PostgreSQL in die Cloud. Funktional ist es der Nachfolger des beliebten Werkzeugs , jedoch in Go neu geschrieben. Eine wichtige neue Funktion von WAL-G sind jedoch die Delta-Backups. Delta-Backups 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:
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.confWenn Sie nginx nicht vor Minio verwenden, müssen Sie ändern
--address 127.0.0.1:9000--address 0.0.0.0:9000Starten Sie Minio
systemctl start minioGreifen Sie auf die Web-Oberfläche von Minio zu und erstellen Sie einen Bucket (zum Beispiel pg-backups).
DB-Server
WAL-G baue ich in rpm (Anton Patsev). , .
Für diejenigen ohne RPM-basierte Systeme verwenden Sie die offizielle 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.shInstallieren 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.14Bearbeiten 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 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 10 und höher umstellen.
wal_level = archiveWir 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.6In 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.logIn psql einloggen.
su - postgres
psqlIn 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;
doneWir erstellen unbedingt ein vollständiges Backup.
su - postgres
/usr/local/bin/backup-push.shWir 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.shWiederherstellungstest
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.shBackup-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.logWiederherstellung 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+00Wir 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.logTesten
Wir generieren eine 1GB-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 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 s4cmdLZ4
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.

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:
Bitte geben Sie ein Sternchen auf Github, wenn Sie verwenden
Quelle: habr.com
