Inkrementális PostgreSQL biztonsági mentések a pgbackrest segítségével — a kezdő harcos tanfolyama a fejlesztőtől

Megjegyzés

Fejlesztő vagyok. Kódot írok, és az adatbázissal csak felhasználóként lépek kapcsolatba. Semmiképpen sem kívánok rendszergazda vagy éppen dba pozíciót betölteni. De...

Úgy alakult, hogy meg kellett szerveznem a PostgreSQL adatbázis biztonsági mentését. Semmiféle felhő — SSH, és megoldani, hogy minden működjön, és ne kérjen pénzt. Mit teszünk ilyen esetekben? Helyes, a pgdumpot bedobjuk a cronba, naponta mentünk mindent archívumba, és ha teljesen szétesett a dolog — elküldjük ezt az archívumot valahová messzire.

Ez alkalommal a nehézség abban állt, hogy a tervek szerint az adatbázis körülbelül 100 MB-tal nőtt naponta. Nyilvánvaló, hogy már pár hét elteltével nem lesz kedvünk mindent pgdump-tal menteni. Itt jönnek a segítségünkre a inkrementális mentések.

Érdekes? Üdvözlünk a folytatásban.

Az inkrementális mentés egyfajta biztonsági másolat, amikor nem az összes forrást fájl másolunk át, hanem csak az újakat és azokat, amelyek módosultak az előző másolat elkészítése óta.

Mint minden fejlesztő, AKI SEMMIKÉPPEN nem kívánt (akkoriban) belemerülni a PostgreSQL részleteibe, egy zöld gombot kerestem. Tudja, mint az AWS-nél, DigitalOcean-nál: megnyomta egy gombot — megkapta a replikációt, megnyomta a másodikat — beállította a mentéseket, a harmadikkal — mindent visszaállított pár órával ezelőttre. Gombokat és szép GUI eszközöket nem találtam. Ha tud egy ilyet (ingyenes vagy olcsó) — kérjük írja meg a megjegyzésekbe.

Google-zás után két eszközt találtam pgbarman és pgbackrest. Az elsővel egyszerűen nem boldogultam (nagyon szegény dokumentáció, régi kézikönyvek alapján próbálkoztam mindent beüzemelni), de a második dokumentációja elég jó szintű volt, de nem volt mentes hibáktól. E cikket azért írtam, hogy megkönnyítsem azok munkáját, akik hasonló feladatokkal találkoznak.

A cikk elolvasása után megtanulja, hogyan készítsen inkrementális mentéseket, hogyan tárolja őket távoli szerveren (a mentések tárolója), és hogyan állíthatja vissza őket adatvesztés vagy egyéb problémák esetén a fő szerveren.

Előkészületek

A kézikönyv reprodukálásához két VPS-re lesz szüksége. Az első tároló (a biztonsági mentések tárolója), a második pedig a PostgreSQL szerver (az esetemben a PostgreSQL 11-es verziója).

Felmerül, hogy a postgres-szel rendelkező szerveren van root, sudo felhasználó, postgres felhasználó és magának a postgres-nek is telepítve kell lennie (a postgres felhasználó automatikusan létrejön a postgresql telepítésekor), a tároló szerveren pedig legyen root és sudo felhasználó (a kézikönyvben a pgbackrest felhasználónév fog szerepelni).

Annak érdekében, hogy kevesebb problémával találkozzon az útmutató követése közben — dőlt betűs szövegben írom le hol, melyik felhasználóval és milyen jogosultságokkal hajtottam végre a parancsot a cikk írása és ellenőrzése során.

A pgbackrest telepítése

Tároló (pgbackrest felhasználó):

1. Töltse le a pgbackrest archívumot és másolja á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. Telepítsük a szükséges építési 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. Építsük meg a pgbackrestet:

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

4. Másoljuk az végrehajtható fájlt az /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 meglétét igényli. Telepítés:

sudo apt-get install perl

6. Hozzuk létre a naplózási könyvtárakat, és állítsuk be a megfelelő jogosultságokat:

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őrizzük:

pgbackrest verzió

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

A pgbackrest telepítési folyamata a postgres szerveren megegyezik a tárolóban való telepítéssel (igen, a pgbackrest-nek mindkét szerveren telepítve kell lennie), de a 6. lépésben a második és utolsó parancsot:

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

cseréljük le a következőre:

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

Az interakció beállítása a szerverek között jelszó nélküli SSH-n keresztül

Annak érdekében, hogy a pgbackrest megfelelően működjön, be kell állítani az interakciót a postgres szerver és a tároló között egy kulcsfájl segítségével.

Tároló (pgbackrest felhasználó):

Kulcspárt hozunk létre:

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 hajtjuk végre.

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

Kulcspárt hozunk létre:

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 ""

Tároló (sudo felhasználó):

Másoljuk át a postgres szerver nyilvános kulcsát a tároló szerverre:

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

Ezen a lépésnél a root felhasználó jelszavát fogja kérni. Csak a postgres szerver root felhasználójának jelszavát kell megadni!

Postgres szerver (sudo felhasználó):

A nyilvános kulcsot a repo szerverre másoljuk a postgres-szel:

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

Ezen a lépésnél a root felhasználó jelszavát fogja kérni. Csak a repo root felhasználójának jelszavát kell megadni!

Ellenőrizzük:

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

sudo -u pgbackrest ssh postgres@

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

sudo -u postgres ssh pgbackrest@

Biztosítjuk, hogy problémamentesen hozzáférjük.

Postgres szerver beállítása

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

1. Engedélyezzük a „külső” IP-kből való csatlakozást a postgres szerverhez. Ehhez szerkeszteni kell a fájlt , hogy a tesztadatbázisunk ne akarjon csendesen biztosítékot létrehozni. (a /etc/postgresql/11/main mappában található), hozzáadva a következő sort:

listen_addresses = '*'

Ha már létezik egy ilyen sor — vagy távolítsa el a megjegyzést, vagy állítsa a paraméter értékét '*' -ra.

A fájlban pg_hba.conf (szintén a mappában található /etc/postgresql/11/main) a következő sorokat adjuk hozzá:

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

ahol:

hostssl/host - SSL-en (vagy nem) csatlakozunk
all - lehetővé tesszük a csatlakozást minden adatbázishoz
all - a felhasználónév, akinek lehetővé tesszük a csatlakozást (mindenkinek)
0.0.0.0/0 - az a hálózati maszk, ahonnan csatlakozni lehet
md5 - a jelszó titkosítási módja

2. Megadjuk a szükséges beállításokat a , hogy a tesztadatbázisunk ne akarjon csendesen biztosítékot létrehozni. (a /etc/pgbackrest/pgbackrest.conf fájlban található) /etc/postgresql/11/mainaz pgbackrest működéséhez:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Ahol a main a klaszter neve. A postgres telepítésekor automatikusan létrejön a main klaszter.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Megadjuk 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=

4. Újraindítjuk a postgresql-t:

sudo service postgresql restart

A repo szerver beállítása

Repo (pgbackrest felhasználó):

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

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

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Paraméter, amely megadja, hogy mennyi ideig tároljuk a teljes biztonsági másolatokat. Tehát, ha van két teljes biztonsági másolatod, és egy harmadikat készítesz, az első kettő törlésre kerül az inkrementálásokkal együtt.
start-fast=y # Azonnal elkezdi a biztonsági másolat készítését, erről itt olvashatsz: https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Tároló létrehozása

Repo (pgbackrest felhasználó):

Új tárolót hozunk létre a klaszterhez main:

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

Ellenőrzés

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

Ellenőrzés a postgres szerveren:

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

Repo (pgbackrest felhasználó):

Ellenőrzés a tároló szerveren:

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

Biztosítjuk, hogy a kimenetben látható legyen a "check command end: completed successfully" sor.

Fáradt vagy? Lépjünk a legérdekesebb részhez.

Biztonsági másolat készítése

Repo (pgbackrest felhasználó):

1. Végezze el a biztonsági másolat készítését:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Ellenőrizzük, hogy a biztonsági másolat létrejött:

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

A Pgbackrest létrehozza az első teljes biztonsági másolatot. Ha szeretnéd, futtathatod újra a biztonsági mentési parancsot, és megbizonyosodsz arról, hogy a rendszer létrehozza az inkrementális biztonsági másolatot.

Ha újra szeretnél teljes biztonsági másolatot készíteni, add meg a kiegészítő zászlót:

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

Ha részletes kimenetet szeretnél a konzolon, akkor szintén add meg:

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

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

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

1. Állítsd le a futó klasztert:

sudo pg_ctlcluster 11 main stop

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

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Indítsd el a klasztert:

sudo pg_ctlcluster 11 main start

A biztonsági másolat helyreállítása után újra biztonsági másolatot kell készítenünk:

Repo (pgbackrest felhasználó):

sudo pgbackrest --stanza=main backup

Ennyi. Végül szeretném megemlíteni, hogy semmiképpen sem próbálok senior DBA-ként fellépni, és ha lehetőségem van, inkább a felhőket használom. Jelenleg különböző témák, például biztonsági másolat készítése, replikációk, monitorozás stb. területén kezdek tanulni, és az eredményekről kis jelentéseket írok, hogy kicsi hozzájárulást nyújtsak a közösségnek és készítsek magamnak néhány kis segédletet.

A következő cikkekben megpróbálok beszámolni további funkciókról - adatok helyreállítása tiszta klaszterre, biztonsági másolatok titkosítása és nyilvánosságra hozatala az S3-on, biztonsági másolatok rsync-en keresztül.

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