Introduktion till wal-g backup systemet för PostgreSQL

WAL-G — ett enkelt och effektivt verktyg för att säkerhetskopiera PostgreSQL till molnet. Med sin grundläggande funktionalitet är det en arvtagare till det populära verktyget WAL-E, men omarbetat i Go. En viktig ny funktion i WAL-G är delta-kopior. Delta-kopior WAL-G lagrar filens sidor som har ändrats sedan den senaste säkerhetskopian. WAL-G implementerar en hel del teknologier för att parallellisera säkerhetskopieringar. WAL-G fungerar mycket snabbare än WAL-E.

Du kan läsa mer om hur wal-g fungerar i artikeln: Öka säkerhetskopieringen. Föreläsning från Yandex

S3-lagringsprotokollet har blivit populärt för att lagra data. En av fördelarna med S3 är möjligheten att få åtkomst via API, vilket möjliggör flexibel interaktion med lagringen, inklusive offentlig åtkomst för läsning, medan uppdatering av informationen i lagringen endast sker av auktoriserade personer.

Det finns flera både öppna och privata implementeringar av lagringslösningar som arbetar med S3-protokollet. Idag kommer vi att titta på en populär lösning för att organisera små lagringssystem — Minio.

För att testa wal-g räcker en PostgreSQL-server och Minio används som ersättning för S3.

Minio-server

Installation av Minio

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

Ändra AccessKey och SecretKey i /etc/minio/minio.conf

vi /etc/minio/minio.conf

Om du inte planerar att använda Nginx före Minio måste du ändra

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Starta Minio

systemctl start minio

Gå till Minios webbgränssnitt http://ip-adressen-till-minio-servern:9000 och skapa en bucket (till exempel, pg-backups).

DB-server

Jag bygger WAL-G i rpm (Anton Patsev). Github, Fedora COPR.

För dem utan RPM-baserat system, använd den officiella instruktionen installationsanvisningen.

Tillsammans med binärfilerna för wal-g i rpm finns skript som importerar variabler från 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

Installera wal-g.

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

Kontrollera versionen av wal-g.

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

Redigera /etc/wal-g.d/server-s3.conf efter dina behov.

Konfigurationsfiler och datakataloger som används av databasens kluster lagras traditionellt tillsammans i datakatalogen för klustret, som vanligtvis kallas 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 # Какой метод сжатия использовать.

Vid inställning av WAL-G anger du WALG_DELTA_MAX_STEPS – det maximala antal steg som delta-backup kan avvika från basbackups, och anges policyn för delta-kopia. Antingen gör du en kopia med den senaste befintliga delta, eller så gör du en delta från den ursprungliga fullständiga backupen. Detta behövs i fall där en och samma komponent i databasen alltid förändras, samma data ändras ständigt.

Installera 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

Vi initierar databasen.

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

Om du testar på 1 server, behöver du omkonfigurera parametern wal_level till archive för PostgreSQL versioner mindre än 10, och replica för PostgreSQL version 10 och äldre.

wal_level = archive

Vi gör backup av WAL-arkiven var 60:e sekund med hjälp av PostgreSQL själv. På produktion kommer du ha ett annat värde för archive_timeout.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Kommandot archive_command kommer att köras var 60:e sekund.

Starta PostgreSQL

systemctl start postgresql-9.6

I en separat konsol tittar vi på PostgreSQL-loggar för eventuella fel: (byt ut postgresql-Wed.log mot den aktuella).

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

Logga in i psql.

su - postgres
psql

Skapa en databas i psql.

Skapa en tabell i databasen test1.

create database test1;

Byt till databasen test.

postgres=# c test1;

Skapa tabellen indexing_table.

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

Lägg till data.

Starta datainförseln. Vänta 10-20 minuter.

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

Se till att göra en fullständig backup.

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

Titta på poster 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+

Raden är den aktuella tiden.

Titta på listan över fullständiga backuper

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

Testa återställning

Full återställning med applicering av alla tillgängliga WAL.

Stoppa PostgreSQL.

Ta bort allt från mappen /var/lib/pgsql/9.6/data.

Kör skriptet /usr/local/bin/backup-fetch.sh som användaren postgres.

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

Backuputvinning slutförd.

Lägg till recovery.conf i mappen /var/lib/pgsql/9.6/data med följande innehåll.

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

Starta PostgreSQL. PostgreSQL kommer att påbörja återställningsprocessen från arkiverade WAL, och först därefter öppnas databasen.

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

Återställning till en specifik tid.

Om vi vill återställa databasen till en viss tidpunkt, lägger vi till parametern recovery_target_time i recovery.conf - vi anger vilken tid vi vill återställa databasen till.

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

Efter återställning tittar 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

Starta PostgreSQL. PostgreSQL kommer att påbörja återställningsprocessen från arkiverade WAL, och först därefter öppnas databasen.

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

Testning

Vi genererar en 1GB databas enligt beskrivningen här https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Vi begär storleken på bucketen efter att ha genererat 1GB data.

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

s4cmd — ett gratis kommandoradsverktyg för att hantera data som finns i Amazon S3-lagring. Verktyget är skrivet i programspråket Python och kan därför användas på både Windows och Linux.

Vi installerar s4cmd

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-adress-till-server-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 MB i lz4 format endast WAL-loggar

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

Storleken på S3-bucket efter full backup

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

LZMA

Efter generering av 1GB data
338413694       s3://pg-backups/wal_005/
338 MB loggar i lzma format

Tid för full backupgenerering
time backup_push.sh
real    5m25.054s

Storleken på bucketen i S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 MB tar upp full backup i lzma format

Brotli

Efter generering av 1GB data
459229886       s3://pg-backups/wal_005/
459 MB loggar i brotli format

Tid för full backupgenerering
real    0m23.408s

Storleken på bucketen i S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 MB tar upp full backup i brotli format

Jämförelse av resultaten i diagrammet.

Introduktion till wal-g backup systemet för PostgreSQL

Som vi ser är Brotli jämförbar i storlek med LZMA, men backupen utförs på tiden för LZ4.

Chatt för den ryskspråkiga PostgreSQL-gemenskapen: https://t.me/pgsql

Sätt gärna en stjärna på Github om du använder wal-g

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster