Details over hoe wal-g werkt zijn te vinden in het artikel:
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
DB-server
WAL-G in rpm wordt door mij (Anton Patsev) geassembleerd.
Wie geen op RPM gebaseerd systeem heeft, gebruikt de ambtenaar
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
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.
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:
Geef Github een ster als je het gebruikt
Bron: www.habr.com