— 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 , men omskrevet i Go. Men WAL-G har én viktig ny funksjon — delta-kopier. Delta-kopier 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:
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 minioVi redigerer AccessKey og SecretKey i /etc/minio/minio.conf
vi /etc/minio/minio.confHvis du ikke bruker nginx foran Minio, må du endre
--address 127.0.0.1:9000--address 0.0.0.0:9000Vi starter Minio
systemctl start minioGå til Minio-webgrensesnittet og opprett en bøtte (for eksempel, pg-backups).
DB-server
Jeg samler WAL-G i rpm (Anton Patsev). , .
For de som ikke bruker et RPM-basert system, bruker den offisielle 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.shVi installerer wal-g.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gVi sjekker versjonen av wal-g.
wal-g --version
wal-g version v0.2.14Vi 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 mcInitialiserer databasen.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKHvis 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 = archiveVi 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.6Sjekker 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.logLogger inn i psql.
su - postgres
psqlOppretter 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;
doneSørg for å ta en fullstendig sikkerhetskopi.
su - postgres
/usr/local/bin/backup-push.shViser 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.shTesting 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.shSikkerhetskopiering 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.logGjenoppretting 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+00Starter 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.logTesting
Vi genererer en 1GB database som beskrevet her
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 MBs4cmd — 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 s4cmdLZ4
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 backupLZMA
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-formatBrotli
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.

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:
Vennligst gi en stjerne på Github hvis du bruker
Kilde: habr.com
