— 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 , por i shkruar në Go. Por në WAL-G ka një veçori të re të rëndësishme — kopjet delta. Kopjet delta 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:
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 minioRregullojmë 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:9000Nisim Minio
systemctl start minioHyr në ndërfaqen web të Minio dhe krijojmë një baktë (p.sh., pg-backups).
Serveri i DB-së
WAL-G e mbledh unë (Anton Pacëv). , .
Ata që nuk kanë sistem RPM-based përdorin udhëzimet zyrtare 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.shInstalojmë wal-g.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gKontrollojmë versionin e wal-g.
wal-g --version
wal-g version v0.2.14Rregullojmë /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 mcInicjalizoni DB.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKNë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 = archiveNe 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.6Në 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.logHyni në psql.
su - postgres
psqlNë 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;
doneSigurohuni që të bëni një backup të plotë.
su - postgres
/usr/local/bin/backup-push.shShikojmë 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.shTestimi 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.shShkë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.logRikuperim 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+00Nisim 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.logTestimi
Gjejmë një bazë të dhënash prej 1GB siç përshkruhet këtu
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 MBs4cmd — ë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 s4cmdLZ4
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 lzmaBrotli
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.

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