Fraskrivelse
Jeg er udvikler. Jeg skriver kode og interagerer med databasen kun som bruger. Jeg har på ingen måde intentioner om at påtage mig rollen som systemadministrator eller DBA. Men…
Sådan blev det, at jeg måtte organisere sikkerhedskopiering af en PostgreSQL-database. Ingen skyer - hold SSH og sørg for, at alt fungerer uden at skulle betale. Hvad gør vi i sådanne tilfælde? Rigtigt, vi sætter pg_dump i cron, tager backup hver dag og hvis alt går galt, sender vi denne backup et sted hen.
Den udfordring, vi stod over for, var, at databasen ifølge planen skulle vokse med cirka 100 MB om dagen. Selvfølgelig, allerede efter et par uger ville ønsket om at tage backup med pg_dump forsvinde. Her kommer inkrementelle backups til hjælp.
Interesseret? Velkommen under kat.
En inkrementel backup er en slags sikkerhedskopi, hvor der kun kopieres nye og ændrede filer siden oprettelsen af den forrige kopi, i stedet for at kopiere alle filer fra kilden.
Som enhver udvikler, der helt ikke ønskede at dykke ind i detaljerne i PostgreSQL på det tidspunkt, ville jeg finde den grønne knap. Du ved, som i AWS, DigitalOcean: tryk på én knap og få replikation, tryk på en anden - opsæt backup, tryk på den tredje - gendan alt til et par timer tilbage. Jeg fandt ikke knapperne eller noget flot GUI-værktøj. Hvis du kender et (gratis eller billigt) - så skriv om det i kommentarerne.
Efter lidt googling fandt jeg to værktøjer pgbarman og pgbackrest. Med den første gik det simpelthen ikke godt (meget sparsommelig dokumentation, forsøgte at opsætte alt efter gamle manualer), men den anden havde dokumentation på et passende niveau, dog ikke uden fejl. Denne artikel blev skrevet for at forenkle arbejdet for dem, der står over for en lignende opgave.
Efter at have læst denne artikel vil du lære at lave inkrementelle backups, gemme dem på en ekstern server (repository med backups) og gendanne dem i tilfælde af datatab eller andre problemer på hovedserveren.
Forberedelse
For at reproducere manualen skal du bruge to VPS'er. Den første vil være lageret (repository, hvor backups gemmes), og den anden vil være selve serveren med PostgreSQL (i mit tilfælde version 11 af PostgreSQL).
Det forudsættes, at du har root, sudo-bruger, postgres-bruger og at postgres er installeret på serveren med postgres (postgres-brugeren oprettes automatisk ved installationen af postgresql), og at der på repository-serveren også er root og sudo-bruger (i manualen vil brugernavnet pgbackrest blive brugt).
For at du får færre problemer med at følge instruktionen - skriver jeg kursivt hvor, hvilken bruger og med hvilke rettigheder jeg kørte kommandoen mens jeg skrev og kontrollerede artiklen.
Installation af pgbackrest
Repository (pgbackrest-bruger):
1. Download arkivet med pgbackrest og flyt indholdet 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 /build2. Installer de nødvendige byggeafhængigheder:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev3. Byg pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. Kopier den eksekverbare fil til katalogen /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest5. Pgbackrest kræver, at perl er til stede. Installer:
sudo apt-get install perl6. Opret mapper til logfiler, og giv dem bestemte rettigheder:
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. Kontroller:
pgbackrest versionPostgres-server (sudo-bruger eller root):
Installationsprocessen for pgbackrest på serveren med postgres er ensartet med installationsprocessen på repository (ja, pgbackrest skal være installeret på begge servere), men i punkt 6 skal de anden og sidste kommandoer:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conferstatte med:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confKonfiguration af interaktion mellem serverne via passwordless SSH
For at pgbackrest fungerer korrekt, er det nødvendigt at konfigurere interaktionen mellem postgres-serveren og repository via nøglefilen.
Repository (pgbackrest-bruger):
Opret et nøglepar:
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa
-t rsa -b 4096 -N ""Opmærksomhed! Kommandoerne ovenfor udføres uden sudo.
Postgres-server (sudo-bruger eller root):
Opret et nøglepar:
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-bruger):
Kopier den offentlige nøgle fra postgres-serveren til repository-serveren:
(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_keysPå dette trin vil du blive bedt om root-brugerens adgangskode. Indtast adgangskoden for root-brugeren på PostgreSQL-serveren!
PostgreSQL-server (sudo-bruger):
Vi kopierer den offentlige nøgle fra depotet til serveren med PostgreSQL:
(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
På dette trin vil du blive bedt om root-brugerens adgangskode. Indtast adgangskoden for root-brugeren på depotet!
Vi tjekker:
Depot (root-bruger, for eksperimentets skyld):
sudo -u pgbackrest ssh postgres@PostgreSQL-server (root-bruger, for eksperimentets skyld):
sudo -u postgres ssh pgbackrest@Sørg for, at vi får adgang uden problemer.
Konfiguration af PostgreSQL-serveren
Postgres-server (sudo-bruger eller root):
1. Lad os tillade forbindelser til PostgreSQL-serveren fra eksterne IP-adresser. For dette redigerer vi filen postgresql.conf (som findes i mappen /etc/postgresql/11/main), ved at tilføje følgende linje:
listen_addresses = '*'Hvis en sådan linje allerede findes — enten afkommentér den eller indstil parameterens værdi til '*'.
I filen pg_hba.conf (den findes også i mappen /etc/postgresql/11/main) tilføjer vi følgende linjer:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5hvor:
hostssl/host - forbindes over SSL (eller ej)
all - tillader forbindelse til alle databaser
all - brugernavnet, som vi tillader forbindelse for (alle)
0.0.0.0/0 - netværksmasken fra hvilken forbindelser er tilladt
md5 - metoden til kryptering af adgangskoden2. Lad os foretage de nødvendige indstillinger i postgresql.conf (den findes i mappen /etc/postgresql/11/main) for at arbejde med pgbackrest:
archive_command = 'pgbackrest --stanza=main archive-push %p' # Hvor 'main' er navnet på klyngen. Ved installationen opretter PostgreSQL automatisk klyngen 'main'.
archive_mode = on
max_wal_senders = 3
wal_level = replica3. Lad os foretage de nødvendige indstillinger i pgbackrest konfigurationsfilen (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=4. Genstart PostgreSQL:
sudo service postgresql restartKonfiguration af repository-serveren
Depot (pgbackrest-bruger):
Lad os foretage de nødvendige indstillinger i konfigurationsfilen 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, der angiver hvor mange komplette sikkerhedskopier der skal opbevares. Det vil sige, hvis du har to komplette sikkerhedskopier, og du laver en tredje - vil de første to blive slettet sammen med inkrementerne.
start-fast=y # Starter sikkerhedskopieringen straks, læs om denne parameter her https://postgrespro.ru/docs/postgrespro/9.5/continuous-archivingOprettelse af lager
Depot (pgbackrest-bruger):
Vi opretter et nyt lager til klyngen main:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Kontrol
Postgres-server (sudo-bruger eller root):
Vi kontrollerer på postgres-serveren:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info checkDepot (pgbackrest-bruger):
Vi kontrollerer på lager-serveren:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkVi sikrer os, at vi ser linjen „check command end: completed successfully“ i outputtet.
Trætte? Lad os gå videre til det mere interessante.
Laver backup
Depot (pgbackrest-bruger):
1. Udfører sikkerhedskopiering:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Vi sikrer os, at backup'en er blevet oprettet:
ls /var/lib/pgbackrest/backup/main/Pgbackrest vil oprette den første komplette backup. Hvis du ønsker, kan du køre backup-kommandoen igen og sikre, at systemet vil oprette en inkrementel backup.
Hvis du vil lave en komplet backup igen, skal du angive en ekstra flag:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backupHvis du ønsker detaljeret output i konsollen, skal du også angive:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupGendanner backup
Postgres-server (sudo-bruger eller root):
1. Stopper den kørende klynge:
sudo pg_ctlcluster 11 main stop2. Gendanner fra backup:
sudo -u postgres pgbackrest --stanza=main --delta restore3. Starter klyngen:
sudo pg_ctlcluster 11 main startEfter gendannelse af backup'en skal vi udføre en ny backup:
Depot (pgbackrest-bruger):
sudo pgbackrest --stanza=main backupDet var det. Til slut vil jeg gerne minde om, at jeg på ingen måde prøver at stille mig som senior dba og ved enhver mulighed vil jeg bruge cloud-løsninger. Jeg begynder selv at studere forskellige emner som sikkerhedskopiering, replikation, overvågning osv., og om resultaterne skriver jeg små rapporter for at bidrage lidt til samfundet og efterlade mig nogle små huskesedler.
I de næste artikler vil jeg forsøge at fortælle om ekstra funktioner - gendannelse af data til en ren klynge, kryptering af backups og offentliggørelse på S3, backups via rsync.
Kilde: habr.com
