Přírůstkové zálohy postgresql s pgbackrest - kurz pro mladé bojovníky od vývojáře

Zřeknutí se odpovědnosti

Jsem vývojář. Píšu kód, komunikuji s databází pouze jako uživatel. V žádném případě se netvářím jako správce systému a navíc dba. Ale…

Stalo se, že jsem potřeboval zorganizovat zálohu postgresql databáze. Žádné mraky - ponechat SSH a zajistit, aby vše fungovalo a nežádat o peníze. Co v takových případech děláme? Přesně tak, strčíme pgdump do cronu, každý den vše zálohujeme do archivu a pokud se úplně rozprchneme, pošleme tento archiv někam daleko.

Tentokrát byla potíž v tom, že podle plánů měla databáze narůst o cca + - 100 MB za den. Samozřejmě, že po pár týdnech zmizí touha zálohovat vše pomocí pgdump. Zde se hodí přírůstkové zálohy.

Zajímavý? Vítejte pod kočkou.

Přírůstková záloha je druh zálohy, kdy nejsou zkopírovány všechny zdrojové soubory, ale pouze nové a změněné od vytvoření předchozí kopie.

Jako každý vývojář, který je NAPROSTO neochotný (v té době) porozumět spletitosti postgresu, jsem chtěl najít zelené tlačítko. No, víte, jako v AWS, DigitalOcean: Stiskl jsem jedno tlačítko - mám replikaci, stiskl jsem druhé - nastavil jsem zálohy, třetí - před pár hodinami jsem vše vrátil zpět. Nenašel jsem tlačítko a krásný nástroj GUI. Pokud nějaký znáte (zdarma nebo levně) - napište o něm do komentářů.

Googlem jsem našel dva nástroje pgbarman и pgbackrest. S tou první jsem prostě neuspěl (velmi špatná dokumentace, snažil jsem se vše posbírat podle starých návodů), ale druhá dokumentace se ukázala být na úrovni, ale ne bez chyby. Pro zjednodušení práce těch, kteří čelí podobnému úkolu, byl napsán tento článek.

Po přečtení tohoto článku se dozvíte, jak provádět přírůstkové zálohy, ukládat je na vzdálený server (úložiště se zálohami) a obnovovat je v případě ztráty dat nebo jiných problémů na hlavním serveru.

Trénink

K přehrání manuálu budete potřebovat dva VPS. Prvním bude úložiště (úložiště, na kterém budou zálohy), a druhým vlastně samotný server s postgresem (v mém případě verze 11 postgresu).

Předpokládá se, že na serveru s postgres máte nainstalovaný root, uživatele sudo, uživatele postgres a samotný postgres (uživatel postgres se vytvoří automaticky při instalaci postgresql) a na serveru úložiště máte uživatele root a sudo (bude použito uživatelské jméno pgbackrest v návodu).

Abyste měli méně problémů při reprodukci návodu - píšu kurzívou kde, s jakým uživatelem a s jakými právy jsem příkaz provedl při psaní a recenzování článku.

instalace pgbackrest

Úložiště (uživatel pgbackrest):

1. Stáhněte si archiv z 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 závislosti potřebné pro sestavení:

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

3. Sbíráme 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 protokoly, udělte jim určitá práva:

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. Zkontrolujte:

pgbackrest version

Server Postgres (uživatel sudo nebo root):

Proces instalace pgbackrest na postgres server je podobný instalaci na repozitář (ano, pgbackrest musí být nainstalován na obou serverech), ale v šestém odstavci druhý a poslední příkaz:

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

nahradit za:

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

Nastavení komunikace mezi servery přes SSH bez hesla

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

Úložiště (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 ""

Varování! Výše uvedené příkazy se provádějí bez sudo.

Server Postgres (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 ""

Úložiště (uživatel sudo):

Zkopírujte veřejný klíč serveru postgres na server úložiště:

(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

V tomto kroku požádá uživatele root o heslo. Musíte zadat přesně heslo uživatele root serveru postgres!

Server Postgres (uživatel sudo):

Zkopírujte veřejný klíč úložiště na server pomocí postgres:

(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

V tomto kroku požádá uživatele root o heslo. Musíte zadat heslo uživatele root úložiště!

Zkontrolujeme:

Úložiště (uživatel root, kvůli čistotě experimentu):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (uživatel root, kvůli čistotě experimentu):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Dbáme na to, abychom získali přístup bez problémů.

Nastavení postgres serveru

Server Postgres (uživatel sudo nebo root):

1. Povolme "klepání" na postgres server z externí IP. Chcete-li to provést, upravte soubor postgresql.conf (umístěné ve složce /etc/postgresql/11/main) přidáním následujícího řádku:

listen_addresses = '*'

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

V souboru pg_hba.conf (nachází se také ve složce /etc/postgresql/11/main) přidejte 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 - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Provedeme potřebná nastavení v postgresql.conf (je to ve složce /etc/postgresql/11/main), aby pgbackrest fungoval:

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

3. Proveďte potřebná nastavení 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=<repository_server_ip>

4. Restartujte postgresql:

sudo service postgresql restart

Nastavení serveru úložiště

Úložiště (uživatel pgbackrest):

Proveďte potřebná nastavení v konfiguračním souboru 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

Vytvořte trezor

Úložiště (uživatel pgbackrest):

Vytvořte nové úložiště pro cluster hlavní:

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

Проверка

Server Postgres (uživatel sudo nebo root):

Zkontrolujte na serveru postgres:

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

Úložiště (uživatel pgbackrest):

Zkontrolujte na serveru úložiště:

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

Ujistíme se, že ve výstupu vidíme řádek „kontrola příkazu end: dokončena úspěšně“.

Unavený? Pojďme k tomu nejzajímavějšímu.

Vytvoření zálohy

Úložiště (uživatel pgbackrest):

1. Proveďte zálohu:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Ujistíme se, že záloha byla vytvořena:

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

pgbackrest vytvoří první plnou zálohu. Pokud chcete, můžete příkaz backup spustit znovu a ujistit se, že systém vytvoří přírůstkovou zálohu.

Pokud chcete znovu vytvořit úplnou zálohu, zadejte další příznak:

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

Pokud chcete podrobný výstup konzoly, zadejte také:

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

Obnovení zálohy

Server Postgres (uživatel sudo nebo root):

1. Zastavte běžící cluster:

sudo pg_ctlcluster 11 main stop

2. Obnovení ze zálohy:

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

Chcete-li obnovit databázi do stavu poslední FULL zálohy, použijte příkaz bez zadání recovery_target:

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

Důležité! Po obnovení se může ukázat, že databáze přestane reagovat v režimu obnovení (budou se vyskytovat chyby jako ERROR: nelze provést DROP DATABASE v transakci pouze pro čtení). Abych byl upřímný, stále nechápu, s čím to souvisí. Řeší se následovně (po provedení příkazu bude nutné chvíli počkat):

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

Ve skutečnosti je možné obnovit konkrétní zálohu podle jejího názvu. Tady jsem jen já V dokumentaci uvedu odkaz na popis této funkce. Vývojáři doporučují používat tento parametr opatrně a vysvětlit proč. Za sebe mohu dodat, že jsem to použil. Pokud to opravdu potřebujete, ujistěte se, že databáze je po obnově mimo režim obnovy (vyberte pg_is_in_recovery() by mělo ukazovat „f“) a pro každý případ proveďte po obnově úplnou zálohu.

3. Spusťte cluster:

sudo pg_ctlcluster 11 main start

Po obnovení zálohy musíme provést druhou zálohu:

Úložiště (uživatel pgbackrest):

sudo pgbackrest --stanza=main backup

To je vše. Na závěr chci připomenout, že se v žádném případě nesnažím předstírat, že jsem senior dba a při sebemenší příležitosti použiji cloudy. V současné době sám začínám studovat různá témata jako zálohování, replikace, monitorování atd. a píšu malé zprávy o výsledcích, abych trochu přispěl komunitě a nechal si pro sebe malé cheaty.

V následujících článcích se pokusím mluvit o doplňkových funkcích – obnova dat do čistého clusteru, šifrování záloh a publikování do S3, zálohování přes rsync.

Zdroj: www.habr.com

Přidat komentář