— 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ű , de Go nyelvre átírt változata. Az WAL-G-ban van egy fontos új funkció — delta másolatok. A delta másolatok 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:
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 minioMódosítjuk az AccessKey-t és a SecretKey-t az /etc/minio/minio.conf fájlban
vi /etc/minio/minio.confHa nem használ nginx-et a Minio előtt, módosítani kell
--address 127.0.0.1:9000--address 0.0.0.0:9000Elindítjuk a Minio-t
systemctl start minioBelépünk a Minio webes felületére é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. , .
Akinek nem RPM-alapú rendszere van, használja a hivatalos 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.shTelepítjük a wal-g-t.
yum -y install yum-plugin-copr
yum copr enable -y antonpatsev/wal-g
yum install -y wal-gEllenőrizzük a wal-g verzióját.
wal-g --version
wal-g version v0.2.14Mó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 mcAdatbázis inicializálása.
/usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OKHa 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 = archive60 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.6Egy 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.logBelépés a psql-be.
su - postgres
psqlAdatbá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;
doneMindig készítsen teljes biztonsági mentést.
su - postgres
/usr/local/bin/backup-push.shRecords 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.shVisszaá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.shA 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.logVisszaá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+00A 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.logTesztelés
Generáljunk egy 1GB-os adatbázist, ahogy itt le van írva.
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 MBs4cmd — 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 s4cmdLZ4
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.

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:
Kérjük, adj egy csillagot a Github-on, ha használod.
Forrás: habr.com
