Introduksjon til wal-g systemet for sikkerhetskopiering av PostgreSQL

WAL-G — et enkelt og effektivt verktøy for sikkerhetskopiering av PostgreSQL til skyer. I sin grunnleggende funksjonalitet er det en arv av det populære verktøyet WAL-E, men omskrevet i Go. Men WAL-G har én viktig ny funksjon — delta-kopier. Delta-kopier WAL-G lagrer filside som har endret seg siden den forrige versjonen av sikkerhetskopien. WAL-G implementerer en rekke teknologier for parallellisering av sikkerhetskopier. WAL-G fungerer betydelig raskere enn WAL-E.

Detaljer om hvordan wal-g fungerer kan leses i artikkelen: Optimalisering av sikkerhetskopiering. Yandex-forelesning

S3-lagringsprotokollen har blitt populær for datalagring. En av fordelene med S3 er muligheten for tilgang via API, noe som gjør det mulig å organisere fleksibel interaksjon med lagringen, inkludert offentlig leseadgang, mens oppdatering av informasjonen i lagringen kun gjøres av autoriserte personell.

Det finnes flere både åpne og private versjoner av lagringsløsninger som fungerer med S3-protokollen. I dag skal vi se på en populær løsning for å organisere små lagringsenheter — Minio.

For testing av wal-g kan en PostgreSQL-server brukes, og Minio brukes som en erstatning for S3.

Minio-server

Installasjon av Minio

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

Vi redigerer AccessKey og SecretKey i /etc/minio/minio.conf

vi /etc/minio/minio.conf

Hvis du ikke bruker nginx foran Minio, må du endre

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Vi starter Minio

systemctl start minio

Gå til Minio-webgrensesnittet http://server-ip-adresse-minio:9000 og opprett en bøtte (for eksempel, pg-backups).

DB-server

Jeg samler WAL-G i rpm (Anton Patsev). Github, Fedora COPR.

For de som ikke bruker et RPM-basert system, bruker den offisielle instruksjonen installasjonen.

Sammen med binærfilen wal-g i rpm følger det skript som importerer variabler fra filen /etc/wal-g.d/server-s3.conf.

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

Vi installerer wal-g.

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

Vi sjekker versjonen av wal-g.

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

Vi redigerer /etc/wal-g.d/server-s3.conf etter egne behov.

Konfigurasjonsfiler og datafiler brukt av databasesystemet lagres tradisjonelt sammen i katalogen for databasens klynge, som vanligvis kalles 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 # Какой метод сжатия использовать.

Når du konfigurerer WAL-G, angir du WALG_DELTA_MAX_STEPS — antall trinn som den maksimale delta-sikkerhetskopien kan avvike fra base-sikkerhetskopien, og angir sjekken for delta-kopier. Du kan enten lage en kopi med den nyeste eksisterende deltaen, eller ta en delta fra den opprinnelige komplette sikkerhetskopien. Dette er viktig i tilfeller hvor den samme komponenten av databasen stadig endres med de samme dataene.

Installerer databasen.

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

Initialiserer databasen.

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

Hvis du tester på én server, må du endre parameteren wal_level til archive for PostgreSQL versjoner under 10, og replica for PostgreSQL versjon 10 og nyere.

wal_level = archive

Vi setter opp sikkerhetskopiering av WAL-arkivene hvert 60. sekund ved hjelp av PostgreSQL. På produksjon vil du ha en annen verdi for archive_timeout.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Kommandoen archive_command utføres hvert 60. sekund.

Starter PostgreSQL

systemctl start postgresql-9.6

Sjekker loggene til PostgreSQL for feil i et annet konsoll: (endres postgresql-Wed.log til den aktuelle filen).

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

Logger inn i psql.

su - postgres
psql

Oppretter en database i psql.

Oppretter en tabell i databasen test1.

create database test1;

Bytter til databasen test.

postgres=# c test1;

Oppretter tabellen indexing_table.

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

Legger til data.

Kjører dataavsetning. Venter 10-20 minutter.

#!/bin/bash
# postgres
while true; do
psql -U postgres -d test1 -c "INSERT INTO indexing_table(created_at) VALUES (CURRENT_TIMESTAMP);"
sleep 60;
done

Sørg for å ta en fullstendig sikkerhetskopi.

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

Viser postene i tabellen i databasen test1

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+

Linjen er den nåværende tiden.

Ser på listen over fullstendige sikkerhetskopier

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

Testing av gjenoppretting

Full gjenoppretting med å bruke alle tilgjengelige WAL.

Stopper Postgresql.

Fjerner alt fra mappen /var/lib/pgsql/9.6/data.

Kjører skriptet /usr/local/bin/backup-fetch.sh som bruker postgres-brukeren.

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

Sikkerhetskopiering fullført.

Legger til recovery.conf i mappen /var/lib/pgsql/9.6/data med følgende innhold.

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

Starter PostgreSQL. PostgreSQL vil kjøre gjenopprettingsprosessen fra de arkiverte WAL, og deretter vil databasen åpne.

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

Gjenoppretting til et bestemt tidspunkt.

Dersom vi ønsker å gjenopprette databasen til et bestemt tidspunkt, legger vi til parameteren recovery_target_time i recovery.conf — vi angir hvilket tidspunkt vi vil gjenopprette databasen til.

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

Etter gjenopprettingen ser vi på tabellen 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

Starter PostgreSQL. PostgreSQL vil kjøre gjenopprettingsprosessen fra de arkiverte WAL, og deretter vil databasen åpne.

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

Testing

Vi genererer en 1GB database som beskrevet her https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Vi spør om størrelsen på bøtta etter å ha generert 1GB data.

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

s4cmd — et gratis kommandolinjeverktøy for å jobbe med data lagret i Amazon S3. Verktøyet er skrevet i programmeringsspråket Python, og kan derfor brukes i både Windows og Linux.

Installer s4cmd

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://server-ip-address-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 MB i lz4-format kun for WAL-loggene

Full backup med lz4 - 1GB data
time backup_push.sh
real 0m18.582s

Størrelsen på S3-bøtten etter full backup

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 MB tar full backup

LZMA

Etter å ha generert 1GB data
338413694       s3://pg-backups/wal_005/
338 MB logger i lzma-format

Tid for å generere full backup
time backup_push.sh
real    5m25.054s

Størrelsen på bøtten i S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 MB tar full backup i lzma-format

Brotli

Etter å ha generert 1GB data
459229886       s3://pg-backups/wal_005/
459 MB logger i brotli-format

Tid for å generere full backup
real    0m23.408s

Størrelsen på bøtten i S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 MB tar full backup i brotli-format

Sammenligning av resultatene i grafen.

Introduksjon til wal-g systemet for sikkerhetskopiering av PostgreSQL

Som vi ser, er Brotli sammenlignbar i størrelse med LZMA, men backupen fullføres på tiden til LZ4.

Chatten til det russisktalende samfunnet PostgreSQL: https://t.me/pgsql

Vennligst gi en stjerne på Github hvis du bruker wal-g

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster