Incrementele back-ups van postgresql met pgbackrest — een beginnerscursus van de ontwikkelaar

Disclaimer

Ik ben een ontwikkelaar. Ik schrijf code en werk alleen als gebruiker met de database. Ik pretender niet in de minste enigerlei als systeembeheerder of DBA te functioneren. Maar...

Het is zo gekomen dat ik een back-up van een PostgreSQL-database moest organiseren. Geen cloud — houd SSH bij de hand en zorg ervoor dat alles werkt zonder dat het geld vraagt. Wat doen we in zulke gevallen? Juist, we stoppen pg_dump in cron, maken elke dag een back-up in een archief en als we echt in de problemen komen, sturen we dat archief naar de langere afstand.

Dit keer was de uitdaging dat de database volgens de plannen ongeveer met ± 100 MB per dag moest groeien. Het is duidelijk dat na een paar weken de wens om alles met pg_dump te back-uppen zal verdwijnen. Hier komen incrementele back-ups van pas.

Interessant? Welkom onder de motorkap.

Een incrementele back-up is een soort back-up waarbij niet alle bestanden van de bron worden gekopieerd, maar alleen de nieuwe en gewijzigde bestanden sinds de creatie van de vorige kopie.

Zoals elke ontwikkelaar, die totaal niet op dat moment de fijne kneepjes van PostgreSQL wilde begrijpen, wilde ik een grote groene knop vinden. Je weet wel, zoals in AWS of DigitalOcean: druk op één knop — je hebt replicatie, druk op een andere — je hebt back-ups ingesteld, druk op de derde — alles wordt teruggedraaid naar een paar uur geleden. Ik vond geen knoppen en mooie GUI-tools. Als je zoiets kent (gratis of goedkoop), laat het me dan weten in de reacties.

Na een zoektocht vond ik twee tools pgbarman en pgbackrest. Met de eerste had ik gewoon geen geluk (zeer magere documentatie, ik probeerde alles op te zetten met oude handleidingen), maar bij de tweede was de documentatie van een niveau, maar ook niet zonder gebreken. Deze artikel is geschreven om het werk te vereenvoudigen voor degenen die met een soortgelijke taak worden geconfronteerd.

Na het lezen van dit artikel leer je hoe je incrementele back-ups maakt, ze op een externe server (repository met back-ups) opslaat en ze herstelt in geval van gegevensverlies of andere problemen op de hoofserver.

Voorbereiding

Om de handleiding te reproduceren heb je twee VPS'en nodig. De eerste zal de opslagplaats (repository waar de back-ups zich bevinden) zijn, en de tweede is de server met PostgreSQL zelf (in mijn geval versie 11 van PostgreSQL).

Ervan wordt verondersteld dat je op de server met postgres een root, sudo gebruiker, postgres gebruiker en postgres zelf is geïnstalleerd (de postgres gebruiker wordt automatisch aangemaakt bij de installatie van postgresql), en op de repository server zijn er een root en sudo gebruiker (in de handleiding zal de gebruikersnaam pgbackrest worden gebruikt).

Om je minder problemen te geven bij het volgen van de instructies — schrijf ik cursief waar, met welke gebruiker en met welke rechten ik de opdracht uitvoerde tijdens het schrijven en controleren van het artikel.

Installatie van pgbackrest

Repository (gebruiker pgbackrest):

1. Download het archief van pgbackrest en verplaatst de inhoud naar de map /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. Installeer de benodigde afhankelijkheden voor de bouw:

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

3. Bouw pgbackrest:

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

4. Kopieer het uitvoerbare bestand naar de map /usr/bin:

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

5. Pgbackrest vereist perl. Installeer:

sudo apt-get install perl

6. Maak mappen voor logs aan en geef ze bepaalde rechten:

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

pgbackrest versie

Postgres server (sudo gebruiker of root):

Het installatieproces van pgbackrest op de server met postgres is vergelijkbaar met het installatieproces op de repository (ja, pgbackrest moet op beide servers staan), maar in punt 6 vervangen we de tweede en laatste opdrachten:

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

door:

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

Configuratie van de interactie tussen servers via passwordless SSH

Om pgbackrest goed te laten werken, moet de interactie tussen de postgres server en de repository worden ingesteld met een sleutelbestand.

Repository (gebruiker pgbackrest):

Maak een sleutelpare aan:

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

Let op! De bovenstaande opdrachten uitvoeren zonder sudo.

Postgres server (sudo gebruiker of root):

Maak een sleutelpare aan:

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

Kopieer de publieke sleutel van de postgres server naar de repository server:

(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

Op dit punt wordt u om het wachtwoord van de rootgebruiker gevraagd. Voer het specifieke wachtwoord van de rootgebruiker van de postgres-server in!

Postgres-server (sudo-gebruiker):

We kopiëren de publieke sleutel van de repository naar de server met 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

Op dit punt wordt u om het wachtwoord van de rootgebruiker gevraagd. Voer het specifieke wachtwoord van de rootgebruiker van de repository in!

We controleren:

Repository (root-gebruiker, voor de netheid van het experiment):

sudo -u pgbackrest ssh postgres@

Postgres-server (root-gebruiker, voor de netheid van het experiment):

sudo -u postgres ssh pgbackrest@

Zorg ervoor dat we probleemloos toegang krijgen.

Configuratie van de postgres-server

Postgres server (sudo gebruiker of root):

1. We staan verbinding vanaf externe IP's naar de postgres-server toe. Laten we het bestand bewerken: postgresql.conf (het bevindt zich in de map /etc/postgresql/11/main), voeg de volgende regel toe:

listen_addresses = '*'

Als zo'n regel al bestaat — of commentarieer die uit, of stel de parameterwaarde in op ‘*’.

In het bestand pg_hba.conf ( bevindt zich ook in de map /etc/postgresql/11/main) voeg de volgende regels toe:

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

waarbij:

hostssl/host - we verbinden via SSL (of niet)
all - we staan verbinding met alle databases toe
all - de gebruikersnaam waaraan we toegang verlenen (iedereen)
0.0.0.0/0 - het subnet waarmee verbinding gemaakt kan worden
md5 - de methode voor wachtwoordcodering

2. We brengen de nodige instellingen aan in postgresql.conf (dit bevindt zich in de map /etc/postgresql/11/main) voor de werking van pgbackrest:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Waar main de naam van de cluster is. Bij de installatie van postgres wordt automatisch een cluster main aangemaakt.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. We brengen de nodige instellingen aan in het configuratiebestand van pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. We herstarten postgresql:

sudo service postgresql restart

Configuratie van de repository-server

Repository (pgbackrest-gebruiker):

We brengen de nodige instellingen aan in het configuratiebestand 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 # Parameter die aangeeft hoeveel volledige backups opgeslagen moeten worden. Als je twee volledige backups hebt en je maakt een derde, worden de eerste twee samen met de incrementals verwijderd.
start-fast=y # Start het back-uppen onmiddellijk, lees hier meer over deze parameter https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Opslag creëren

Repository (pgbackrest-gebruiker):

We creëren een nieuwe opslag voor het cluster main:

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

Controle

Postgres server (sudo gebruiker of root):

We controleren op de postgres server:

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

Repository (pgbackrest-gebruiker):

We controleren op de repository-server:

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

Zorg ervoor dat we in de uitvoer de regel "check command end: completed successfully" zien.

Moet je even uitrusten? Laten we naar het leukste gedeelte gaan.

We maken een backup

Repository (pgbackrest-gebruiker):

1. We voeren de backup uit:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. We zorgen ervoor dat de backup is aangemaakt:

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

Pgbackrest zal de eerste volledige backup maken. Als je wilt, kun je het backup-commando opnieuw uitvoeren en ervoor zorgen dat het systeem een incrementele backup maakt.

Als je de volledige backup opnieuw wilt maken, geef dan een extra vlag op:

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

Als je gedetailleerde uitvoer naar de console wilt, geef dan ook op:

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

We herstellen de backup

Postgres server (sudo gebruiker of root):

1. We stoppen het werkende cluster:

sudo pg_ctlcluster 11 main stop

2. We herstellen vanuit de backup:

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

3. We starten het cluster:

sudo pg_ctlcluster 11 main start

Na het herstellen van de backup moeten we een nieuwe backup maken:

Repository (pgbackrest-gebruiker):

sudo pgbackrest --stanza=main backup

Dat is alles. Ten slotte wil ik opmerken dat ik me absoluut niet als senior DBA voordoe en bij de minste gelegenheid cloudservices zal gebruiken. Momenteel begin ik zelf verschillende onderwerpen zoals back-uppen, replicaties, monitoring, enz. te bestuderen en schrijf ik kleine rapporten over de resultaten om een kleine bijdrage aan de gemeenschap te leveren en voor mezelf een paar handige aantekeningen achter te laten.

In de volgende artikelen zal ik proberen te vertellen over extra functies - gegevensherstel naar een schoon cluster, encryptie van backups en publicatie op S3, backups via rsync.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster