IepazīŔanās ar wal-g PostgreSQL dublēŔanas sistēmu

WAL-G — vienkārÅ”s un efektÄ«vs rÄ«ks PostgreSQL dublēŔanai mākoņos. Ņemot vērā savu galveno funkcionalitāti, tas ir populārā rÄ«ka mantinieks WAL-E, taču pārprogrammēts Go valodā. Taču WAL-G ir viena svarÄ«ga jauna iezÄ«me — deltas dublējumi. Deltas dublējumi WAL-G glabā failu lapas, kas ir mainÄ«juŔās kopÅ” iepriekŔējā dublējuma versijas. WAL-G Ä«steno diezgan daudz tehnoloÄ£iju dublējumu paralelizēŔanai. WAL-G darbojas daudz ātrāk nekā WAL-E.

SÄ«kāka informācija par wal-g darbÄ«bu ir pieejama rakstā: DublēŔanas paātrināŔana. Yandex lekcija

S3 uzglabāŔanas protokols ir kļuvis populārs datu glabāŔanai. Viens no S3 priekÅ”rocÄ«bām ir piekļuves iespējas caur API, kas ļauj organizēt elastÄ«gu mijiedarbÄ«bu ar uzglabāŔanu, tostarp publisko piekļuvi lasīŔanai, kamēr informācijas atjaunināŔana uzglabāŔanā notiek tikai autorizētām personām.

Pastāv vairākas atvērtas un privātas uzglabāŔanas Ä«stenojumi, kas darbojas pēc S3 protokola. Å odien mēs aplÅ«kosim populāru risinājumu nelielu uzglabāŔanas sistēmu izveidei — Minio.

Wal-g testēŔanai bÅ«s pietiekams viens PostgreSQL serveris, un kā S3 aizvietotājs tiks izmantots Minio.

Minio servers

Minio instalēŔana

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

Pārveidojam AccessKey un SecretKey failā /etc/minio/minio.conf

vi /etc/minio/minio.conf

Ja neizmantojat nginx pirms Minio, jāizmaina

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Palaižam Minio

systemctl start minio

Ieejam Minio tīmekļa saskarnē http://ip-adrese-servera-minio:9000 un izveidojam grozu (piemēram, pg-backups).

Datu bāzes serveris

WAL-G rpm formātā es apkopoju es (Antons Pacevs). Github, Fedora COPR.

Ja jums nav RPM bāzes sistēmas, izmantojiet oficiālo instrukciju instalēŔanas dokumentāciju.

Kopā ar wal-g bināro failu rpm ir iekļauti skripti, kas importē mainīgos no faila /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

Uzstādam wal-g.

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

Pārbaudām wal-g versiju.

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

Rediģējam /etc/wal-g.d/server-s3.conf pēc savu vajadzību.

Konfigurācijas faili un datu faili, ko izmanto datu bāzes klasteris, tradicionāli tiek glabāti kopā klastera datu katalogā, ko parasti sauc 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 # Какой метоГ ŃŠ¶Š°Ń‚ŠøŃ ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ.

Konfigurējot WAL-G, jÅ«s norādāt WALG_DELTA_MAX_STEPS — maksimalo posmu skaitu, par kuru dēļ dēlta rezerves kopija ir attālināta no bāzes rezerves kopijas, un norādāt dēlta kopiju politiku. JÅ«s varat veikt kopiju no pēdējās esoŔās dēlta, vai veikt dēlta no sākotnējā pilnā rezerves kopijas. Tas ir nepiecieÅ”ams gadÄ«jumam, kad jÅ«su datubāzē pastāvÄ«gi mainās viena un tā pati datubāzes sastāvdaļa, un tie paÅ”i dati nemitÄ«gi tiek mainÄ«ti.

Uzstādam datubāzi.

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

Inicializējam datubāzi.

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

Ja testējat uz viena servera, jums jāmaina parametra wal_level uz archive PostgreSQL, kas ir mazāks par 10 versiju, un uz replica, ja PostgreSQL ir 10 versija vai vecāka.

wal_level = archive

Izveidosim WAL arhÄ«vu dēlta rezerves kopijas ik pēc 60 sekundēm, izmantojot paÅ”u PostgreSQL. JÅ«su produkcijā bÅ«s cita vērtÄ«ba archive_timeout.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Komanda archive_command tiks izpildīta ik pēc 60 sekundēm.

Sākam PostgreSQL

systemctl start postgresql-9.6

AtseviŔķā konsolē skatām PostgreSQL žurnālus par kļūdām: (postgresql-Wed.log mainiet uz aktuālo).

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

Ieejam psql.

su - postgres
psql

psql izveidojam datubāzi.

Izveidojam tabulu datubāzē test1.

create database test1;

Pārslēdzamies uz datubāzi test.

postgres=# c test1;

Izveidojam tabulu indexing_table.

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

Datu pievienoŔana.

Sākam datu ielādes procesu. Gaida 10-20 minūtes.

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

Obligāti veiciet pilnīgu rezerves kopiju.

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

Skatām ierakstus tabulā datubāzē 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+

Rindkopa ir paÅ”reizējais laiks.

Skatām pilno rezerves kopiju sarakstu

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

AtjaunoÅ”anas testēŔana

Pilnīga atjaunoŔana, izmantojot visus pieejamos WAL.

Apturam PostgreSQL.

Izmērdējam visu no mapes /var/lib/pgsql/9.6/data.

Palaižam skriptu /usr/local/bin/backup-fetch.sh no lietotāja postgres.

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

Rezerves kopijas izguve ir pabeigta.

Pievienojam recovery.conf mapi /var/lib/pgsql/9.6/data ar sekojoŔo saturu.

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

Palaižam PostgreSQL. PostgreSQL uzsāks atjaunoÅ”anas procesu no arhÄ«va WAL, un tikai pēc tam datubāze tiks atvērta.

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

AtjaunoŔana uz noteiktu laiku.

Ja vēlamies atjaunot datubāzi lÄ«dz noteiktai minÅ«tei, tad recovery.conf pievienojam parametru recovery_target_time — norādām, uz kuru laiku atjaunot datubāzi.

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

Pēc atjaunoÅ”anas apskatām tabulu 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

Palaižam PostgreSQL. PostgreSQL uzsāks atjaunoÅ”anas procesu no arhÄ«va WAL, un tikai pēc tam datubāze tiks atvērta.

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

TestēŔana

Ä¢enerējam 1GB datubāzi, kā aprakstÄ«ts Å”eit. https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Pieprasām bačka izmēru pēc 1GB datu Ä£enerēŔanas.

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

s4cmd — bezmaksas komandu rÄ«ks darbam ar datiem, kas atrodas Amazon S3 krātuvē. LietderÄ«ba ir uzrakstÄ«ta Python programmēŔanas valodā, un tādēļ var tikt izmantota gan Windows, gan Linux operētājsistēmās.

Uzstādam s4cmd.

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-adrese-servera-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 MB lz4 formātā tikai WAL žurnāliem

Pilns dublējums ar lz4 - 1GB datu
time backup_push.sh
real 0m18.582s

S3 bačka izmērs pēc pilna dublējuma

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 MB aizņem pilns dublējums.

LZMA

Pēc 1GB datu Ä£enerēŔanas
338413694       s3://pg-backups/wal_005/
338 MB žurnālu lzma formātā

Pilna dublējuma Ä£enerēŔanas laiks
time backup_push.sh
real    5m25.054s

S3 bačka izmērs
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 MB aizņem pilns dublējums lzma formātā.

Brotli

Pēc 1GB datu Ä£enerēŔanas
459229886       s3://pg-backups/wal_005/
459 MB žurnālu brotli formātā

Pilna dublējuma Ä£enerēŔanas laiks
real    0m23.408s

S3 bačka izmērs
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 MB aizņem pilns dublējums brotli formātā.

Salīdzinājums rezultātiem diagrammā.

IepazīŔanās ar wal-g PostgreSQL dublēŔanas sistēmu

Kā redzam, Brotli izmērs ir salīdzināms ar LZMA, bet dublējums tiek veikts laika ietvaros LZ4.

Krievu valodas PostgreSQL kopienas čats: https://t.me/pgsql

Lūdzu, novietojiet zvaigzni Github, ja izmantojat. wal-g

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster