Inleiding tot het wal-g PostgreSQL-back-upsysteem

WAL-G is een eenvoudige en effectieve tool voor het maken van back-ups van PostgreSQL naar de cloud. Wat de belangrijkste functionaliteit betreft, is het de erfgenaam van de populaire tool WAL-E, maar herschreven in Go. Maar er is één belangrijke nieuwe functie in WAL-G: deltakopieën. delta-kopieën WAL-G bewaar pagina's met bestanden die zijn gewijzigd sinds de vorige back-upversie. WAL-G implementeert heel wat technologieën voor het parallelliseren van back-ups. WAL-G is veel sneller dan WAL-E.

Details over hoe wal-g werkt zijn te vinden in het artikel: We overklokken de back-up. Yandex-lezing

Het S3-opslagprotocol is populair geworden voor het opslaan van gegevens. Een van de voordelen van S3 is de mogelijkheid om toegang te krijgen via API, waardoor u flexibele interactie met de opslag kunt organiseren, inclusief openbare leestoegang, terwijl het bijwerken van informatie in de opslag alleen door geautoriseerde personen gebeurt.

Er zijn verschillende publieke en private opslagimplementaties die het S3-protocol gebruiken. Vandaag zullen we kijken naar een populaire oplossing voor het organiseren van kleine opslag: Minio.

Een enkele PostgreSQL-server is prima voor het testen van wal-g, en Minio wordt gebruikt als vervanging voor S3.

Minio-server

Minio-installatie

yum -y install yum-plugin-copr
yum copr enable -y lkiesow/minio
yum install -y minio

Bewerk AccessKey en SecretKey in /etc/minio/minio.conf

vi /etc/minio/minio.conf

Als u nginx niet vóór Minio gaat gebruiken, moet u dit wijzigen

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Minio lanceren

systemctl start minio

Ga naar de Minio-webinterface http://ip-адрес-сервера-minio:9000 en maak een bucket (bijvoorbeeld pg-backups).

DB-server

WAL-G in rpm wordt door mij (Anton Patsev) geassembleerd. GitHub, Fedora COPR.

Wie geen op RPM gebaseerd systeem heeft, gebruikt de ambtenaar instructies door installatie.

Samen met het binaire bestand wal-g bevat rpm scripts die variabelen importeren uit het bestand /etc/wal-gd/server-s3.conf.

backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh

Wal installeren.

yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-g

Wal-g-versie controleren.

wal-g --version
wal-g version v0.2.14

Bewerk /etc/wal-gd/server-s3.conf naar uw wensen.

De configuratiebestanden en gegevensbestanden die door een databasecluster worden gebruikt, worden traditioneel samen opgeslagen in de clustergegevensmap, gewoonlijk aangeduid 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 # Какой метод сжатия использовать.

Wanneer u WAL-G configureert, geeft u WALG_DELTA_MAX_STEPS op - het aantal stappen dat de deltaback-up maximaal mag duren vanaf de basisback-up, en geeft u het deltakopiebeleid op. Of u maakt een kopie van de laatste bestaande delta, of u maakt een delta van de originele volledige back-up. Dit is nodig in het geval dat hetzelfde onderdeel van de database in uw database altijd verandert, dezelfde gegevens voortdurend veranderen.

Het installeren van de database.

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

We initialiseren de database.

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

Als u op één server test, moet u de parameter wal_level opnieuw configureren om te archiveren voor PostgreSQL minder dan versie 1, en te repliceren voor PostgreSQL versie 10 en ouder.

wal_level = archive

Laten we elke 60 seconden een back-up maken van WAL-archieven met behulp van PostgreSQL zelf. Op prod heeft u een andere archive_timeout-waarde.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Каждые 60 секунд будет выполнятся команда archive_command.

PostgreSQL starten

systemctl start postgresql-9.6

In een aparte console kijken we naar de PostgreSQL-logboeken op fouten: (wijzig postgresql-Wed.log naar de huidige).

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

Laten we naar psql gaan.

su - postgres
psql

Maak een database in psql

Maak een tabel in de database test1.

create database test1;

Schakel over naar de databasetest.

postgres=# c test1;

We maken de tabel indexing_table.

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

Gegevens toevoegen.

We beginnen gegevens in te voeren. We wachten 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

Zorg ervoor dat u een volledige back-up maakt.

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

We kijken naar de records in de tabel in de databasetest1

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+

De tekenreeks is de huidige tijd.

Bekijk de lijst met volledige back-ups

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

Herstel testen

Volledig herstel met het rollen van alle beschikbare WAL.

Postgresql stoppen.

Verwijder alles uit de map /var/lib/pgsql/9.6/data.

Voer het script /usr/local/bin/backup-fetch.sh uit als de postgres-gebruiker.

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

Back-upextractie voltooid.

Voeg recovery.conf toe aan de map /var/lib/pgsql/9.6/data met de volgende inhoud.

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

We starten PostgreSQL. PostgreSQL start het herstelproces vanaf de gearchiveerde WAL's en pas dan wordt de database geopend.

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

Herstel voor een bepaalde tijd.

Als we de database tot een bepaalde minuut willen herstellen, voegen we de parameter recovery_target_time toe aan recovery.conf - we geven aan hoe laat de database moet worden hersteld.

restore_command = '/usr/local/bin/wal-fetch.sh "%f" "%p"'
recovery_target_time = '2020-01-29 09:46:25'

Kijk na het herstel naar de tabel indexing_table

 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

We starten PostgreSQL. PostgreSQL start het herstelproces vanaf de gearchiveerde WAL's en pas dan wordt de database geopend.

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

Testen

Een database van 1 GB genereren zoals hier beschreven https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

De bucketgrootte opvragen na het genereren van 1 GB aan gegevens.

postgres=# SELECT pg_size_pretty(pg_database_size('test1'));
pg_size_pretty
----------------
1003 MB

s4cmd is een gratis opdrachtregelprogramma voor het werken met gegevens in Amazon S3-opslag. Het hulpprogramma is geschreven in de programmeertaal Python en kan daardoor worden gebruikt in zowel Windows- als Linux-besturingssystemen.

S4cmd installeren

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 МБ в формате lz4 только WAL логов

Полный бекап с lz4 - 1GB данных
time backup_push.sh
real 0m18.582s

Размер S3 бакета после полного бекапа

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 МБ занимает полный бекап

LZMA

После генерации 1ГБ данных
338413694       s3://pg-backups/wal_005/
338 мб логов в формате lzma

Время генерации полного бекапа
time backup_push.sh
real    5m25.054s

Размер бакета в S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 мб занимает полный бекап в формате lzma

Brotli

После генерации 1ГБ данных
459229886       s3://pg-backups/wal_005/
459 мб логов в формате brotli

Время генерации полного бекапа
real    0m23.408s

Размер бакета в S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 мб занимает полный бекап в формате brotli

Vergelijking van de resultaten in de grafiek.

Inleiding tot het wal-g PostgreSQL-back-upsysteem

Zoals u kunt zien, is Brotli qua grootte vergelijkbaar met LZMA, maar de back-up wordt uitgevoerd in LZ4-tijd.

Chat van de Russischsprekende PostgreSQL-gemeenschap: https://t.me/pgsql

Geef Github een ster als je het gebruikt wal-g

Bron: www.habr.com

Voeg een reactie