Inkrementální zálohy PostgreSQL s pgbackrest – kurz mladého válečníka od vývojáře

Vyloučení odpovědnosti

Jsem vývojář. Píšu kód, s databází interaguji pouze jako uživatel. Ani náhodou si nenárokuji pozici systémového administrátora, natož pak DBA. Ale...

Tak se stalo, že jsem potřeboval zorganizovat zálohování databáze PostgreSQL. Žádné cloudy — drž se SSH a udělej, aby to fungovalo a nepožadovalo peníze. Co děláme v takových případech? Správně, dáváme pg_dump do cronu, každý den zálohujeme všechno do archivu a pokud se to opravdu vymkne kontrole — posíláme tento archiv někam pryč.

Tentokrát byla obtížnost v tom, že podle plánů by databáze měla růst přibližně o +- 100 MB denně. Samozřejmě, že již po několika týdnech by chuť zálohovat všechno pg_dumpem zmizela. Zde přicházejí na pomoc inkrementální zálohy.

Zajímavé? Vítejte pod kat.

Inkrementální záloha je druh zálohy, kdy se nekopírují všechny soubory zdroje, ale pouze nové a změněné od doby vytvoření předchozí zálohy.

Jako každý vývojář, který se v tu chvíli NECHTĚL zabývat jemnostmi PostgreSQL, jsem chtěl najít zelené tlačítko. No, víte, jako v AWS, DigitalOcean: stiskl jsi jedno tlačítko — získal jsi replikaci, stiskl jsi druhé — nastavil jsi zálohy, třetí — všechno vrátil zpět o pár hodin. Tlačítka a hezký GUI nástroj jsem nenašel. Pokud takový znáte (zdarma nebo levný) — napište o tom v komentářích.

Po vyhledávání jsem našel dva nástroje. pgbarman a pgbackrest. S prvním jsem měl prostě smůlu (velmi chudá dokumentace, snažil jsem se to všechno postavit podle starých manuálů), ale u druhého byla dokumentace na úrovni, i když ne bez vad. Abych usnadnil práci těm, kteří se setkají s podobným úkolem, byla napsána tato článek.

Po přečtení tohoto článku se naučíte provádět inkrementální zálohy, uchovávat je na vzdáleném serveru (repozitář se zálohami) a obnovit je v případě ztráty dat nebo jiných problémů na hlavním serveru.

Příprava

Pro reprodukci manuálu budete potřebovat dva VPS. První bude úložištěm (repozitářem, kde budou ležet zálohy), a druhý bude vlastně samotný server s PostgreSQL (v mém případě 11. verze PostgreSQL).

Předpokládá se, že na serveru s postgres máte uživatele root, sudo, uživatele postgres a samotný postgres je nainstalován (uživatel postgres je automaticky vytvořen při instalaci postgresql), a na serveru-repozitáři jsou uživatelé root a sudo (v manuálu bude používáno jméno uživatele pgbackrest).

Abychom se vyhnuli problémům při reprodukci pokynů - kurzívou uvádím kde, kterým uživatelem a s jakými právy jsem spouštěl příkaz během psaní a kontroly článku.

Instalace pgbackrest

Repozitář (uživatel pgbackrest):

1. Stáhněte archív s pgbackrest a přeneste jeho obsah do složky /build:

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

2. Nainstalujte potřebné závislosti pro kompilaci:

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

3. Sestavte pgbackrest:

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

4. Zkopírujte spustitelný soubor do adresáře /usr/bin:

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

5. Pgbackrest vyžaduje Perl. Nainstalujte:

sudo apt-get install perl

6. Vytvořte adresáře pro logy a nastavte jim příslušná oprávnění:

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. Ověřte:

pgbackrest verze

Postgres server (uživatel sudo nebo root):

Proces instalace pgbackrest na serveru s postgres je obdobný procesu instalace na repozitáři (ano, pgbackrest musí být nainstalován na obou serverech), ale v bodě 6 nahraďte druhý a poslední příkaz:

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

následujícími příkazy:

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

Nastavení interakce mezi servery prostřednictvím SSH bez hesla

Aby pgbackrest správně fungoval, je nutné nastavit interakci mezi serverem postgres a repozitářem pomocí klíčového souboru.

Repozitář (uživatel pgbackrest):

Vytvořte pár klíčů:

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

Pozor! Výše uvedené příkazy vykonávejte bez sudo.

Postgres server (uživatel sudo nebo root):

Vytvořte pár klíčů:

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

Repozitář (uživatel sudo):

Zkopírujte veřejný klíč z postgres serveru na server-repozitář:

(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

V tomto kroku budete vyzváni k zadání hesla pro uživatele root. Zadejte prosím přesně heslo uživatele root serveru postgres!

Postgres server (uživatel sudo):

Kopírujeme veřejný klíč repozitáře na server s postgres:

(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

V tomto kroku budete vyzváni k zadání hesla pro uživatele root. Zadejte prosím přesně heslo uživatele root repozitáře!

Kontrolujeme:

Repozitář (uživatel root, pro čistotu experimentu):

sudo -u pgbackrest ssh postgres@

Postgres server (uživatel root, pro čistotu experimentu):

sudo -u postgres ssh pgbackrest@

Ujistíme se, že máme přístup bez problémů.

Nastavení serveru postgres

Postgres server (uživatel sudo nebo root):

1. Umožníme přístup na server postgres z externích IP adres. K tomu upravíme soubor postgresql.conf (nachází se ve složce /etc/postgresql/11/main), přidáním následujícího řádku:

listen_addresses = '*'

Pokud takový řádek již existuje — buď ho odkomentujte, nebo nastavte hodnotu parametru na '*'.

V souboru pg_hba.conf (rovněž se nachází ve složce /etc/postgresql/11/main) přidáme následující řádky:

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

kde:

hostssl/host - připojujeme se přes SSL (nebo ne)
all - umožňujeme připojení ke všem databázím
all - uživatelské jméno, které mu umožňujeme připojení (všem)
0.0.0.0/0 - maska sítě, ze které se lze připojit
md5 - způsob šifrování hesla

2. Učiníme potřebné úpravy v postgresql.conf (nachází se ve složce /etc/postgresql/11/main) pro fungování pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Kde main je název clusteru. Při instalaci postgres automaticky vytváří cluster main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Učiníme potřebné úpravy v konfiguračním souboru pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=

4. Restartujeme postgresql:

sudo service postgresql restart

Nastavení serveru-repozitáře

Repozitář (uživatel pgbackrest):

Učiníme potřebné úpravy v konfiguračním souboru 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 # Parametr, který určuje, kolik plných záloh uchovávat. Tzn. pokud máte dvě plné zálohy a vytvoříte třetí - první dvě budou s inkrementy odstraněny.
start-fast=y # Začne zálohování okamžitě, o tomto parametru se můžete dočíst zde https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Vytvoření úložiště

Repozitář (uživatel pgbackrest):

Vytváříme nové úložiště pro cluster main:

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

Kontrola

Postgres server (uživatel sudo nebo root):

Ověřujeme na postgres serveru:

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

Repozitář (uživatel pgbackrest):

Ověřujeme na repo serveru:

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

Ujišťujeme se, že v výstupu vidíme řádek „check command end: completed successfully“.

Unaveni? Přecházíme k tomu zajímavějšímu.

Děláme zálohu

Repozitář (uživatel pgbackrest):

1. Provádíme zálohování:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Ujišťujeme se, že záloha byla vytvořena:

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

Pgbackrest vytvoří první plnou zálohu. Pokud chcete, můžete znovu spustit zálohovací příkaz a ujistit se, že systém vytvoří inkrementální zálohu.

Pokud chcete znovu vytvořit plnou zálohu, uveďte dodatečný příznak:

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

Pokud chcete podrobný výstup do konzole, uveďte také:

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

Obnovujeme zálohu

Postgres server (uživatel sudo nebo root):

1. Zastavujeme běžící cluster:

sudo pg_ctlcluster 11 main stop

2. Obnovujeme se ze zálohy:

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

3. Spouštíme cluster:

sudo pg_ctlcluster 11 main start

Po obnovení zálohy je nutné provést opětovné zálohování:

Repozitář (uživatel pgbackrest):

sudo pgbackrest --stanza=main backup

A to je vše. Na závěr bych chtěl připomenout, že si rozhodně nehraji na senior dba a při jakékoli příležitosti se uchýlím k cloudu. V současné době začínám studovat různá témata jako zálohování, replikace, monitoring atd., a o výsledcích píšu malé zprávy, abych přispěl do komunity a ponechal si malé poznámky.

V dalších článcích se pokusím hovořit o dalších funkcích — obnova dat na čistý cluster, šifrování záloh a publikace na S3, zálohy přes rsync.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster