Pgbackrest kasutamine

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 30. oktoober 2025, kell 03:16 kasutajalt Imre (arutelu | kaastöö) (→‎Timeline)
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

pgbackrest https://github.com/pgbackrest/pgbackrest on C keeles Crunchy Data https://www.crunchydata.com/ poolt arendatud PostgreSQL andmebaasi varundamise tarkvara.

Misc

  • kas pgbackrest abil saab korraldada, et kasutajad saavad ise oma andmeid taastada (nt iga varundatava süsteemi pgbackrest protsess käivitatakse eraldi kasutajaga)
  • varunduse arvutis saab varundustest seise käivitada docker konteinerites (kasutades varundusele vastavat postgresql tarkvara versiooni ja extensionite jms koosseisu)

Tööpõhimõte

pgbackrest saab üldiselt kasutada kahes režiimis
  • lokaalselt - pgbackrest moodustab repo samasse arvutisse kus asuvad varundatavad andmed
  • kaugelt - pgbackrest repo ja varundatav arvuti on erinevad arvutid

Käesolev tekst tegeleb üle võrgu st kaugelt varundamise ja taastega.

     tf-vm-84                 tf-vm-86            tf-vm-87
      _______                  _______             _______
     |       |                |       |           |       |
     |       |                |       |           |       |
     |_______|                |_______|           |_______|
         |                        |                   |
         |                        |                   |
         |                        |                   |
   ------|-------------|----------|-------------------|
                       |
                       |
                    ___|___
                   |       | /var/lib/pgbackrest
                   |       |
                   |_______|

                    tf-vm-85

kus

  • arvutid saavad omavahel suhelda ssh võtmete abil moodustatud usalduse abil

Süsteemide ettevalmistamine

TODO

  • Andmebaas peab muu hulgas olema lähtestatud data-checksums toega, nt
# pg_createcluster --locale et_EE.UTF-8 10 main -- --data-checksums
  • Baasi seadistustes peab olema muu hulgas
root@tf-vm-84:~# grep archive_ /etc/postgresql/10/main/postgresql.conf 
archive_mode = on
archive_command = 'pgbackrest --stanza=db-tf-vm-84 archive-push %p'
  • ssh võtmete genereerimine ja laialijaotamine (varunduse arvutis on vajalik teha vaid üks kord)
varundatav-arvuti$ ssh-keygen
varunduse-arvuti$ ssh-keygen

Paigaldamine

Paigaldamiseks sobib kasutada apt.postgresql.org repot ja öelda nii varundamise kui varundatavas arvutis

# apt-get install curl ca-certificates gnupg2
# curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# cat /etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main

# apt-get update
# apt-get install pgbackrest

Tulemusena paigaldatakse süsteemi lisaks sõltuvustena nt paketid

libgdbm-compat4 libgdbm6 libperl5.28 libpq5 perl perl-modules-5.28 pgbackrest pgdg-keyring postgresql-client-common postgresql-common ssl-cert

ja pgbackrest, mis sisaldab mõnda faili

/usr/bin/pgbackrest - programm
/etc/pgbackrest.conf - peamine seadistusfail

Eraldi kasutajat ei moodustata, tundub, et kõige sobilikum on tegutseda postgres kasutajana.

Varundamise seadistamine

Repo arvutis tuleb moodustada nt seadistusfail /etc/pgbackrest.conf

# cat /etc/pgbackrest.conf
[global]
repo-path=/var/lib/pgbackrest
repo1-retention-full=1
process-max=2
log-level-console=info
log-level-file=debug
start-fast=y
stop-auto=y

[db-primary]
pg1-path=/var/lib/postgresql/10/main
pg1-host=tf-vm-84
pg1-host-user=postgres

ja varundatavas arvutis seadistusfail /etc/pgbackrest.conf

# cat /etc/pgbackrest.conf
[global]
repo1-host=tf-vm-85
repo1-path=/var/lib/pgbackrest
repo1-host-user=postgres
process-max=2
log-level-console=info
log-level-file=debug

[db-primary]
pg1-path=/var/lib/postgresql/10/main

Varundamine

Varundamiseks sobib repo arvutis öelda nt

$ pgbackrest --stanza=db-tf-vm-84 stanza-create
$ pgbackrest --stanza=db-primary backup
$ pgbackrest --stanza=db-primary --type=full backup
$ pgbackrest --stanza=db-primary info

Taaste

Taastamiseks sobib varundatavas arvutis öelda nt (või ilma --delta suvandita)

$ pgbackrest --stanza=db-primary --delta restore

Varundusest eemaldamine

TODO

$ pgbackrest --stanza=db-primary stop
$ pgbackrest --stanza=db-primary stanza-delete --force

Vanade varunduste eemaldamine

Tavaliselt toimub see järgmise varunduse käigus automaatselt, aga seda saab ka käsitsi esile kutsuda, nt

  • pgbackrest töötamise põhimõttest tingituna ei saa vahepealseid varundusi eemaldada, saab eemalda suuremal või vähemal määral järjestikulist vanemat otsa
  • veenduda, et regulaarne varundamine on välja lülitatud ajutiselt (nt cron töö)
  • vähendada pgbackrest.conf seadistusfailis retention suurust sobivaks (nii, et tabatakse sobivat hulka vanu varundusi)
  • kustutada mida tabataks
$ pgbackrest --config /etc/pgbackrest.conf --stanza=pgcluster_13_main_toodang --dry-run expire
$ pgbackrest --config /etc/pgbackrest.conf --stanza=pgcluster_13_main_toodang expire
  • seadistada tagasi retention sobiv suurus

Integreerimine muu varundusega

Kui üldiselt on kasutuses nt Data Protector tarkvara, siis võiks korraldada kahe tasemelise varundamise

  • pgbackrest varundab varunduse arvuti failisüsteemi HP DP mõttes 1st stage varunduse
  • data protector kirjutab 1st stage varundust failisüsteemist 2nd stage varunduseks linti

Kasulikud lisamaterjalid

Timeline

PostgreSQL timeline on varundamisega tegelemisel väga oluline kontseptsioon

  • üks postgresql andmebaas st teenus ning temaga tegelev pgbackrest varundus viibivad ühel ajahetkel nö ühes ja samas kohas, st nad toimetavad kooskõlaliselt
  • kui mingeid nö segajaid ei ole (nt äsja ei ole taastatud andmebaasi varundusest), siis postgresqli baasi ja tema pgbackrest varundus nö kulgevad ühtlaselt ajas edasi
  • postgresqli baasil ja pgbackrest varundusel on võimekus hallata erinevaid kombinatsioone töötavast baasist ja tema varundusest
  • wal logi kuulub alati mingi ja ainult ühe timeline juurde
  • ühe absoluutse ajahetke taasteni ühest konkreetselt full varundusest viib ainult üks tee mööda timeline'isid (ja seotud wal failisid)

Näide töötava baasi ja varunduse nö kombinatsioonidest

  • alguses käivitati baas ja temast tehti esimene varundus - öeldakse, et süsteem toimib 'timeline 1' peal
  • baasi kasutatakse - hakatakse andmeid sisestama ja varundusse kopeeritakse järjest uusi timeline-1 seotud wal faile
  • seejärel baas taastati varundusest - öeldakse, et süsteem toimib 'timeline 2' peal
  • seejärel taastatud baas varundati - varunduses on nüüd timeline-1 ja timeline-2 variatsioonid full backupid + neile vastavad wal failid
  • seejärel baas taastati varundusest üsna käivitamise järgse puhta seisuga - öeldakse, et süsteem toimib 'timeline 3' peal
  • baas töötab ja wal logid liiguvad pgbackrest varundusse, aga nende wal logide juures on märge timeline-3 peale kuulumise kohta
  • ja taastatud baasi varundatakse - varunduses on nüüd kokku timeline-1, timeline-2 ja timeline-3 variatsioonid + vastavad wal failide komplektid

Kui sellisesse olekusse saabunud baasi taastada viimasele varundusele eelnevale ajahetkele, siis

  • taasteks on ainumõeldav kasutada timeline-1 varundusest alates, ja ühel hetkel liigub wal logide kasutamine timeline-3 peale - timeline-2 osakond jääb üldse vahele kuna ta ei puutu asjasse (timeline-3 seisukohast on tegu kõrvalharuga)
  • peale taastet toimetatakse timeline-4 peal

Käesoleva timeline väärtuse küsimine, vastus on '3'

postgres=# select pg_walfile_name(pg_current_wal_lsn());
     pg_walfile_name
--------------------------
 00000003000000000000006B
(1 row)

Milliseid wal logisid taastes kasutati

# grep "pg_wal/RECOVERYXLOG" /var/log/postgresql/postgresql-16-main.log | sed -r 's/exec-id.*//' | grep 03:1
2025-10-30 03:13:23.407 P00   INFO: archive-get command begin 2.56.0: [00000006000000000000006A, pg_wal/RECOVERYXLOG] --
2025-10-30 03:13:23.545 P00   INFO: archive-get command begin 2.56.0: [00000006000000000000006B, pg_wal/RECOVERYXLOG] --
#

Märkused

  • kui andmebaasist hoitakse erinevatele timeline'idele vastavaid eksemplare, siis vist teoreetiliselt saab neid varundada vastu ühte ja sama pgbackrest varundust (kuna erinevate timeline'ide wal failide kohta hoitakse iseseisvalt järge)

Minio

# cat /etc/pgbackrest.conf
[global]
repo1-type=s3
repo1-s3-endpoint=s3-by-minio.moraal.ee:9000
repo1-s3-uri-style=path
repo1-s3-region=trt
repo1-path=/path-project-test-pgbackrest-1
repo1-s3-bucket=bucket-division-project-test
repo1-s3-key=key-division-project-test
repo1-s3-key-secret=keysecret-parool

repo1-retention-full=3
repo1-retention-diff=7

process-max=2
log-level-console=info
log-level-file=info

[pg_16]
pg1-path=/var/lib/postgresql/16/main

Käsundamine

mc alias set pgrepotest https://s3-by-minio.moraal.ee:9000 key-division-project-test keysecret-parool

# mc ls pgrepotest/bucket-division-project-test/path-project-test-pgbackrest-1
[2025-10-30 00:56:02 EET]     0B archive/
[2025-10-30 00:56:02 EET]     0B backup/

# mc cp --recursive pgrepotest/bucket-division-project-test/path-project-test-pgbackrest-1 local-path-project-test-pgbackrest-1

# mc rm --recursive --force pgrepotest/bucket-division-project-test/path-project-test-pgbackrest-1/archive
# mc rm --recursive --force pgrepotest/bucket-division-project-test/path-project-test-pgbackrest-1/backup