Tutvumine wal-g PostgreSQL varundussüsteemiga

WAL-G — lihtne ja tõhus tööriist PostgreSQL-i varundamiseks pilves. Oma põhifunktsionaalsuses on see tuntud tööriista järeltulija WAL-E, kuid ümber kirjutatud Go keeles. Kuid WAL-G-l on üks oluline uus omadus — delta-varundused. Delta-varundused WAL-G salvestavad faililehed, mis on muutunud varasema varunduse versiooniga võrreldes. WAL-G-s on rakendatud üsna palju tehnoloogiaid varunduste paralleelseks töötlemiseks. WAL-G töötab palju kiiremini kui WAL-E.

WAL-G tööpõhimõtteid saab lugeda artiklist: Varunduse kiirus. Yandexi loeng

S3 salvestusprotokoll on saanud populaarsuseks andmete salvestamiseks. Üks S3 eeliseid on API kaudu ligipääsu võimalus, mis võimaldab paindlikku suhtlemist salvestusse, sealhulgas avalikku lugemisõigust, samas kui andmete uuendamine salvestuses toimub ainult volitatud isikute poolt.

On olemas mitmeid nii avatud kui ka erasektori S3 protokolli põhiseid salvestuslahendusi. Täna vaatame populaarset lahendust väikeste salvestuste loomiseks — Minio.

WAL-G testimiseks sobib üks PostgreSQL server ja S3 asenduseks kasutatakse Miniot.

Minio server

Minio installimine

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

Muudame AccessKey ja SecretKey failis /etc/minio/minio.conf

vi /etc/minio/minio.conf

Kui te ei kasuta Nginx-i Minio ees, siis tuleb muuta

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Käivitame Minio

systemctl start minio

Siseneme Minio veebiliidesesse http://serveri-minio-ip-aadress:9000 ja loome baketi (näiteks pg-backups).

Andmebaasi server

WAL-G rpm paketi koostajaks olen mina (Anton Patsev). Github, Fedora COPR.

Kellel ei ole RPM-põhist süsteemi, kasutage ametlikku juhend paigaldusjuhendit.

Koos WAL-G binaarfailiga rpm-s on olemas skriptid, mis impordivad muutujaid failist /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

Installime WAL-G.

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

Kontrollime WAL-G versiooni.

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

Redigeerime /etc/wal-g.d/server-s3.conf vastavalt oma vajadustele.

Konfiguratsioonifailid ja andmebaasi klastrit kasutavad andmefailid on traditsiooniliselt salvestatud klastris andmekataloogis, mida tavaliselt nimetatakse 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 # Какой метод сжатия использовать.

WAL-G seadistamisel määrate WALG_DELTA_MAX_STEPS — maksimaalne sammude arv, mille võrra delta-varundus võib base-varundusest erineda, ja määrate delta-koopia poliitika. Kas teete koopia viimastest olemasolevatest delta-varundustest või teete delta algsest täisvarundusest. See on vajalik juhul, kui teie andmebaasis muutub pidevalt sama andmebaasi element, sama andmed pidevalt muudetakse.

Paigaldame andmebaasi.

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

Initsialiseerime andmebaasi.

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

Kui testite ühe serveri peal, tuleb seadistada parameeter wal_level väärtusele archive PostgreSQL versioonides, mis on vanemad kui 10, ja replica PostgreSQL 10 ja uuemates versioonides.

wal_level = archive

Teeme WAL arhiivide varundamise iga 60 sekundi tagant PostgreSQL-i abil. Teie tootmisversioonis on archive_timeout väärtus erinev.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Iga 60 sekundi tagant käivitatakse käsk archive_command.

Käivitame PostgreSQL-i

systemctl start postgresql-9.6

Vaadake PostgreSQL logisid eraldi konsoolis vigade osas: (postgresql-Wed.log asendage praegusega).

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

Logime psql-i sisse.

su - postgres
psql

Loome psql-is andmebaasi.

Loome tabeli andmebaasis test1.

create database test1;

Vahetame andmebaasi test.

postgres=# c test1;

Loome tabeli indexing_table.

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

Andmete lisamine.

Käivitame andmete sisestamise. Ootame 10–20 minutit.

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

Kindlasti teeme täisvarunduse.

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

Vaadake kirjeid tabelis andmebaasis 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+

Rida on praegune aeg.

Vaadake täisvarunduste loendit

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

Taastamise testimine

Täielik taastamine koos kõigi saadaolevate WAL-ide rakendamisega.

Peatame PostgreSQL-i.

Kustutame kõik failid kaustast /var/lib/pgsql/9.6/data.

Käivitame skripti /usr/local/bin/backup-fetch.sh kasutajalt postgres.

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

Varundamise väljavõtmine on lõpule viidud.

Lisame recovery.conf kausta /var/lib/pgsql/9.6/data järgmise sisuga.

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

Käivitame PostgreSQL-i. PostgreSQL käivitab taastamisprotsessi arhiivitud WAL-i kaudu ja alles siis avaneb andmebaas.

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

Taastamine kindlaksmääratud ajani.

Kui soovime taastada andmebaasi kindla minuti jooksul, lisame recovery.conf faili parameetri recovery_target_time — näitame, millise aja jaoks andmebaasi taastada.

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

Pärast taastamist vaatame üles andmeindekseerimise tabeli.

 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

Käivitame PostgreSQL-i. PostgreSQL käivitab taastamisprotsessi arhiivitud WAL-i kaudu ja alles siis avaneb andmebaas.

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

Testimine

Genereerime 1GB andmebaasi nagu siin on kirjeldatud. https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Küsi konteineri suurust pärast 1GB andmete genereerimist.

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

s4cmd — tasuta käsurea tööriist Amazon S3-s asuvate andmete haldamiseks. Tööriist on kirjutatud python programmeerimiskeeles ja seetõttu saab seda kasutada nii Windowsi kui ka Linuxi operatsioonisüsteemides.

Installeerime s4cmd.

pip install s4cmd

LZ4

s4cmd --endpoint-url=http:\/\/ip-aadress-serveri-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3:\/\/pg-backups
840540822       s3:\/\/pg-backups\/wal_005\/
840 MB lz4 formaadis ainult WAL logidest

Täielik varukoopia lz4 - 1GB andmeid
time backup_push.sh
real 0m18.582s

S3 konteineri suurus pärast täisvarukoopiat

581480085       s3:\/\/pg-backups\/basebackups_005\/
842374424   s3:\/\/pg-backups\/wal_005
581 MB võtab täielik varukoopia.

LZMA

Pärast 1GB andmete genereerimist
338413694       s3:\/\/pg-backups\/wal_005\/
338 MB logisid lzma formaadis

Täieliku varukoopia genereerimise aeg
time backup_push.sh
real    5m25.054s

Konteineri suurus S3-s
270310495       s3:\/\/pg-backups\/basebackups_005\/
433485092   s3:\/\/pg-backups\/wal_005\/

270 MB võtab täielik varukoopia lzma formaadis.

Brotli

Pärast 1GB andmete genereerimist
459229886       s3:\/\/pg-backups\/wal_005\/
459 MB logisid brotli formaadis

Täieliku varukoopia genereerimise aeg
real    0m23.408s

Konteineri suurus S3-s
312960942       s3:\/\/pg-backups\/basebackups_005\/
459309262   s3:\/\/pg-backups\/wal_005\/

312 MB võtab täielik varukoopia brotli formaadis.

Võrdlus tulemuste graafikul.

Tutvumine wal-g PostgreSQL varundussüsteemiga

Nagu näeme, et Brotli suurus on võrreldav LZMA-ga, kuid varukoopia tegemine kestab sama kaua kui LZ4.

PostgreSQL-i venekeelse kogukonna vestlus: https://t.me/pgsql

Palun pange täht Githubis, kui kasutate. wal-g

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster