Ismerkedés a wal-g PostgreSQL biztonsági mentési rendszerével

WAL-G — egyszerű és hatékony eszköz PostgreSQL biztonsági mentések készítésére felhőben. Alapfunkcionalitása alapján a népszerű WAL-E, de Go nyelvre átírt változata. Az WAL-G-ban van egy fontos új funkció — delta másolatok. A delta másolatok WAL-G megőrzik a fájlok azon lapjait, amelyek a legutóbbi biztonsági mentés óta megváltoztak. Az WAL-G rengeteg párhuzamosítási technológiát alkalmaz a biztonsági mentések során. Az WAL-G sokkal gyorsabban működik, mint az WAL-E.

A wal-g működéséről részletesebben olvashat a következő cikkben: A biztonsági mentés gyorsítása. Yandex előadás

Az S3 tárolási protokoll népszerűvé vált az adatok tárolásában. Az S3 egyik előnye az API-n keresztüli hozzáférés lehetősége, ami rugalmas interakciót tesz lehetővé a tárolóban, beleértve a nyilvános olvasáshoz való hozzáférést, miközben az információ frissítése csak jogosult személyek által történik.

Több nyílt és privát megvalósítása létezik az S3 protokollt használó tárolóknak. Ma egy népszerű megoldást vizsgálunk kis tárolók létrehozására — a Minio-t.

A wal-g teszteléséhez elegendő egy PostgreSQL szerver, míg az S3 helyettesítésére a Minio-t használjuk.

Minio szerver

Minio telepítése

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

Módosítjuk az AccessKey-t és a SecretKey-t az /etc/minio/minio.conf fájlban

vi /etc/minio/minio.conf

Ha nem használ nginx-et a Minio előtt, módosítani kell

--address 127.0.0.1:9000

--address 0.0.0.0:9000

Elindítjuk a Minio-t

systemctl start minio

Belépünk a Minio webes felületére http://ip-cím-minio-szerver:9000 és létrehozunk egy tárolót (például pg-backups).

Adatbázis szerver

A WAL-G-t rpm-ben én (Anton Patsev) gyűjtöm. Githubot, Fedora COPR.

Akinek nem RPM-alapú rendszere van, használja a hivatalos telepítési utasítást.

A wal-g binárisával együtt az rpm-ben olyan szkriptek találhatók, amelyek változókat importálnak az /etc/wal-g.d/server-s3.conf fájlból.

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

Telepítjük a wal-g-t.

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

Ellenőrizzük a wal-g verzióját.

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

Módosítjuk az /etc/wal-g.d/server-s3.conf fájlt a lehetőségeink szerint.

A konfigurációs fájlokat és az adatbázis klaszter által használt adatfájlokat hagyományosan együttesen tárolják a klaszter adatkönyvtárában, amelyet általában 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 # Какой метод сжатия использовать.

A WAL-G beállításakor megadja a WALG_DELTA_MAX_STEPS értéket, amely a base-bakaptól maximálisan eltérő delta-bakup lépések számát jelöli, és meghatároz egy delta-kopírozási politikát. Vagy a legutóbbi meglévő delta-ból készít másolatot, vagy az eredeti teljes backupból készít deltát. Ezt arra az esetre kell, amikor az adatbázisában folyamatosan azonos adatokat módosítanak.

Adatbázis telepítése.

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

Adatbázis inicializálása.

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

Ha egy szerveren tesztel, a wal_level paramétert archive értékre kell állítania PostgreSQL 10 előtti verzióknál, és replica értékre a PostgreSQL 10 és újabb verzióknál.

wal_level = archive

60 másodpercenként készítünk WAL archívumok biztonsági mentését a PostgreSQL segítségével. A termelési környezetben más archive_timeout értéket kell beállítania.

archive_mode = on
archive_command = '/usr/local/bin/wal-push.sh %p'
archive_timeout = 60 # Minden 60 másodpercben végrehajtódik az archive_command.

PostgreSQL indítása

systemctl start postgresql-9.6

Egy külön konzolban nézze meg a PostgreSQL logokat hibák kereséséhez: (a postgresql-Wed.log fájlt cserélje ki a jelenlegire).

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

Belépés a psql-be.

su - postgres
psql

Adatbázis létrehozása psql-ben.

Tábla létrehozása a test1 adatbázisban.

create database test1;

Átváltás a test adatbázisra.

postgres=# c test1;

indexing_table tábla létrehozása.

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

Adatok hozzáadása.

Az adatok beszúrásának elindítása. Várjon 10-20 percet.

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

Mindig készítsen teljes biztonsági mentést.

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

Records megtekintése a test1 adatbázisban lévő táblában.

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+

A sor az aktuális időt jelzi.

Teljes biztonsági mentések listájának megtekintése.

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

Visszaállítás tesztelése.

Teljes visszaállítás az elérhető WAL-ok újraalkotásával.

A PostgreSQL leállítása.

Mindent törölni a /var/lib/pgsql/9.6/data mappából.

A /usr/local/bin/backup-fetch.sh script indítása postgres felhasználóként.

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

A biztonsági mentés kinyerése befejeződött.

A recovery.conf fájl hozzáadása a /var/lib/pgsql/9.6/data mappába a következő tartalommal.

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

A PostgreSQL indítása. A PostgreSQL az archív WAL-ból fogja végrehajtani a visszaállítást, és csak utána nyílik meg az adatbázis.

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

Visszaállítás meghatározott időre.

Ha vissza akarjuk állítani az adatbázist egy adott percre, akkor a recovery.conf fájlba hozzá kell adnunk a recovery_target_time paramétert — megadjuk, hogy mikorra állítsuk vissza az adatbázist.

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

A helyreállítás után nézzük meg az indexing_table táblát.

 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

A PostgreSQL indítása. A PostgreSQL az archív WAL-ból fogja végrehajtani a visszaállítást, és csak utána nyílik meg az adatbázis.

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

Tesztelés

Generáljunk egy 1GB-os adatbázist, ahogy itt le van írva. https://gist.github.com/ololobus/5b25c432f208d7eb31051a5f238dffff

Kérjük le a bucket méretét az 1GB adatok generálása után.

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

s4cmd — ingyenes parancssori eszköz az Amazon S3 tárolóban lévő adatokkal való munkához. A segédprogram Python nyelven íródott, ezért mind Windows, mind Linux operációs rendszerekben használható.

Telepítsük az s4cmd-t.

pip install s4cmd

LZ4

s4cmd --endpoint-url=http://ip-cím-szerver-minio:9000 --access-key=xxxx --secret-key=yyyy du -r s3://pg-backups
840540822       s3://pg-backups/wal_005/
840 MB lz4 formátumban csak a WAL naplókhoz.

Teljes mentés lz4 - 1GB adatokra
time backup_push.sh
real 0m18.582s

Az S3 bucket mérete a teljes mentés után

581480085       s3://pg-backups/basebackups_005/
842374424   s3://pg-backups/wal_005
581 MB-ot foglal el a teljes mentés.

LZMA

Az 1GB adatok generálása után
338413694       s3://pg-backups/wal_005/
338 MB naplók lzma formátumban.

A teljes mentés generálásának ideje
time backup_push.sh
real    5m25.054s

A bucket mérete az S3-ban
270310495       s3://pg-backups/basebackups_005/
433485092   s3://pg-backups/wal_005/

270 MB-ot foglal el a teljes mentés lzma formátumban.

Brotli

Az 1GB adatok generálása után
459229886       s3://pg-backups/wal_005/
459 MB naplók brotli formátumban.

A teljes mentés generálásának ideje
real    0m23.408s

A bucket mérete az S3-ban
312960942       s3://pg-backups/basebackups_005/
459309262   s3://pg-backups/wal_005/

312 MB-ot foglal el a teljes mentés brotli formátumban.

Összehasonlítás a grafikonon.

Ismerkedés a wal-g PostgreSQL biztonsági mentési rendszerével

Ahogy látjuk, a Brotli méretileg összehasonlítható az LZMA-val, de a mentés a LZ4 idejével végződik.

PostgreSQL orosz nyelvű közösségi chat: https://t.me/pgsql

Kérjük, adj egy csillagot a Github-on, ha használod. wal-g

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster