Úvod do zálohovacieho systému wal-g PostgreSQL

WAL-G je jednoduchý a efektívny nástroj na zálohovanie PostgreSQL do cloudu. Z hľadiska svojej hlavnej funkčnosti je dedičom obľúbeného nástroja WAL-E, ale prepísané v Go. Ale je tu jedna dôležitá novinka vo WAL-G – delta kópie. delta kópie WAL-G ukladať stránky súborov, ktoré sa od predchádzajúcej verzie zálohy zmenili. WAL-G implementuje pomerne veľa technológií na paralelizáciu záloh. WAL-G je oveľa rýchlejší ako WAL-E.

Podrobnosti o tom, ako wal-g funguje, nájdete v článku: Pretaktujeme zálohu. Prednáška Yandex

Úložný protokol S3 sa stal populárnym na ukladanie údajov. Jednou z výhod S3 je možnosť prístupu cez API, čo umožňuje organizovať flexibilnú interakciu s úložiskom vrátane verejného prístupu na čítanie, pričom aktualizácia informácií v úložisku prebieha len oprávnenými osobami.

Existuje niekoľko implementácií verejného a súkromného úložiska, ktoré používajú protokol S3. Dnes sa pozrieme na obľúbené riešenie na organizáciu malého úložného priestoru – Minio.

Jediný PostgreSQL server je vhodný na testovanie wal-g a Minio sa používa ako náhrada za S3.

Minio server

Inštalácia Minio

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

Upravte AccessKey a SecretKey v /etc/minio/minio.conf

vi /etc/minio/minio.conf

Ak nebudete používať nginx pred Minio, musíte to zmeniť

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Spustenie Minio

systemctl start minio

Prejdite do webového rozhrania Minio http://ip-адрес-сервера-minio:9000 a vytvorte vedro (napríklad pg-backups).

DB server

WAL-G v otáčkach montujem ja (Anton Patsev). GitHub, Fedora COPR.

Kto nemá systém založený na RPM, použite oficiálny poučenie inštaláciou.

Spolu s binárnym súborom wal-g obsahuje rpm skripty, ktoré importujú premenné zo súboru /etc/wal-gd/server-s3.conf.

backup-fetch.sh
backup-list.sh
backup-push.sh
wal-fetch.sh
wal-g-run.sh
wal-push.sh

Nainštalujte walg.

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

Kontrola verzie wal-g.

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

Upravte súbor /etc/wal-gd/server-s3.conf podľa svojich potrieb.

Konfiguračné súbory a dátové súbory používané databázovým klastrom sú tradične uložené spolu v dátovom adresári klastra, ktorý sa bežne označuje ako 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 # Какой метод сжатия использовать.

Pri konfigurácii WAL-G zadáte WALG_DELTA_MAX_STEPS - počet krokov, o ktoré je delta záloha maximálny zo základnej zálohy, a špecifikujete politiku delta kopírovania. Buď vytvoríte kópiu z poslednej existujúcej delty, alebo vytvoríte deltu z pôvodnej úplnej zálohy. Je to potrebné v prípade, keď sa vo vašej databáze stále mení ten istý komponent databázy, stále sa menia tie isté údaje.

Inštalácia databázy.

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

Inicializujeme databázu.

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

Ak testujete na 1 serveri, musíte prekonfigurovať parameter wal_level na archiváciu pre PostgreSQL menšiu ako verziu 10 a repliku pre PostgreSQL verziu 10 a staršiu.

wal_level = archive

Zálohujme archívy WAL každých 60 sekúnd pomocou samotného PostgreSQL. Na prod budete mať inú hodnotu archive_timeout.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Каждые 60 секунд будет выполнятся команда archive_command.

Spustenie PostgreSQL

systemctl start postgresql-9.6

V samostatnej konzole sa pozrieme na chyby v protokoloch PostgreSQL: (zmeniť postgresql-Wed.log na aktuálny).

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

Poďme na psql.

su - postgres
psql

Vytvorte databázu v psql

Vytvorte tabuľku v databáze test1.

create database test1;

Prejdite na test databázy.

postgres=# c test1;

Vytvoríme tabuľku indexing_table.

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

Pridávanie údajov.

Začneme vkladať údaje. Čakáme 10-20 minút.

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

Uistite sa, že ste urobili úplnú zálohu.

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

Pozeráme sa na záznamy v tabuľke v databáze 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+

Reťazec je aktuálny čas.

Pozrite si zoznam úplných záloh

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

Testovanie obnovy

Úplné obnovenie s rolovaním všetkých dostupných WAL.

Zastavte Postgresql.

Vymažte všetko z priečinka /var/lib/pgsql/9.6/data.

Spustite skript /usr/local/bin/backup-fetch.sh ako používateľ postgres.

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

Extrakcia zálohy je dokončená.

Pridajte recovery.conf do priečinka /var/lib/pgsql/9.6/data s nasledujúcim obsahom.

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

Spustíme PostgreSQL. PostgreSQL spustí proces obnovy z archivovaných WAL a až potom sa otvorí databáza.

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

Zotavenie na určitý čas.

Ak chceme obnoviť databázu do určitej minúty, tak do recovery.conf pridáme parameter recovery_target_time - udávame, kedy obnoviť databázu.

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

Po obnovení sa pozrite na tabuľku 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

Spustíme PostgreSQL. PostgreSQL spustí proces obnovy z archivovaných WAL a až potom sa otvorí databáza.

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

Testovanie

Generovanie 1GB databázy, ako je tu popísané https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Po vygenerovaní 1 GB údajov sa požaduje veľkosť segmentu.

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

s4cmd je bezplatný nástroj príkazového riadka na prácu s údajmi uloženými v úložisku Amazon S3. Pomôcka je napísaná v programovacom jazyku python a vďaka tomu môže byť použitá v operačných systémoch Windows aj Linux.

Inštalácia s4cmd

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-адрес-сервера-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 МБ в формате lz4 только WAL логов

Полный бекап с lz4 - 1GB данных
time backup_push.sh
real 0m18.582s

Размер S3 бакета после полного бекапа

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 МБ занимает полный бекап

LZMA

После генерации 1ГБ данных
338413694       s3://pg-backups/wal_005/
338 мб логов в формате lzma

Время генерации полного бекапа
time backup_push.sh
real    5m25.054s

Размер бакета в S3
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 мб занимает полный бекап в формате lzma

Brotli

После генерации 1ГБ данных
459229886       s3://pg-backups/wal_005/
459 мб логов в формате brotli

Время генерации полного бекапа
real    0m23.408s

Размер бакета в S3
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 мб занимает полный бекап в формате brotli

Porovnanie výsledkov na grafe.

Úvod do zálohovacieho systému wal-g PostgreSQL

Ako vidíte, Brotli je veľkosťou porovnateľný s LZMA, ale záloha sa vykonáva v čase LZ4.

Chat rusky hovoriacej komunity PostgreSQL: https://t.me/pgsql

Ak používate, dajte Github hviezdičku wal-g

Zdroj: hab.com

Pridať komentár