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 /build2. 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-dev3. Építsük meg a pgbackrestet:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. 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/pgbackrest5. A pgbackrest perl meglétét igényli. Telepítés:
sudo apt-get install perl6. 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.conf7. 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.confcseréljük le a következőre:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confAz 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_keysEzen 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 md5ahol:
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ódja2. 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 = replica3. 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 restartA 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-archivingTá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 checkRepo (pgbackrest felhasználó):
Ellenőrzés a tároló szerveren:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkBiztosí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 backupHa részletes kimenetet szeretnél a konzolon, akkor szintén add meg:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupBiztonsá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 stop2. Helyreállítás biztonsági másolatból:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Indítsd el a klasztert:
sudo pg_ctlcluster 11 main startA 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 backupEnnyi. 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
