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 /build2. 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-dev3. Sestavte pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. 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/pgbackrest5. Pgbackrest vyžaduje Perl. Nainstalujte:
sudo apt-get install perl6. 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.conf7. Ověřte:
pgbackrest verzePostgres 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.confnásledujícími příkazy:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confNastavení 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_keysV 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 md5kde:
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í hesla2. 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 = replica3. 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 restartNastavení 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-archivingVytvoř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 checkRepozitář (uživatel pgbackrest):
Ověřujeme na repo serveru:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkUjišť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 backupPokud chcete podrobný výstup do konzole, uveďte také:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupObnovujeme zálohu
Postgres server (uživatel sudo nebo root):
1. Zastavujeme běžící cluster:
sudo pg_ctlcluster 11 main stop2. Obnovujeme se ze zálohy:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Spouštíme cluster:
sudo pg_ctlcluster 11 main startPo obnovení zálohy je nutné provést opětovné zálohování:
Repozitář (uživatel pgbackrest):
sudo pgbackrest --stanza=main backupA 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
