Njoftimi mbi sistemin e backup-it WAL-G për PostgreSQL

WAL-G — një mjet i thjeshtë dhe efektiv për rezervimin e PostgreSQL në re. Në funksionin e tij kryesor, ai është pasardhës i mjetit të njohur WAL-E, por i shkruar në Go. Por në WAL-G ka një veçori të re të rëndësishme — kopjet delta. Kopjet delta WAL-G ruajnë faqet e skedarëve që kanë ndryshuar nga versioni i mëparshëm i rezervimit. Në WAL-G janë implementuar shumë teknologji për paralelizimin e rezervimeve. WAL-G funksionon shumë më shpejt se WAL-E.

Detajet mbi funksionimin e wal-g mund të lexohen në artikullin: Shtyrja e backup-it. Ligjërata e Yandex

Protokolli 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ë, që lejon organizimin e një ndërveprimi fleksibël me ruajtjen, duke përfshirë aksesin publik për lexim, ndërkohë që përditësimi i informacionit në ruajtje ndodh vetëm nga persona të autorizuar.

Ekzistojnë disa implementime të hapura dhe private të ruajtjeve që funksionojnë sipas protokollit S3. Sot do të shqyrtojmë një zgjidhje të njohur për organizimin e ruajtjeve të vogla — Minio.

Për testimin e wal-g, mjafton një server PostgreSQL, dhe për zëvendësim të S3 përdoret Minio.

Serveri Minio

Instalimi i Minio

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

Rregullojmë 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

Nisim Minio

systemctl start minio

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

Serveri i DB-së

WAL-G e mbledh unë (Anton Pacëv). Github, Fedora COPR.

Ata që nuk kanë sistem RPM-based përdorin udhëzimet zyrtare udhëzime për instalimin.

Së bashku me binarët wal-g në rpm, janë skenarë që 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

Instalojmë wal-g.

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

Kontrollojmë versionin e wal-g.

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

Rregullojmë /etc/wal-g.d/server-s3.conf sipas nevojave tona.

Skedaret e konfigurimit dhe skedaret e të dhënave, të përdorura nga klustëri i bazës së të dhënave, zakonisht ruhen së bashku në katalogun e të dhënave të klustrit, 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 konfiguroni WAL-G, ju përcaktoni WALG_DELTA_MAX_STEPS — numri i hapave që maksimalisht pranon dërgimi nga backup-in bazë, dhe përcaktoni politikën e kopjimit të dërgimit. Ose bëni një kopje nga dërgimi më i fundit ekzistues, ose bëni dërgimin nga backup-i i plotë fillestar. Kjo është e nevojshme për rastin kur në databazën tuaj vazhdimisht ndryshon një e njëjta përbërje e DB, të njëjtat të dhëna vazhdimisht ndryshojnë.

Instaloni DB.

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

Inicjalizoni DB.

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

Nëse po testoni në 1 server, nuk keni nevojë të rikonfiguroni parametrin wal_level në archive për PostgreSQL më të vogla se versioni 10, dhe replica për PostgreSQL 10 dhe më të vjetër.

wal_level = archive

Ne do të bëjmë backup të arkivave WAL çdo 60 sekonda me ndihmën e PostgreSQL-it. 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ë kryhet çdo 60 sekonda.

Nisni PostgreSQL

systemctl start postgresql-9.6

Në një konsolë të veçantë shikoni log-et e PostgreSQL-it 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

Në psql krijojmë një Baza të Dhënash.

Krijojmë një tabelë në bazo për test1.

create database test1;

Kalojmë në bazën e të dhënave test.

postgres=# c test1;

Krijojmë tabelën indexing_table.

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

Shtimi i të dhënave.

Nisim të vendosim të dhënat. 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

Shikojmë regjistrimet në tabelën në bazën e dhënave 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.

Shikojmë listën e backup-eve të plota

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

Testimi i rikuperimit

Rikuperim i plotë duke aplikuar të gjithë WAL-të e disponueshëm.

Ndërpremë Postgresql.

Fshijmë gjithçka nga dosja /var/lib/pgsql/9.6/data.

Nisim skenarin /usr/local/bin/backup-fetch.sh nga përdoruesi postgres.

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

Shkëputja e backup-it përfundoi.

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

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

Nisim PostgreSQL. PostgreSQL do të aktivizojë procesin e rikuperimit nga WAL të arkivuar, dhe vetëm pastaj baza do të hapet.

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

Rikuperim në një kohë të caktuar.

Nëse duam të rikthejmë bazën deri në një minutë të caktuar, në recovery.conf shtojmë parametrin recovery_target_time — specifikojmë për cilin kohë 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, kontrollojmë 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

Nisim PostgreSQL. PostgreSQL do të aktivizojë procesin e rikuperimit nga WAL të arkivuar, dhe vetëm pastaj baza do të hapet.

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

Testimi

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

Kërkojmë madhësinë e bucket-it pas gjenerimit të 1GB të dhënash.

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

s4cmd — është një mjet falas i linjës së komandave për të punuar me të dhëna të vendosura në magazinën Amazon S3. Utiliteti është shkruar në gjuhën e programimit python, dhe për këtë arsye mund të përdoret në sistemet operative si Windows dhe Linux.

Instalojmë s4cmd

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-ëaddress-i-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 regjistrat WAL

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

Madhësia e bucket-it S3 pas backup-it të plotë

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

LZMA

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

Koha e gjenerimit të kopjes së plotë
real    5m25.054s

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

270 mb zë kopjen e plotë në formatin lzma

Brotli

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

Koha e gjenerimit të kopjes së plotë
real    0m23.408s

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

312 mb zë kopjen e plotë në formatin brotli

Krahasimi i rezultateve në grafik.

Njoftimi mbi sistemin e backup-it WAL-G për PostgreSQL

Siç shohim, Brotli është në përmasë të ngjashme me LZMA, por backup-i realizohet në kohën e LZ4.

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

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

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster