Njohja me sistemin e backup-it wal-g për PostgreSQL

WAL-G — një mjet i thjeshtë dhe efektiv për backup të PostgreSQL në cloud. Në funksionalitetin e tij bazë, ai është trashëgimtar i mjetit të njohur WAL-E, por i shkruar përsëri në Go. Por në WAL-G ka një veçori të re të rëndësishme — kopje delta. Kopjet delta WAL-G ruajnë faqet e skedarëve që janë ndryshuar nga versione e mëparshme e backup-it. WAL-G ka implementuar shumë teknologji për paralelizimin e backup-eve. WAL-G punon shumë më shpejt se WAL-E.

Detajet mbi funksionimin e wal-g mund të lexohen në artikullin: Rritja e backup-it. Lezioni i Yandeksit

Protokolli i ruajtjes S3 është bërë i njohur për ruajtjen e të dhënave. Një nga avantazhet e S3 është mundësia e aksesit përmes API-së, e cila lejon organizimin e një ndërveprimi fleksibël me depot, duke përfshirë aksesin publik në lexim, ndërsa azhornimi i informacionit në depo ndodh vetëm nga persona të autorizuar.

Ekzistojnë disa implementime, si të hapura ashtu edhe private, të depozita që punojnë sipas protokollit S3. Sot do të shqyrtojmë një zgjidhje të njohur për organizimin e depove të vogla — Minio.

Për testimin e wal-g është e mjaftueshme një server PostgreSQL, ndërsa Minio përdoret si zëvendësim për S3.

Serveri Minio

Instalimi i Minio

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

Modifikoni AccessKey dhe SecretKey në /etc/minio/minio.conf

vi /etc/minio/minio.conf

Nëse nuk do të përdorni nginx para Minio, duhet të ndryshoni

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Nisni Minio

systemctl start minio

Hyni në ndërfaqen web të Minio http://adresa-ip-e-serverit-minio:9000 dhe krijoni një bucket (p.sh., pg-backups).

Serveri DB

WAL-G në rpm e mbledh unë (Anton Patsev). Github, Fedora COPR.

Për ata që nuk kanë një sistem RPM-based, përdorni informacionin e zyrtar instruksionin për instalimin.

Bashkë me binarin e wal-g në rpm janë skriptet, të cilat importojnë variablat nga skedari /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

Instaloni wal-g.

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

Kontrolloni versionin e wal-g.

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

Redaktoni /etc/wal-g.d/server-s3.conf sipas nevojave tuaja.

Skedaret e konfigurimit dhe skedaret e të dhënave, të përdorura nga klasteri i bazës së të dhënave, tradicionalisht ruhen së bashku në katalogun e të dhënave të klasterit, i cili zakonisht quhet 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 # Какой метод сжатия использовать.

Kur në konfigurimin e WAL-G, përcaktoni WALG_DELTA_MAX_STEPS — numrin maksimal të hapave që delfa-backup mund të jetë larg nga backup-i bazë dhe përcaktoni politikën e kopjes së delfës. Ose bëni një kopje nga delfa e fundit ekzistuese, ose bëni delfën nga backup-i i plotë fillestar. Kjo është e nevojshme kur një element i caktuar i DB-së në bazën e të dhënave tuaj vazhdimisht ndryshon, të njëjtat të dhëna ndryshojnë vazhdimisht.

Instaloni DB-në.

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

Inicijoni DB-në.

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

Nëse po testoni në një server, duhet të rikonfiguroni parametrin wal_level në archive për PostgreSQL më të ulët se versioni 10 dhe replica për PostgreSQL 10 dhe më të lartë.

wal_level = archive

Të bëjmë backup të arkivave të WAL çdo 60 sekonda me ndihmën e PostgreSQL. Në prodhim do të keni një vlerë tjetër për archive_timeout.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Komanda archive_command do të ekzekutohet çdo 60 sekonda.

Nisim PostgreSQL

systemctl start postgresql-9.6

Në një konsolë tjetër, shikoni log-et e PostgreSQL për gabime: (ndryshoni postgresql-Wed.log me aktualin).

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

Hyni në psql.

su - postgres
psql

Krijoni DB në psql.

Krijoni një tabelë në DB test1.

create database test1;

Kaloni në DB test.

postgres=# c test1;

Krijoni tabelën indexing_table.

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

Shtimi i të dhënave.

Nisni inserimin e të dhënave. Prisni 10-20 minuta.

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

Sigurohuni që të bëni një backup të plotë.

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

Shikoni të dhënat në tabelë në DB 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+

Rreshti është koha aktuale.

Shikoni listën e backup-eve të plota

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

Testimi i rikuperimit

Rikuperim i plotë duke e rikuperuar të gjitha WAL të disponueshme.

Ndale PostgreSQL.

Fshini gjithçka nga mapa /var/lib/pgsql/9.6/data.

Nisni skriptin /usr/local/bin/backup-fetch.sh nga përdoruesi postgres.

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

Nxjerrja e backup-it përfundoi.

Shtoni recovery.conf në folderin /var/lib/pgsql/9.6/data me përmbajtjen e mëposhtme.

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

Nisni PostgreSQL. PostgreSQL do të nisë procesin e rikuperimit nga WAL arkivor, dhe vetëm atëherë baza do të hapet.

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

Rikuperimi për një periudhë të caktuar.

Nëse duam të rikthejmë bazën në një minutë të caktuar, atëherë në recovery.conf shtojmë parametrin recovery_target_time – specifikojmë se për në cilin moment duam të rikthejmë bazën.

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

Pas rikthimit shikojmë tabelën 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

Nisni PostgreSQL. PostgreSQL do të nisë procesin e rikuperimit nga WAL arkivor, dhe vetëm atëherë baza do të hapet.

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

Testimi

Gjenerojmë një bazë të dhënash prej 1GB siç përshkruhet këtu. https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Kërkojmë madhësinë e buketës pas gjenerimit të 1GB të dhënave.

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

s4cmd — një mjet falas për linjën e komandës për të punuar me të dhënat e ruajtura në Amazon S3. Ky utilitar është shkruar në gjuhën programuese Python, dhe për këtë arsye, mund të përdoret në sistemet operative Windows dhe Linux.

Instalojmë s4cmd.

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-adresën-e-serverit-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 MB në formatin lz4 vetëm për logjet e WAL

Backup-i i plotë me lz4 - 1GB të dhënash
time backup_push.sh
real 0m18.582s

Madhësia e buketës S3 pas backup-it të plotë

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 MB zë backup-i i plotë

LZMA

Pas gjenerimit të 1GB të dhënash
338413694       s3://pg-backups/wal_005/
338 MB logje në formatin lzma

Koha e gjenerimit të backup-it të plotë
time backup_push.sh
real    5m25.054s

Madhësia e buketës në S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 MB zë backup-i i plotë në formatin lzma

Brotli

Pas gjenerimit të 1GB të dhënash
459229886       s3://pg-backups/wal_005/
459 MB logje në formatin brotli

Koha e gjenerimit të backup-it të plotë
real    0m23.408s

Madhësia e buketës në S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 MB zë backup-i i plotë në formatin brotli

Krahasimi i rezultateve në grafik.

Njohja me sistemin e backup-it wal-g për PostgreSQL

Siç shohim, Brotli është në përputhje me madhësinë e LZMA, por backup-i përfundon në kohën e LZ4.

Chat i komunitetit rusishtfolës PostgreSQL: https://t.me/pgsql

Ju lutem vini një yll në Github, nëse po e përdorni. wal-g

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster