Inkrementella postgresql säkerhetskopior med pgbackrest - en kurs för en ung fighter från utvecklaren

varning

Jag är en utvecklare. Jag skriver kod och interagerar med databasen endast som användare. På inget sätt låtsas jag vara en systemadministratör, än mindre en dba. Men…

Det hände så att jag behövde organisera en säkerhetskopia av postgresql-databasen. Inga moln – använd bara SSH och se till att allt fungerar utan att be om pengar. Vad gör vi i sådana fall? Det stämmer, vi trycker in pgdump i cron, säkerhetskopierar allt till arkivet varje dag, och om vi är helt vilse skickar vi det här arkivet någonstans långt bort.

Denna gång var svårigheten att databasen enligt planerna skulle växa med ca +- 100 MB per dag. Naturligtvis försvinner efter ett par veckor önskan att säkerhetskopiera allt med pgdump. Det är här inkrementella säkerhetskopieringar kommer till undsättning.

Intressant? Välkommen till katten.

Inkrementell säkerhetskopiering är en typ av säkerhetskopiering när inte alla källfiler kopieras, utan bara nya och de som har ändrats sedan den tidigare kopian skapades.

Precis som alla utvecklare som var ABSOLUT ovilliga (på den tiden) att förstå krångligheterna med postgres, ville jag hitta den gröna knappen. Tja, du vet, som i AWS, DigitalOcean: du tryckte på en knapp - du fick replikering, du tryckte på den andra - du satte upp säkerhetskopior, den tredje - du rullade tillbaka allt ett par timmar. Jag hittade inte en knapp eller ett vackert GUI-verktyg. Om du känner till en (gratis eller billig), skriv om den i kommentarerna.

Efter att ha googlat hittade jag två verktyg pgbarman и pg ryggstöd. Jag lyckades helt enkelt inte med den första (mycket sparsam dokumentation, jag försökte lista ut allt enligt gamla manualer), men med den andra visade sig dokumentationen vara i nivå, men inte utan brister. För att förenkla arbetet för dem som står inför en liknande uppgift skrevs denna artikel.

Efter att ha läst den här artikeln kommer du att lära dig hur du gör inkrementella säkerhetskopior, sparar dem på en fjärrserver (lager med säkerhetskopior) och återställer dem i händelse av dataförlust eller andra problem på huvudservern.

Utbildning

För att återskapa manualen behöver du två VPS. Den första kommer att vara lagringen (förvaret där säkerhetskopiorna kommer att lagras), och den andra, faktiskt, själva servern med postgres (i mitt fall version 11 av postgres).

Det antas att man på servern med postgres har root, sudo user, postgres user och postgres själv är installerad (postgres användare skapas automatiskt när man installerar postgresql), och på repository servern finns root och sudo user (i manualen användarnamnet pgbackrest kommer att användas).

För att du ska få färre problem vid återgivning av instruktionerna skriver jag i kursiv stil var, med vilken användare och med vilka rättigheter körde jag kommandot medan du skriver och kontrollerar artikeln.

Montering av pgryggstöd

Repository (användare pgbackrest):

1. Ladda ner arkivet från pgbackrest och överför dess innehåll till mappen /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. Installera de beroenden som krävs för montering:

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

3. Montering av ryggstöd:

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

4. Kopiera den körbara filen till katalogen /usr/bin:

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

5. Pgbackrest kräver perl. Installera:

sudo apt-get install perl

6. Skapa kataloger för loggar, ge dem vissa rättigheter:

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

pgbackrest version

Postgres-server (sudo-användare eller root):

Processen att installera pgbackrest på en server med postgres liknar installationsprocessen på förvaret (ja, pgbackrest måste installeras på båda servrarna), men i 6:e stycket befaller andra och sista:

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

ersätta med:

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

Ställa in interaktion mellan servrar via lösenordslös SSH

För att pgbackrest ska fungera korrekt är det nödvändigt att konfigurera interaktionen mellan postgres-servern och förvaret med hjälp av nyckelfilen.

Repository (användare pgbackrest):

Skapa ett nyckelpar:

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

Varning! Vi kör ovanstående kommandon utan sudo.

Postgres-server (sudo-användare eller root):

Skapa ett nyckelpar:

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

Repository (sudo-användare):

Kopiera den publika nyckeln för postgres-servern till arkivservern:

(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

I det här steget kommer du att bli ombedd att ange lösenordet för root-användaren. Du måste ange lösenordet för rotanvändaren på postgres-servern!

Postgres-server (sudo-användare):

Kopiera förvarets publika nyckel till servern med 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

I det här steget kommer du att bli ombedd att ange lösenordet för root-användaren. Du måste ange exakt lösenordet för rotanvändaren av förvaret!

Vi kontrollerar:

Repository (rotanvändare, för experimentets renhet):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-server (rotanvändare, för experimentets renhet):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Vi ser till att vi får tillgång utan problem.

Konfigurera en postgres-server

Postgres-server (sudo-användare eller root):

1. Låt oss tillåta att knacka på postgres-servern från externa IP-adresser. För att göra detta, redigera filen postgresql.conf (finns i /etc/postgresql/11/huvudmappen), lägg till raden i den:

listen_addresses = '*'

Om en sådan rad redan finns, avkommentera den eller ställ in parametervärdet som '*'.

I fil pg_hba.conf (finns även i mappen /etc/postgresql/11/main) lägg till följande rader:

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

där:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Låt oss göra de nödvändiga inställningarna i postgresql.conf (det finns i mappen /etc/postgresql/11/main) för att pgbackrest ska fungera:

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

3. Låt oss göra de nödvändiga inställningarna i pgbackrest-konfigurationsfilen (/etc/pgbackrest/pgbackrest.conf):

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

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Ladda om postgresql:

sudo service postgresql restart

Konfigurera en arkivserver

Förvar (pgbackrest-användare):

Låt oss göra de nödvändiga inställningarna i konfigurationsfilen pg ryggstöd
(/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

Skapa ett arkiv

Förvar (pgbackrest-användare):

Skapa en ny lagring för klustret huvudsakliga:

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

Проверка

Postgres-server (sudo-användare eller root):

Vi kollar på postgres-servern:

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

Förvar (pgbackrest-användare):

Vi kollar på arkivservern:

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

Vi ser till att vi i utgången ser raden "kontrollera kommandot slut: slutfört framgångsrikt".

Trött? Låt oss gå vidare till den mest intressanta delen.

Gör en säkerhetskopia

Förvar (pgbackrest-användare):

1. Gör en säkerhetskopia:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Se till att en säkerhetskopia har skapats:

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

Pgbackrest skapar den första fullständiga säkerhetskopian. Om du vill kan du köra backupkommandot igen och se till att systemet skapar en inkrementell backup.

Om du vill göra en fullständig säkerhetskopia igen, ange en ytterligare flagga:

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

Om du vill ha detaljerad konsolutgång, ange också:

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

Återställer en säkerhetskopia

Postgres-server (sudo-användare eller root):

1. Stoppa det löpande klustret:

sudo pg_ctlcluster 11 main stop

2. Återställa från säkerhetskopia:

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

För att återställa databasen till tillståndet för den senaste HELA säkerhetskopian, använd kommandot utan att ange recovery_target:

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

Viktig! Efter återställning kan det hända att databasen fastnar i återställningsläge (det kommer att finnas fel som ERROR: kan inte exekvera DROP DATABASE i en skrivskyddad transaktion). Om jag ska vara ärlig så har jag ännu inte förstått vad det här hänger ihop med. Lösningen är följande (du måste vänta lite efter att kommandot har körts):

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

Det är faktiskt möjligt att återställa en specifik säkerhetskopia med dess namn. Här är jag bara Jag kommer att tillhandahålla en länk till beskrivningen av denna funktion i dokumentationen. Utvecklarna rekommenderar att du använder det här alternativet med försiktighet och förklarar varför. Jag kan tillägga från mig själv att jag använde den. Om du verkligen behöver, se till att databasen går ur återställningsläget efter återställning (välj pg_is_in_recovery() ska visa "f") och, för säkerhets skull, gör en fullständig säkerhetskopia efter återställning.

3. Starta klustret:

sudo pg_ctlcluster 11 main start

Efter att ha återställt säkerhetskopian måste vi göra en andra säkerhetskopia:

Förvar (pgbackrest-användare):

sudo pgbackrest --stanza=main backup

Det är allt. Avslutningsvis vill jag påminna om att jag inte på något sätt försöker utge mig för att vara en senior dba och kommer att använda molnen vid minsta tillfälle. För närvarande börjar jag själv studera olika ämnen som backup, replikering, övervakning m.m. och jag skriver små rapporter om resultaten för att göra ett litet bidrag till samhället och lämna små fuskblad åt mig själv.

I följande artiklar kommer jag att försöka prata om ytterligare funktioner - dataåterställning till ett rent kluster, kryptering av säkerhetskopior och publicering till S3, säkerhetskopior via rsync.

Källa: will.com

Lägg en kommentar