Növekményes postgresql biztonsági mentések pgbackrest segítségével – tanfolyam egy fiatal harcosnak a fejlesztőtől

Jogi nyilatkozat

Én fejlesztő vagyok. Kódot írok és csak felhasználóként lépek kapcsolatba az adatbázissal. Semmiképpen sem teszek úgy, mintha rendszergazda lennék, még kevésbé dba. De…

Így történt, hogy meg kellett szerveznem a postgresql adatbázis biztonsági mentését. Nincsenek felhők – csak használja az SSH-t, és győződjön meg arról, hogy minden működik anélkül, hogy pénzt kérne. Mit tegyünk ilyen esetekben? Így van, benyomjuk a pgdump-ot a cronba, minden nap biztonsági mentést készítünk az archívumba, és ha teljesen elveszünk, akkor ezt az archívumot elküldjük valahova messze.

Ezúttal az jelentette a nehézséget, hogy a tervek szerint az adatbázisnak napi kb +- 100 MB-ot kellett volna növekednie. Természetesen néhány hét múlva eltűnik a vágy, hogy mindenről biztonsági másolatot készítsenek a pgdump segítségével. Itt a növekményes biztonsági mentések segítenek.

Érdekes? Üdvözöljük a macskában.

A növekményes biztonsági mentés egy olyan típusú biztonsági mentés, amikor nem minden forrásfájlt másol át, hanem csak az újakat és az előző másolat létrehozása óta módosítottakat.

Mint minden fejlesztő, aki TELJESEN nem volt hajlandó (akkoriban) megérteni a postgres fortélyait, én is meg akartam találni a zöld gombot. Nos, tudod, mint az AWS-ben, a DigitalOceanben: megnyomtál egy gombot - replikációt kaptál, megnyomtad a másodikat - biztonsági mentéseket állítottál be, a harmadikat - mindent visszatekertél pár órával. Nem találtam gombot vagy gyönyörű grafikus felületet. Ha tud ilyet (ingyenes vagy olcsó), írjon róla kommentben.

Googlázás után találtam két eszközt pgbarman и pgbackrest. Az elsővel egyszerűen nem sikerült (nagyon gyér a dokumentáció, próbáltam mindent a régi kézikönyvek szerint kitalálni), de a másodiknál ​​a dokumentáció megfelelőnek bizonyult, de nem hibamentesen. Ez a cikk a hasonló feladattal szembesülők munkájának egyszerűsítése érdekében készült.

A cikk elolvasása után megtudhatja, hogyan készíthet növekményes biztonsági mentéseket, mentheti el őket egy távoli kiszolgálóra (repository biztonsági másolatokkal), és hogyan állíthatja vissza adatvesztés vagy egyéb probléma esetén a fő szerveren.

Edzés

A kézikönyv reprodukálásához két VPS-re lesz szüksége. Az első a tárhely (az a tároló, amelyen a biztonsági másolatok lesznek tárolva), a második pedig maga a szerver a postgres-szel (esetemben a postgres 11-es verziója).

Feltételezhető, hogy a postgres szerveren van root, sudo user, postgres user és maga a postgres is telepítve van (a postgresql telepítésekor automatikusan létrejön a postgres user), a tárolószerveren pedig van root és sudo user (a kézikönyvben a pgbackrest felhasználónevet fogja használni) .

Annak érdekében, hogy kevesebb problémája legyen az utasítások reprodukálásakor, dőlt betűvel írom hol, milyen felhasználóval és milyen jogokkal hajtottam végre a parancsot a cikk írása és ellenőrzése közben.

pgbackrest telepítése

Adattár (pgbackrest felhasználó):

1. Töltse le az archívumot a pgbackrest webhelyről, és vigye át a tartalmát a /build mappába:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Szerelje fel az összeszereléshez szükséges függőségeket:

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. A pgháttámla összeszerelése:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. Másolja a végrehajtható fájlt a /usr/bin könyvtárba:

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. A Pgbackrest perl-t igényel. Telepítés:

sudo apt-get install perl

6. Hozzon létre könyvtárakat a naplókhoz, és biztosítson nekik bizonyos jogokat:

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

7. Ellenőrizze:

pgbackrest version

Postgres szerver (sudo felhasználó vagy root):

A pgbackrest telepítésének folyamata a postgres-szel rendelkező kiszolgálón hasonló a lerakaton történő telepítési folyamathoz (igen, a pgbackrest telepíteni kell mindkét kiszolgálón), de a 6. bekezdésben a második és az utolsó parancs:

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

Cseréld ki:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Szerverek közötti interakció beállítása jelszó nélküli SSH-n keresztül

A pgbackrest megfelelő működéséhez be kell állítani a postgres szerver és a tároló közötti interakciót a kulcsfájl segítségével.

Adattár (pgbackrest felhasználó):

Hozzon létre egy kulcspárt:

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Figyelem! A fenti parancsokat sudo nélkül futtatjuk.

Postgres szerver (sudo felhasználó vagy root):

Hozzon létre egy kulcspárt:

sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Adattár (sudo felhasználó):

Másolja a postgres szerver nyilvános kulcsát a tárolókiszolgálóra:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Ebben a lépésben a rendszer kérni fogja a root felhasználó jelszavát. Meg kell adnia a postgres szerver root felhasználójának jelszavát!

Postgres szerver (sudo felhasználó):

Másolja a tároló nyilvános kulcsát a szerverre a postgres segítségével:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

Ebben a lépésben a rendszer kérni fogja a root felhasználó jelszavát. Pontosan a repository root felhasználójának jelszavát kell megadni!

Ellenőrizzük:

Repository (root felhasználó, a kísérlet tisztasága érdekében):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres szerver (root felhasználó, a kísérlet tisztasága érdekében):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Gondoskodunk arról, hogy problémamentesen hozzáférjünk.

Postgres szerver beállítása

Postgres szerver (sudo felhasználó vagy root):

1. Engedjük meg a postgres szerver kopogtatását külső IP-kről. Ehhez szerkessze a fájlt postgresql.conf (az /etc/postgresql/11/main mappában található), hozzáadva a következő sort:

listen_addresses = '*'

Ha már létezik ilyen sor, törölje a megjegyzést, vagy állítsa be a paraméter értékét '*'-ra.

Fájlban pg_hba.conf (szintén a mappában található /etc/postgresql/11/main) egészítse ki a következő sorokkal:

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

ahol:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Végezzük el a szükséges beállításokat postgresql.conf (a mappában van /etc/postgresql/11/main) a pgbackrest működéséhez:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Végezzük el a szükséges beállításokat a pgbackrest konfigurációs fájlban (/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Postgresql újratöltése:

sudo service postgresql restart

Tárolószerver beállítása

Adattár (pgbackrest felhasználó):

Végezzük el a szükséges beállításokat a konfigurációs fájlban pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Adattár létrehozása

Adattár (pgbackrest felhasználó):

Hozzon létre egy új tárhelyet a fürt számára fő-:

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Проверка

Postgres szerver (sudo felhasználó vagy root):

Ellenőrizzük a postgres szerveren:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Adattár (pgbackrest felhasználó):

Ellenőrizzük a tárolókiszolgálón:

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

Gondoskodunk arról, hogy a kimenetben a „check command end: complete sikeres” sort látjuk.

Fáradt? Térjünk át a legérdekesebb részre.

Biztonsági mentés készítése

Adattár (pgbackrest felhasználó):

1. Készítsen biztonsági mentést:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Győződjön meg arról, hogy készült biztonsági másolat:

ls /var/lib/pgbackrest/backup/main/

A Pgbackrest létrehozza az első teljes biztonsági másolatot. Ha kívánja, újra futtathatja a backup parancsot, és győződjön meg arról, hogy a rendszer növekményes biztonsági mentést hoz létre.

Ha ismét teljes biztonsági másolatot szeretne készíteni, adjon meg egy további jelzőt:

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

Ha részletes konzolkimenetet szeretne, adja meg a következőket is:

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

Biztonsági másolat visszaállítása

Postgres szerver (sudo felhasználó vagy root):

1. Állítsa le a futó fürtöt:

sudo pg_ctlcluster 11 main stop

2. Visszaállítás biztonsági másolatból:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Az adatbázis visszaállításához az utolsó TELJES biztonsági mentés állapotára használja a parancsot a recovery_target megadása nélkül:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore

Fontos! A helyreállítás után előfordulhat, hogy az adatbázis elakad a helyreállítási módban (olyan hibák lesznek, mint HIBA: nem tudja végrehajtani a DROP DATABASE-t egy csak olvasható tranzakcióban). Hogy őszinte legyek, még nem értettem, hogy ez mihez kapcsolódik. A megoldás a következő (a parancs végrehajtása után várnia kell egy kicsit):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

Valójában lehetséges egy adott biztonsági másolat visszaállítása a neve alapján. Itt csak én vagyok Ennek a funkciónak a leírásához a dokumentációban adok egy hivatkozást. A fejlesztők azt tanácsolják, hogy óvatosan használja ezt a lehetőséget, és indokolja meg, hogy miért. Hozzátehetem magamtól, hogy használtam. Ha valóban szüksége van rá, győződjön meg arról, hogy a helyreállítás után az adatbázis kilép a helyreállítási módból (a pg_is_in_recovery()-nek "f"-et kell mutatnia), és minden esetben készítsen teljes biztonsági másolatot a helyreállítás után.

3. Indítsa el a fürtöt:

sudo pg_ctlcluster 11 main start

A biztonsági mentés visszaállítása után egy második biztonsági mentést kell végrehajtanunk:

Adattár (pgbackrest felhasználó):

sudo pgbackrest --stanza=main backup

Ez minden. Végezetül szeretném emlékeztetni, hogy semmiképpen sem próbálom úgy tenni, mintha idősebb dba lennék, és a legkisebb adandó alkalommal használni fogom a felhőket. Jelenleg magam is elkezdek különféle témákat tanulmányozni, mint például a biztonsági mentés, replikáció, megfigyelés stb. és kis beszámolókat írok az eredményekről, hogy kicsit hozzájáruljak a közösséghez, és kis csalólapokat hagyjak magamnak.

A következő cikkekben megpróbálok további funkciókról beszélni - adat-helyreállítás tiszta fürtbe, biztonsági mentések titkosítása és közzététele S3-ba, biztonsági mentések rsync-en keresztül.

Forrás: will.com

Hozzászólás