— 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 , 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 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:
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 minioModifikoni AccessKey dhe SecretKey në /etc/minio/minio.conf
vi /etc/minio/minio.confNëse nuk do të përdorni nginx para Minio, duhet të ndryshoni
--address 127.0.0.1:9000--address 0.0.0.0:9000Nisni Minio
systemctl start minioHyni në ndërfaqen web të Minio dhe krijoni një bucket (p.sh., pg-backups).
Serveri DB
WAL-G në rpm e mbledh unë (Anton Patsev). , .
Për ata që nuk kanë një sistem RPM-based, përdorni informacionin e zyrtar 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.shInstaloni wal-g.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gKontrolloni versionin e wal-g.
wal-g --version
wal-g version v0.2.14Redaktoni /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 mcInicijoni DB-në.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKNë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 = archiveTë 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.6Në 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.logHyni në psql.
su - postgres
psqlKrijoni 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;
doneSigurohuni që të bëni një backup të plotë.
su - postgres
/usr/local/bin/backup-push.shShikoni 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.shTestimi 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.shNxjerrja 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.logRikuperimi 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+00Nisni 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.logTestimi
Gjenerojmë një bazë të dhënash prej 1GB siç përshkruhet këtu.
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 MBs4cmd — 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 s4cmdLZ4
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 lzmaBrotli
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.

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:
Ju lutem vini një yll në Github, nëse po e përdorni.
Burimi: habr.com
