Inkrementelle postgresql-sikkerhetskopier med pgbackrest - et kurs for en ung jagerfly fra utvikleren

Ansvarsfraskrivelse

Jeg er en utvikler. Jeg skriver kode og samhandler med databasen kun som bruker. På ingen måte utgir jeg meg for å være en systemadministrator, langt mindre en dba. Men…

Det hendte at jeg trengte å organisere en sikkerhetskopi av postgresql-databasen. Ingen skyer - bare bruk SSH og sørg for at alt fungerer uten å be om penger. Hva gjør vi i slike tilfeller? Det stemmer, vi skyver pgdump inn i cron, sikkerhetskopierer alt til arkivet hver dag, og hvis vi er helt borte, sender vi dette arkivet et sted langt unna.

Denne gangen var vanskeligheten at databasen ifølge planene skulle vokse med ca +- 100 MB per dag. Selvfølgelig, etter et par uker vil ønsket om å sikkerhetskopiere alt med pgdump forsvinne. Det er her inkrementelle sikkerhetskopier kommer til unnsetning.

Interessant? Velkommen til katt.

Inkrementell sikkerhetskopiering er en type sikkerhetskopiering når ikke alle kildefilene er kopiert, men bare nye og de endret siden opprettelsen av den forrige kopien.

Som enhver utvikler som var ABSOLUT uvillig (på den tiden) til å forstå forviklingene med postgres, ønsket jeg å finne den grønne knappen. Vel, du vet, som i AWS, DigitalOcean: du trykket på en knapp - du fikk replikering, du trykket på den andre - du satte opp sikkerhetskopier, den tredje - du rullet alt tilbake et par timer. Jeg fant ikke en knapp eller et vakkert GUI-verktøy. Hvis du kjenner en (gratis eller billig), skriv om den i kommentarfeltet.

Etter å ha googlet fant jeg to verktøy pgbarman и pg ryggstøtte. Jeg lyktes rett og slett ikke med den første (veldig sparsom dokumentasjon, jeg prøvde å finne ut alt i henhold til gamle manualer), men med den andre viste dokumentasjonen seg å være på nivå, men ikke uten feil. For å forenkle arbeidet til de som står overfor en lignende oppgave, ble denne artikkelen skrevet.

Etter å ha lest denne artikkelen vil du lære hvordan du lager inkrementelle sikkerhetskopier, lagrer dem på en ekstern server (lager med sikkerhetskopier) og gjenoppretter dem i tilfelle tap av data eller andre problemer på hovedserveren.

Trening

For å reprodusere manualen trenger du to VPS. Den første vil være lagringen (depotet som sikkerhetskopiene skal lagres på), og den andre, faktisk, selve serveren med postgres (i mitt tilfelle, versjon 11 av postgres).

Det forutsettes at du på serveren med postgres har root, sudo-bruker, postgres-bruker og selve postgres er installert (postgres-brukeren opprettes automatisk ved installasjon av postgresql), og på repository-serveren er det root og sudo-bruker (i manualen brukernavnet pgbackrest vil bli brukt).

For at du skal få færre problemer med å gjengi instruksjonene, skriver jeg i kursiv hvor, med hvilken bruker og med hvilke rettigheter utførte jeg kommandoen mens du skriver og sjekker artikkelen.

Montering av pgryggstøtte

Repository (bruker pgbackrest):

1. Last ned arkivet fra pgbackrest og overfør innholdet til 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. Installer avhengighetene som er nødvendige for 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øtte:

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

4. Kopier den kjørbare filen til katalogen /usr/bin:

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

5. Pgryggstøtte krever perl. Installere:

sudo apt-get install perl

6. Lag kataloger for logger, gi dem visse rettigheter:

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

pgbackrest version

Postgres-server (sudo-bruker eller root):

Prosessen med å installere pgbackrest på en server med postgres ligner på installasjonsprosessen på depotet (ja, pgbackrest må installeres på begge serverne), men i 6. ledd befaler andre og siste:

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

Erstatt med:

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

Sette opp interaksjon mellom servere via passordløs SSH

For at pgbackrest skal fungere riktig, er det nødvendig å konfigurere interaksjonen mellom postgres-serveren og depotet ved hjelp av nøkkelfilen.

Repository (bruker pgbackrest):

Lag et nøkkelpar:

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

Advarsel! Vi kjører kommandoene ovenfor uten sudo.

Postgres-server (sudo-bruker eller root):

Lag et nøkkelpar:

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-bruker):

Kopier den offentlige nøkkelen til postgres-serveren til depotserveren:

(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

På dette trinnet vil du bli bedt om passordet for root-brukeren. Du må skrive inn passordet til root-brukeren til postgres-serveren!

Postgres-server (sudo-bruker):

Kopier den offentlige nøkkelen til depotet til serveren 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

På dette trinnet vil du bli bedt om passordet for root-brukeren. Du må skrive inn nøyaktig passordet til rotbrukeren til depotet!

Vi sjekker:

Repository (rotbruker, for eksperimentets renhet):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-server (rotbruker, for eksperimentets renhet):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Vi sørger for at vi får tilgang uten problemer.

Sette opp en postgres-server

Postgres-server (sudo-bruker eller root):

1. La oss tillate å banke på postgres-serveren fra eksterne IP-er. For å gjøre dette, rediger filen postgresql.conf (plassert i /etc/postgresql/11/main-mappen), legger linjen til den:

listen_addresses = '*'

Hvis en slik linje allerede eksisterer, kan du enten fjerne den eller angi parameterverdien som '*'.

I fil pg_hba.conf (finnes også i mappen /etc/postgresql/11/main) legg til følgende linjer:

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

der:

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

2. La oss gjøre de nødvendige innstillingene i postgresql.conf (det ligger i mappen /etc/postgresql/11/main) for at pgbackrest skal fungere:

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

3. La oss gjøre de nødvendige innstillingene i pgbackrest-konfigurasjonsfilen (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Last postgresql på nytt:

sudo service postgresql restart

Sette opp en depotserver

Repository (pgbackrest-bruker):

La oss gjøre de nødvendige innstillingene i konfigurasjonsfilen pg ryggstøtte
(/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

Opprette et depot

Repository (pgbackrest-bruker):

Opprette en ny lagring for klyngen main:

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-bruker eller root):

Vi sjekker på postgres-serveren:

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

Repository (pgbackrest-bruker):

Vi sjekker depotserveren:

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

Vi sørger for at vi i utdataene ser linjen "sjekk kommandoen slutt: fullført vellykket".

Trett? La oss gå videre til den mest interessante delen.

Lage en sikkerhetskopi

Repository (pgbackrest-bruker):

1. Utfør en sikkerhetskopi:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Kontroller at en sikkerhetskopi er opprettet:

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

Pgbackrest vil lage den første fullstendige sikkerhetskopien. Hvis du ønsker det, kan du kjøre backup-kommandoen på nytt og sørge for at systemet oppretter en inkrementell sikkerhetskopi.

Hvis du vil ta en fullstendig sikkerhetskopi igjen, spesifiser et ekstra flagg:

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

Hvis du vil ha detaljert konsollutgang, spesifiser også:

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

Gjenoppretter en sikkerhetskopi

Postgres-server (sudo-bruker eller root):

1. Stopp løpsklyngen:

sudo pg_ctlcluster 11 main stop

2. Gjenopprette fra sikkerhetskopi:

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

For å gjenopprette databasen til tilstanden til den siste FULL backup, bruk kommandoen uten å spesifisere recovery_target:

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

Viktig! Etter gjenoppretting kan det skje at databasen setter seg fast i gjenopprettingsmodus (det vil være feil som FEIL: kan ikke utføre DROP DATABASE i en skrivebeskyttet transaksjon). For å være ærlig har jeg ennå ikke forstått hva dette henger sammen med. Løsningen er som følger (du må vente litt etter at kommandoen er utført):

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

Faktisk er det mulig å gjenopprette en spesifikk sikkerhetskopi etter navnet. Her er jeg bare Jeg vil gi en lenke til beskrivelsen av denne funksjonen i dokumentasjonen. Utviklerne anbefaler å bruke dette alternativet med forsiktighet og forklarer hvorfor. Jeg kan legge til fra meg selv at jeg brukte den. Hvis du virkelig trenger det, sørg for at databasen går ut av gjenopprettingsmodus etter gjenoppretting (velg pg_is_in_recovery() skal vise "f") og, i tilfelle, ta en fullstendig sikkerhetskopi etter gjenoppretting.

3. Start klyngen:

sudo pg_ctlcluster 11 main start

Etter å ha gjenopprettet sikkerhetskopien, må vi utføre en ekstra sikkerhetskopi:

Repository (pgbackrest-bruker):

sudo pgbackrest --stanza=main backup

Det er alt. Avslutningsvis vil jeg minne om at jeg på ingen måte prøver å utgi meg for å være en senior dba og vil bruke skyene ved den minste anledning. For tiden begynner jeg selv å studere ulike temaer som backup, replikering, overvåking m.m. og jeg skriver små rapporter om resultatene for å gi et lite bidrag til fellesskapet og legge igjen små jukseark til meg selv.

I de følgende artiklene vil jeg prøve å snakke om tilleggsfunksjoner - datagjenoppretting til en ren klynge, kryptering av sikkerhetskopier og publisering til S3, sikkerhetskopiering via rsync.

Kilde: www.habr.com

Legg til en kommentar